Stanford Parser dan NLTK

90

Apakah mungkin menggunakan Stanford Parser di NLTK? (Saya tidak berbicara tentang Stanford POS.)

ThanaDaray
sumber
3
Tautan ini harus lebih terlihat. Mungkin jawaban teratas harus diedit untuk menyebutkan ini?
Lalo Sánchez
1
Sekadar catatan di sini guys. Pastikan Java Anda sudah diperbarui untuk Stanford NLP dan JAVA_HOME disiapkan dengan benar. Terkadang orang mungkin mendapatkan kesalahan "aneh" yang mungkin disebabkan oleh hal ini.
Meng Zhao
Untuk NLTK v3.3, lihat stackoverflow.com/a/51981566/610569
alvas

Jawaban:

89

Perhatikan bahwa jawaban ini berlaku untuk NLTK v 3.0, dan tidak untuk versi yang lebih baru.

Tentu, coba yang berikut ini dengan Python:

import os
from nltk.parse import stanford
os.environ['STANFORD_PARSER'] = '/path/to/standford/jars'
os.environ['STANFORD_MODELS'] = '/path/to/standford/jars'

parser = stanford.StanfordParser(model_path="/location/of/the/englishPCFG.ser.gz")
sentences = parser.raw_parse_sents(("Hello, My name is Melroy.", "What is your name?"))
print sentences

# GUI
for line in sentences:
    for sentence in line:
        sentence.draw()

Keluaran:

[Pohon ('ROOT', [Pohon ('S', [Pohon ('INTJ', [Pohon ('UH', ['Halo'])]), Pohon (',', [',']), Pohon ('NP', [Tree ('PRP $', ['My']), Tree ('NN', ['name'])]), Tree ('VP', [Tree ('VBZ', [ 'adalah']), Pohon ('ADJP', [Pohon ('JJ', ['Melroy'])])]), Pohon ('.', ['.'])])]), Pohon (' ROOT ', [Pohon (' SBARQ ', [Pohon (' WHNP ', [Pohon (' WP ', [' Apa '])]), Pohon (' SQ ', [Pohon (' VBZ ', [' adalah ' ]), Pohon ('NP', [Pohon ('PRP $', ['milikmu']), Pohon ('NN', ['nama'])])]), Pohon ('.', ['? '])])])]

Catatan 1: Dalam contoh ini, parser & model jars berada dalam folder yang sama.

Catatan 2:

  • Nama file dari stanford parser adalah: stanford-parser.jar
  • Nama file dari stanford models adalah: stanford-parser-xxx-models.jar

Catatan 3: File englishPCFG.ser.gz dapat ditemukan di dalam file models.jar (/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz). Silakan gunakan come archive manager untuk 'unzip' file models.jar.

Catatan 4: Pastikan Anda menggunakan Java JRE (Runtime Environment) 1.8 juga dikenal sebagai Oracle JDK 8. Jika tidak, Anda akan mendapatkan: Versi mayor.minor yang tidak didukung 52.0.

Instalasi

  1. Unduh NLTK v3 dari: https://github.com/nltk/nltk . Dan instal NLTK:

    sudo python setup.py install

  2. Anda dapat menggunakan pengunduh NLTK untuk mendapatkan Stanford Parser, menggunakan Python:

    import nltk
    nltk.download()
    
  3. Coba contoh saya! (jangan lupa ubah jalur jar dan ubah jalur model ke lokasi ser.gz)

ATAU:

  1. Unduh dan instal NLTK v3, sama seperti di atas.

  2. Unduh versi terbaru dari ( nama file versi saat ini adalah stanford-parser-full-2015-01-29.zip): http://nlp.stanford.edu/software/lex-parser.shtml#Download

  3. Ekstrak file standford-parser-full-20xx-xx-xx.zip.

  4. Buat folder baru ('jars' dalam contoh saya). Tempatkan file yang diekstrak ke dalam folder jar ini: stanford-parser-3.xx-models.jar dan stanford-parser.jar.

    Seperti yang ditunjukkan di atas, Anda dapat menggunakan variabel lingkungan (STANFORD_PARSER & STANFORD_MODELS) untuk mengarahkan ke folder 'jars' ini. Saya menggunakan Linux, jadi jika Anda menggunakan Windows, gunakan sesuatu seperti: C: // folder // jars.

  5. Buka stanford-parser-3.xx-models.jar menggunakan Manajer arsip (7zip).

  6. Jelajahi di dalam file jar; edu / stanford / nlp / models / lexparser. Sekali lagi, ekstrak file bernama 'englishPCFG.ser.gz'. Ingat lokasi tempat Anda mengekstrak file ser.gz ini.

  7. Saat membuat instance StanfordParser, Anda dapat memberikan jalur model sebagai parameter. Ini adalah jalur lengkap ke model, dalam kasus kami /location/of/englishPCFG.ser.gz.

  8. Coba contoh saya! (jangan lupa ubah jalur jar dan ubah jalur model ke lokasi ser.gz)

bahaya89
sumber
1
Versi nltk mana yang ditambahkan nltk.parse.stanford? Saya hanya ada nltk.tag.stanforddi NLTK 2.0.4.
alexis
1
AttributeError: 'StanfordParser' object has no attribute 'raw_batch_parse'
Nick Retallack
5
@alexis: unduh nltk 3.0 dari sini @Nick Retallack: harus diubah menjadiraw_parse_sents()
Rasika Perera
1
Oke, kamu benar. NLTK mengubah fungsinya menjadi: raw_parse_sents (). Lihat Dokumentasi: nltk.org/_modules/nltk/parse/stanford.html Jika Anda menggunakan raw_parse () Anda akan mengambil iter (Pohon) sebagai nilai yang dikembalikan. Artinya sampel draw () di atas harus berfungsi. Jika Anda menggunakan raw_parse_sents (), Anda membutuhkan loop ganda; itu mengembalikan sebuah iter (iter (Tree)). Jadi contoh kode: for line in sentences: for sentence in line: sentence.draw() Anda hanya dapat mengeksekusi draw () pada objek Tree;)
hazard89
1
@ hazard89, maaf telah menimpa jawaban Anda dengan catatan yang DIEDIT. Baru-baru ini orang telah mengeluh tentang parser Ketergantungan Stanford baru-baru ini ditambahkan sejak NLTK v3.1 dan saya pikir mereka menduplikasi beberapa cuplikan kode di sana-sini dari jawaban yang tidak berlaku lagi di sini. Jadi untuk meminimalkan kebingungan, saya pikir yang terbaik adalah menambahkan penafian ke semua jawaban di sini sehubungan dengan mengikuti instruksi dari NLTK official 3rd party toolsdokumentasi.
alvas
77

Jawaban yang Tidak Berlaku Lagi

Jawaban di bawah tidak berlaku lagi, gunakan solusi di https://stackoverflow.com/a/51981566/610569 untuk NLTK v3.3 dan yang lebih baru.


DIEDIT

Catatan: Jawaban berikut hanya akan berfungsi:

  • Versi NLTK> = 3.2.4
  • Stanford Tools dikompilasi sejak 2015-04-20
  • Python 2.7, 3.4 dan 3.5 (Python 3.6 belum didukung secara resmi)

Karena kedua alat berubah agak cepat dan API mungkin terlihat sangat berbeda 3-6 bulan kemudian. Mohon perlakukan jawaban berikut sebagai sementara dan bukan sebagai solusi abadi.

Selalu merujuk ke https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software untuk instruksi terbaru tentang cara menghubungkan alat Stanford NLP menggunakan NLTK !!


TL; DR

cd $HOME

# Update / Install NLTK
pip install -U nltk

# Download the Stanford NLP tools
wget http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip
wget http://nlp.stanford.edu/software/stanford-postagger-full-2015-04-20.zip
wget http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip
# Extract the zip file.
unzip stanford-ner-2015-04-20.zip 
unzip stanford-parser-full-2015-04-20.zip 
unzip stanford-postagger-full-2015-04-20.zip


export STANFORDTOOLSDIR=$HOME

export CLASSPATH=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/stanford-postagger.jar:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/stanford-ner.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar

export STANFORD_MODELS=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/models:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/classifiers

Kemudian:

>>> from nltk.tag.stanford import StanfordPOSTagger
>>> st = StanfordPOSTagger('english-bidirectional-distsim.tagger')
>>> st.tag('What is the airspeed of an unladen swallow ?'.split())
[(u'What', u'WP'), (u'is', u'VBZ'), (u'the', u'DT'), (u'airspeed', u'NN'), (u'of', u'IN'), (u'an', u'DT'), (u'unladen', u'JJ'), (u'swallow', u'VB'), (u'?', u'.')]

>>> from nltk.tag import StanfordNERTagger
>>> st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz') 
>>> st.tag('Rami Eid is studying at Stony Brook University in NY'.split())
[(u'Rami', u'PERSON'), (u'Eid', u'PERSON'), (u'is', u'O'), (u'studying', u'O'), (u'at', u'O'), (u'Stony', u'ORGANIZATION'), (u'Brook', u'ORGANIZATION'), (u'University', u'ORGANIZATION'), (u'in', u'O'), (u'NY', u'O')]


>>> from nltk.parse.stanford import StanfordParser
>>> parser=StanfordParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")
>>> list(parser.raw_parse("the quick brown fox jumps over the lazy dog"))
[Tree('ROOT', [Tree('NP', [Tree('NP', [Tree('DT', ['the']), Tree('JJ', ['quick']), Tree('JJ', ['brown']), Tree('NN', ['fox'])]), Tree('NP', [Tree('NP', [Tree('NNS', ['jumps'])]), Tree('PP', [Tree('IN', ['over']), Tree('NP', [Tree('DT', ['the']), Tree('JJ', ['lazy']), Tree('NN', ['dog'])])])])])])]

>>> from nltk.parse.stanford import StanfordDependencyParser
>>> dep_parser=StanfordDependencyParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")
>>> print [parse.tree() for parse in dep_parser.raw_parse("The quick brown fox jumps over the lazy dog.")]
[Tree('jumps', [Tree('fox', ['The', 'quick', 'brown']), Tree('dog', ['over', 'the', 'lazy'])])]

Panjang:


Pertama , kita harus mencatat bahwa alat Stanford NLP ditulis dalam Java dan NLTK ditulis dengan Python . Cara NLTK menghubungkan alat ini melalui panggilan alat Java melalui antarmuka baris perintah.

Kedua , NLTKAPI ke alat Stanford NLP telah berubah cukup banyak sejak versi 3.1. Jadi disarankan untuk memperbarui paket NLTK Anda ke v3.1.

Ketiga , para NLTKAPI untuk Stanford NLP Alat membungkus di sekitar alat NLP individu, misalnya Stanford POS tagger , Stanford NER Tagger , Stanford Parser .

Untuk tagger POS dan NER, ini TIDAK membungkus paket Stanford Core NLP .

Untuk Stanford Parser, ini adalah kasus khusus yang membungkus Stanford Parser dan Stanford Core NLP (secara pribadi, saya belum menggunakan yang terakhir menggunakan NLTK, saya lebih suka mengikuti demonstrasi @ dimazest di http: //www.eecs. qmul.ac.uk/~dm303/stanford-dependency-parser-nltk-and-anaconda.html )

Perhatikan bahwa pada NLTK v3.1, yang STANFORD_JARdan STANFORD_PARSERvariabel sudah ditinggalkan dan TIDAK LAGI digunakan


Lebih Lama:


LANGKAH 1

Dengan asumsi Anda telah menginstal Java dengan benar di OS Anda.

Sekarang, instal / perbarui versi NLTK Anda (lihat http://www.nltk.org/install.html ):

  • Menggunakan pip :sudo pip install -U nltk
  • Distro Debian (menggunakan apt-get):sudo apt-get install python-nltk

Untuk Windows (Gunakan penginstalan biner 32-bit):

  1. Instal Python 3.4: http://www.python.org/downloads/ (hindari versi 64-bit)
  2. Instal Numpy (opsional): http://sourceforge.net/projects/numpy/files/NumPy/ (versi yang menentukan pythnon3.4)
  3. Instal NLTK: http://pypi.python.org/pypi/nltk
  4. Uji penginstalan: Mulai> Python34, lalu ketik import nltk

( Mengapa tidak 64 bit? Lihat https://github.com/nltk/nltk/issues/1079 )


Kemudian keluar dari paranoia, periksa kembali nltkversi Anda di dalam python:

from __future__ import print_function
import nltk
print(nltk.__version__)

Atau di baris perintah:

python3 -c "import nltk; print(nltk.__version__)"

Pastikan Anda melihat 3.1hasilnya.

Untuk lebih banyak paranoia, periksa apakah semua alat API Stanford NLP favorit Anda tersedia:

from nltk.parse.stanford import StanfordParser
from nltk.parse.stanford import StanfordDependencyParser
from nltk.parse.stanford import StanfordNeuralDependencyParser
from nltk.tag.stanford import StanfordPOSTagger, StanfordNERTagger
from nltk.tokenize.stanford import StanfordTokenizer

( Catatan : Impor di atas HANYA akan memastikan bahwa Anda menggunakan versi NLTK yang benar yang berisi API ini. Tidak melihat kesalahan dalam impor bukan berarti Anda telah berhasil mengkonfigurasi API NLTK untuk menggunakan Alat Stanford)


LANGKAH 2

Sekarang Anda telah memeriksa bahwa Anda memiliki versi NLTK yang benar yang berisi antarmuka alat NLP Stanford yang diperlukan. Anda perlu mengunduh dan mengekstrak semua alat Stanford NLP yang diperlukan.

TL; DR , di Unix:

cd $HOME

# Download the Stanford NLP tools
wget http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip
wget http://nlp.stanford.edu/software/stanford-postagger-full-2015-04-20.zip
wget http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip
# Extract the zip file.
unzip stanford-ner-2015-04-20.zip 
unzip stanford-parser-full-2015-04-20.zip 
unzip stanford-postagger-full-2015-04-20.zip

Di Windows / Mac:


LANGKAH 3

Atur variabel lingkungan sedemikian rupa sehingga NLTK dapat menemukan jalur file yang relevan secara otomatis. Anda harus mengatur variabel berikut:

  • Tambahkan .jarfile Stanford NLP yang sesuai ke CLASSPATHvariabel lingkungan.

    • misalnya untuk NER, itu akan stanford-ner-2015-04-20/stanford-ner.jar
    • misalnya untuk POS, itu akan stanford-postagger-full-2015-04-20/stanford-postagger.jar
    • misalnya untuk parser, itu akan menjadi stanford-parser-full-2015-04-20/stanford-parser.jardan file jar model parser,stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
  • Tambahkan direktori model yang sesuai ke STANFORD_MODELSvariabel (yaitu direktori tempat Anda dapat menemukan tempat penyimpanan model terlatih)

    • misalnya untuk NER, itu akan masuk stanford-ner-2015-04-20/classifiers/
    • misal untuk POS, maka akan masuk stanford-postagger-full-2015-04-20/models/
    • misalnya untuk Parser, tidak akan ada direktori model.

Di dalam kode, lihat bahwa ia mencari STANFORD_MODELSdirektori sebelum menambahkan nama model. Juga lihat itu, API juga secara otomatis mencoba mencari lingkungan OS untuk `CLASSPATH )

Perhatikan bahwa pada NLTK v3.1, STANFORD_JARvariabel tidak digunakan lagi dan TIDAK LAGI digunakan . Cuplikan kode yang ditemukan dalam pertanyaan Stackoverflow berikut mungkin tidak berfungsi:

TL; DR untuk LANGKAH 3 di Ubuntu

export STANFORDTOOLSDIR=/home/path/to/stanford/tools/

export CLASSPATH=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/stanford-postagger.jar:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/stanford-ner.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar

export STANFORD_MODELS=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/models:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/classifiers

( Untuk Windows : Lihat https://stackoverflow.com/a/17176423/610569 untuk petunjuk pengaturan variabel lingkungan)

Anda HARUS mengatur variabel seperti di atas sebelum memulai python, lalu:

>>> from nltk.tag.stanford import StanfordPOSTagger
>>> st = StanfordPOSTagger('english-bidirectional-distsim.tagger')
>>> st.tag('What is the airspeed of an unladen swallow ?'.split())
[(u'What', u'WP'), (u'is', u'VBZ'), (u'the', u'DT'), (u'airspeed', u'NN'), (u'of', u'IN'), (u'an', u'DT'), (u'unladen', u'JJ'), (u'swallow', u'VB'), (u'?', u'.')]

>>> from nltk.tag import StanfordNERTagger
>>> st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz') 
>>> st.tag('Rami Eid is studying at Stony Brook University in NY'.split())
[(u'Rami', u'PERSON'), (u'Eid', u'PERSON'), (u'is', u'O'), (u'studying', u'O'), (u'at', u'O'), (u'Stony', u'ORGANIZATION'), (u'Brook', u'ORGANIZATION'), (u'University', u'ORGANIZATION'), (u'in', u'O'), (u'NY', u'O')]


>>> from nltk.parse.stanford import StanfordParser
>>> parser=StanfordParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")
>>> list(parser.raw_parse("the quick brown fox jumps over the lazy dog"))
[Tree('ROOT', [Tree('NP', [Tree('NP', [Tree('DT', ['the']), Tree('JJ', ['quick']), Tree('JJ', ['brown']), Tree('NN', ['fox'])]), Tree('NP', [Tree('NP', [Tree('NNS', ['jumps'])]), Tree('PP', [Tree('IN', ['over']), Tree('NP', [Tree('DT', ['the']), Tree('JJ', ['lazy']), Tree('NN', ['dog'])])])])])])]

Atau, Anda dapat mencoba menambahkan variabel lingkungan di dalam python, seperti yang disarankan oleh jawaban sebelumnya, tetapi Anda juga dapat langsung memberi tahu parser / tagger untuk menginisialisasi ke jalur langsung tempat Anda menyimpan .jarfile dan model Anda.

TIDAK perlu menyetel variabel lingkungan jika Anda menggunakan metode berikut TETAPI ketika API mengubah nama parameternya, Anda perlu mengubahnya. Itulah mengapa LEBIH disarankan untuk mengatur variabel lingkungan daripada memodifikasi kode python Anda agar sesuai dengan versi NLTK.

Misalnya ( tanpa menetapkan variabel lingkungan apa pun ):

# POS tagging:

from nltk.tag import StanfordPOSTagger

stanford_pos_dir = '/home/alvas/stanford-postagger-full-2015-04-20/'
eng_model_filename= stanford_pos_dir + 'models/english-left3words-distsim.tagger'
my_path_to_jar= stanford_pos_dir + 'stanford-postagger.jar'

st = StanfordPOSTagger(model_filename=eng_model_filename, path_to_jar=my_path_to_jar) 
st.tag('What is the airspeed of an unladen swallow ?'.split())


# NER Tagging:
from nltk.tag import StanfordNERTagger

stanford_ner_dir = '/home/alvas/stanford-ner/'
eng_model_filename= stanford_ner_dir + 'classifiers/english.all.3class.distsim.crf.ser.gz'
my_path_to_jar= stanford_ner_dir + 'stanford-ner.jar'

st = StanfordNERTagger(model_filename=eng_model_filename, path_to_jar=my_path_to_jar) 
st.tag('Rami Eid is studying at Stony Brook University in NY'.split())

# Parsing:
from nltk.parse.stanford import StanfordParser

stanford_parser_dir = '/home/alvas/stanford-parser/'
eng_model_path = stanford_parser_dir  + "edu/stanford/nlp/models/lexparser/englishRNN.ser.gz"
my_path_to_models_jar = stanford_parser_dir  + "stanford-parser-3.5.2-models.jar"
my_path_to_jar = stanford_parser_dir  + "stanford-parser.jar"

parser=StanfordParser(model_path=eng_model_path, path_to_models_jar=my_path_to_models_jar, path_to_jar=my_path_to_jar)
alva
sumber
22

Jawaban yang Tidak Berlaku Lagi

Jawaban di bawah tidak berlaku lagi, gunakan solusi di https://stackoverflow.com/a/51981566/610569 untuk NLTK v3.3 dan yang lebih baru.


Diedit

Pada parser Stanford saat ini (2015-04-20), keluaran default untuk lexparser.shtelah berubah sehingga skrip di bawah ini tidak akan berfungsi.

Namun jawaban ini disimpan demi warisan, namun tetap akan berfungsi dengan http://nlp.stanford.edu/software/stanford-parser-2012-11-12.zip .


Jawaban Asli

Saya sarankan Anda tidak main-main dengan Jython, JPype. Biarkan python melakukan hal-hal python dan biarkan java melakukan hal-hal java, dapatkan keluaran Stanford Parser melalui konsol.

Setelah Anda menginstal Parser Stanford di direktori home Anda ~/, cukup gunakan resep python ini untuk mendapatkan parse kurung datar:

import os
sentence = "this is a foo bar i want to parse."

os.popen("echo '"+sentence+"' > ~/stanfordtemp.txt")
parser_out = os.popen("~/stanford-parser-2012-11-12/lexparser.sh ~/stanfordtemp.txt").readlines()

bracketed_parse = " ".join( [i.strip() for i in parser_out if i.strip()[0] == "("] )
print bracketed_parse
alva
sumber
1
Ini berfungsi untuk saya kecuali saya perlu menambahkan kondisi untuk memeriksa len(i.strip()) > 0jika tidak saya mendapat kesalahan indeks. Saya kira keluaran parser saya memiliki setidaknya satu baris yang murni spasi.
aelfric5578
1
alternatif, menggunakan ini wrapper python alat bantu corenlp Stanford, bitbucket.org/torotoki/corenlp-python
alvas
3
Hati-hati dengan ini. Jika masukan Anda berisi 's, Anda akan mendapatkan beberapa kesalahan aneh. Ada cara yang lebih baik untuk memanggil sesuatu pada baris perintah
Nick Garvey
21

Mulai NLTK v3.3, pengguna harus menghindari penandaan Stanford NER atau POS nltk.tag, dan menghindari Stanford tokenizer / segmenter dari nltk.tokenize.

Alih-alih gunakan nltk.parse.corenlp.CoreNLPParserAPI baru .

Silakan lihat https://github.com/nltk/nltk/wiki/Stanford-CoreNLP-API-in-NLTK


(Menghindari jawaban hanya tautan, saya telah menempelkan dokumen dari NLTK github wiki di bawah)

Pertama, perbarui NLTK Anda

pip3 install -U nltk # Make sure is >=3.3

Kemudian unduh paket CoreNLP yang diperlukan:

cd ~
wget http://nlp.stanford.edu/software/stanford-corenlp-full-2018-02-27.zip
unzip stanford-corenlp-full-2018-02-27.zip
cd stanford-corenlp-full-2018-02-27

# Get the Chinese model 
wget http://nlp.stanford.edu/software/stanford-chinese-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-chinese.properties 

# Get the Arabic model
wget http://nlp.stanford.edu/software/stanford-arabic-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-arabic.properties 

# Get the French model
wget http://nlp.stanford.edu/software/stanford-french-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-french.properties 

# Get the German model
wget http://nlp.stanford.edu/software/stanford-german-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-german.properties 


# Get the Spanish model
wget http://nlp.stanford.edu/software/stanford-spanish-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-spanish.properties 

Inggris

Masih di stanford-corenlp-full-2018-02-27direktori, mulai server:

java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-preload tokenize,ssplit,pos,lemma,ner,parse,depparse \
-status_port 9000 -port 9000 -timeout 15000 & 

Kemudian dengan Python:

>>> from nltk.parse import CoreNLPParser

# Lexical Parser
>>> parser = CoreNLPParser(url='http://localhost:9000')

# Parse tokenized text.
>>> list(parser.parse('What is the airspeed of an unladen swallow ?'.split()))
[Tree('ROOT', [Tree('SBARQ', [Tree('WHNP', [Tree('WP', ['What'])]), Tree('SQ', [Tree('VBZ', ['is']), Tree('NP', [Tree('NP', [Tree('DT', ['the']), Tree('NN', ['airspeed'])]), Tree('PP', [Tree('IN', ['of']), Tree('NP', [Tree('DT', ['an']), Tree('JJ', ['unladen'])])]), Tree('S', [Tree('VP', [Tree('VB', ['swallow'])])])])]), Tree('.', ['?'])])])]

# Parse raw string.
>>> list(parser.raw_parse('What is the airspeed of an unladen swallow ?'))
[Tree('ROOT', [Tree('SBARQ', [Tree('WHNP', [Tree('WP', ['What'])]), Tree('SQ', [Tree('VBZ', ['is']), Tree('NP', [Tree('NP', [Tree('DT', ['the']), Tree('NN', ['airspeed'])]), Tree('PP', [Tree('IN', ['of']), Tree('NP', [Tree('DT', ['an']), Tree('JJ', ['unladen'])])]), Tree('S', [Tree('VP', [Tree('VB', ['swallow'])])])])]), Tree('.', ['?'])])])]

# Neural Dependency Parser
>>> from nltk.parse.corenlp import CoreNLPDependencyParser
>>> dep_parser = CoreNLPDependencyParser(url='http://localhost:9000')
>>> parses = dep_parser.parse('What is the airspeed of an unladen swallow ?'.split())
>>> [[(governor, dep, dependent) for governor, dep, dependent in parse.triples()] for parse in parses]
[[(('What', 'WP'), 'cop', ('is', 'VBZ')), (('What', 'WP'), 'nsubj', ('airspeed', 'NN')), (('airspeed', 'NN'), 'det', ('the', 'DT')), (('airspeed', 'NN'), 'nmod', ('swallow', 'VB')), (('swallow', 'VB'), 'case', ('of', 'IN')), (('swallow', 'VB'), 'det', ('an', 'DT')), (('swallow', 'VB'), 'amod', ('unladen', 'JJ')), (('What', 'WP'), 'punct', ('?', '.'))]]


# Tokenizer
>>> parser = CoreNLPParser(url='http://localhost:9000')
>>> list(parser.tokenize('What is the airspeed of an unladen swallow?'))
['What', 'is', 'the', 'airspeed', 'of', 'an', 'unladen', 'swallow', '?']

# POS Tagger
>>> pos_tagger = CoreNLPParser(url='http://localhost:9000', tagtype='pos')
>>> list(pos_tagger.tag('What is the airspeed of an unladen swallow ?'.split()))
[('What', 'WP'), ('is', 'VBZ'), ('the', 'DT'), ('airspeed', 'NN'), ('of', 'IN'), ('an', 'DT'), ('unladen', 'JJ'), ('swallow', 'VB'), ('?', '.')]

# NER Tagger
>>> ner_tagger = CoreNLPParser(url='http://localhost:9000', tagtype='ner')
>>> list(ner_tagger.tag(('Rami Eid is studying at Stony Brook University in NY'.split())))
[('Rami', 'PERSON'), ('Eid', 'PERSON'), ('is', 'O'), ('studying', 'O'), ('at', 'O'), ('Stony', 'ORGANIZATION'), ('Brook', 'ORGANIZATION'), ('University', 'ORGANIZATION'), ('in', 'O'), ('NY', 'STATE_OR_PROVINCE')]

Cina

Mulai server sedikit berbeda, masih dari direktori `stanford-corenlp-full-2018-02-27:

java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-serverProperties StanfordCoreNLP-chinese.properties \
-preload tokenize,ssplit,pos,lemma,ner,parse \
-status_port 9001  -port 9001 -timeout 15000

Dengan Python:

>>> parser = CoreNLPParser('http://localhost:9001')
>>> list(parser.tokenize(u'我家没有电脑。'))
['我家', '没有', '电脑', '。']

>>> list(parser.parse(parser.tokenize(u'我家没有电脑。')))
[Tree('ROOT', [Tree('IP', [Tree('IP', [Tree('NP', [Tree('NN', ['我家'])]), Tree('VP', [Tree('VE', ['没有']), Tree('NP', [Tree('NN', ['电脑'])])])]), Tree('PU', ['。'])])])]

Arab

Mulai server:

java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-serverProperties StanfordCoreNLP-arabic.properties \
-preload tokenize,ssplit,pos,parse \
-status_port 9005  -port 9005 -timeout 15000

Dengan Python:

>>> from nltk.parse import CoreNLPParser
>>> parser = CoreNLPParser('http://localhost:9005')
>>> text = u'انا حامل'

# Parser.
>>> parser.raw_parse(text)
<list_iterator object at 0x7f0d894c9940>
>>> list(parser.raw_parse(text))
[Tree('ROOT', [Tree('S', [Tree('NP', [Tree('PRP', ['انا'])]), Tree('NP', [Tree('NN', ['حامل'])])])])]
>>> list(parser.parse(parser.tokenize(text)))
[Tree('ROOT', [Tree('S', [Tree('NP', [Tree('PRP', ['انا'])]), Tree('NP', [Tree('NN', ['حامل'])])])])]

# Tokenizer / Segmenter.
>>> list(parser.tokenize(text))
['انا', 'حامل']

# POS tagg
>>> pos_tagger = CoreNLPParser('http://localhost:9005', tagtype='pos')
>>> list(pos_tagger.tag(parser.tokenize(text)))
[('انا', 'PRP'), ('حامل', 'NN')]


# NER tag
>>> ner_tagger = CoreNLPParser('http://localhost:9005', tagtype='ner')
>>> list(ner_tagger.tag(parser.tokenize(text)))
[('انا', 'O'), ('حامل', 'O')]

Perancis

Mulai server:

java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-serverProperties StanfordCoreNLP-french.properties \
-preload tokenize,ssplit,pos,parse \
-status_port 9004  -port 9004 -timeout 15000

Dengan Python:

>>> parser = CoreNLPParser('http://localhost:9004')
>>> list(parser.parse('Je suis enceinte'.split()))
[Tree('ROOT', [Tree('SENT', [Tree('NP', [Tree('PRON', ['Je']), Tree('VERB', ['suis']), Tree('AP', [Tree('ADJ', ['enceinte'])])])])])]
>>> pos_tagger = CoreNLPParser('http://localhost:9004', tagtype='pos')
>>> pos_tagger.tag('Je suis enceinte'.split())
[('Je', 'PRON'), ('suis', 'VERB'), ('enceinte', 'ADJ')]

Jerman

Mulai server:

java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-serverProperties StanfordCoreNLP-german.properties \
-preload tokenize,ssplit,pos,ner,parse \
-status_port 9002  -port 9002 -timeout 15000

Dengan Python:

>>> parser = CoreNLPParser('http://localhost:9002')
>>> list(parser.raw_parse('Ich bin schwanger'))
[Tree('ROOT', [Tree('NUR', [Tree('S', [Tree('PPER', ['Ich']), Tree('VAFIN', ['bin']), Tree('AP', [Tree('ADJD', ['schwanger'])])])])])]
>>> list(parser.parse('Ich bin schwanger'.split()))
[Tree('ROOT', [Tree('NUR', [Tree('S', [Tree('PPER', ['Ich']), Tree('VAFIN', ['bin']), Tree('AP', [Tree('ADJD', ['schwanger'])])])])])]


>>> pos_tagger = CoreNLPParser('http://localhost:9002', tagtype='pos')
>>> pos_tagger.tag('Ich bin schwanger'.split())
[('Ich', 'PPER'), ('bin', 'VAFIN'), ('schwanger', 'ADJD')]

>>> pos_tagger = CoreNLPParser('http://localhost:9002', tagtype='pos')
>>> pos_tagger.tag('Ich bin schwanger'.split())
[('Ich', 'PPER'), ('bin', 'VAFIN'), ('schwanger', 'ADJD')]

>>> ner_tagger = CoreNLPParser('http://localhost:9002', tagtype='ner')
>>> ner_tagger.tag('Donald Trump besuchte Angela Merkel in Berlin.'.split())
[('Donald', 'PERSON'), ('Trump', 'PERSON'), ('besuchte', 'O'), ('Angela', 'PERSON'), ('Merkel', 'PERSON'), ('in', 'O'), ('Berlin', 'LOCATION'), ('.', 'O')]

Orang Spanyol

Mulai server:

java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-serverProperties StanfordCoreNLP-spanish.properties \
-preload tokenize,ssplit,pos,ner,parse \
-status_port 9003  -port 9003 -timeout 15000

Dengan Python:

>>> pos_tagger = CoreNLPParser('http://localhost:9003', tagtype='pos')
>>> pos_tagger.tag(u'Barack Obama salió con Michael Jackson .'.split())
[('Barack', 'PROPN'), ('Obama', 'PROPN'), ('salió', 'VERB'), ('con', 'ADP'), ('Michael', 'PROPN'), ('Jackson', 'PROPN'), ('.', 'PUNCT')]
>>> ner_tagger = CoreNLPParser('http://localhost:9003', tagtype='ner')
>>> ner_tagger.tag(u'Barack Obama salió con Michael Jackson .'.split())
[('Barack', 'PERSON'), ('Obama', 'PERSON'), ('salió', 'O'), ('con', 'O'), ('Michael', 'PERSON'), ('Jackson', 'PERSON'), ('.', 'O')]
alva
sumber
Jawaban yang sangat bagus. Terima kasih
Eben
Terima kasih, ini sangat berguna. Penguraian bahasa Arab tidak benar. Ini memisahkan teks menjadi huruf dan bukan kata
Labibah
Gunakan list(parser.raw_parse(text))atau list(parser.parse(parser.tokenize(text)). Memperbaiki contoh;)
alvas
1
Tidak percaya ini tidak diiklankan lagi !!
Nimitz14
1
Sayangnya, NLTK tidak memiliki cukup orang yang menghadiri pertemuan untuk memberikan ceramah atau memiliki sumber daya untuk mengadakan konferensi dev yang keren untuk mempromosikan alat = (Jangan ragu untuk memperkenalkan fitur ini atau NLTK kepada komunitas di sekitar Anda.
alvas
6

Jika saya ingat dengan baik, parser Stanford adalah pustaka java, oleh karena itu Anda harus memiliki juru bahasa Java yang berjalan di server / komputer Anda.

Saya menggunakannya sekali sebagai server, dikombinasikan dengan skrip php. Skrip menggunakan fungsi exec () dari php untuk membuat panggilan baris perintah ke parser seperti:

<?php

exec( "java -cp /pathTo/stanford-parser.jar -mx100m edu.stanford.nlp.process.DocumentPreprocessor /pathTo/fileToParse > /pathTo/resultFile 2>/dev/null" );

?>

Saya tidak ingat semua detail dari perintah ini, itu pada dasarnya membuka fileToParse, menguraikannya, dan menulis output di resultFile. PHP kemudian akan membuka file hasil untuk digunakan lebih lanjut.

Akhir perintah mengarahkan verbose parser ke NULL, untuk mencegah informasi baris perintah yang tidak perlu mengganggu skrip.

Saya tidak tahu banyak tentang Python, tetapi mungkin ada cara untuk membuat panggilan baris perintah.

Ini mungkin bukan rute yang Anda harapkan, tapi semoga bisa memberi Anda inspirasi. Semoga berhasil.

bob dope
sumber
6

Perhatikan bahwa jawaban ini berlaku untuk NLTK v 3.0, dan tidak untuk versi yang lebih baru.

Berikut ini adalah adaptasi dari kode hazard98 yang bekerja dengan nltk3.0.0 di windoze, dan mungkin juga platform lain, sesuaikan nama direktori yang sesuai untuk pengaturan Anda:

import os
from nltk.parse import stanford
os.environ['STANFORD_PARSER'] = 'd:/stanford-parser'
os.environ['STANFORD_MODELS'] = 'd:/stanford-parser'
os.environ['JAVAHOME'] = 'c:/Program Files/java/jre7/bin'

parser = stanford.StanfordParser(model_path="d:/stanford-grammars/englishPCFG.ser.gz")
sentences = parser.raw_parse_sents(("Hello, My name is Melroy.", "What is your name?"))
print sentences

Perhatikan bahwa perintah parsing telah berubah (lihat kode sumber di www.nltk.org/_modules/nltk/parse/stanford.html), dan Anda perlu mendefinisikan variabel JAVAHOME. Saya mencoba mendapatkannya untuk membaca file tata bahasa in situ di dalam jar, tetapi sejauh ini gagal melakukannya.

Avery Andrews
sumber
Saya dari tahun 1989 bukan 98, tapi terima kasih atas teladan Anda;)
hazard89
4

Anda dapat menggunakan keluaran Stanford Parsers untuk membuat Pohon di nltk (nltk.tree.Tree).

Dengan asumsi stanford parser memberi Anda file yang berisi tepat satu pohon parse untuk setiap kalimat. Kemudian contoh ini berhasil, meskipun mungkin tidak terlihat terlalu pythonic:

f = open(sys.argv[1]+".output"+".30"+".stp", "r")
parse_trees_text=[]
tree = ""
for line in f:
  if line.isspace():
    parse_trees_text.append(tree)
tree = ""
  elif "(. ...))" in line:
#print "YES"
tree = tree+')'
parse_trees_text.append(tree)
tree = ""
  else:
tree = tree + line

parse_trees=[]
for t in parse_trees_text:
  tree = nltk.Tree(t)
  tree.__delitem__(len(tree)-1) #delete "(. .))" from tree (you don't need that)
  s = traverse(tree)
  parse_trees.append(tree)
Sadik
sumber
1
1 untuk membiarkan java melakukan hal-hal java dan python melakukan hal python. Bergantung pada bagaimana Anda memanggil perintah java dan opsi apa, mengurai file keluaran dari stanford parser mungkin berbeda. Akan lebih baik jika Anda juga menambahkan detail tentang bagaimana Anda memanggil Stanford Parse untuk mendapatkan file output Anda.
alvas
4

Perhatikan bahwa jawaban ini berlaku untuk NLTK v 3.0, dan tidak untuk versi yang lebih baru.

Karena tidak ada yang benar-benar menyebutkan dan itu sangat mengganggu saya, berikut adalah cara alternatif untuk menggunakan parser Stanford dengan python:

stanford_parser_jar = '../lib/stanford-parser-full-2015-04-20/stanford-parser.jar'
stanford_model_jar = '../lib/stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar'    
parser = StanfordParser(path_to_jar=stanford_parser_jar, 
                        path_to_models_jar=stanford_model_jar)

dengan cara ini, Anda tidak perlu khawatir tentang jalur lagi.

Bagi mereka yang tidak dapat menggunakannya dengan baik di Ubuntu atau menjalankan kode di Eclipse.

Zhong Zhu
sumber
3

Saya menggunakan mesin windows dan Anda dapat menjalankan parser secara normal seperti yang Anda lakukan dari perintah seperti tetapi seperti di direktori yang berbeda sehingga Anda tidak perlu mengedit file lexparser.bat. Letakkan saja di jalur lengkap.

cmd = r'java -cp \Documents\stanford_nlp\stanford-parser-full-2015-01-30 edu.stanford.nlp.parser.lexparser.LexicalizedParser -outputFormat "typedDependencies" \Documents\stanford_nlp\stanford-parser-full-2015-01-30\stanford-parser-3.5.1-models\edu\stanford\nlp\models\lexparser\englishFactored.ser.gz stanfordtemp.txt'
parse_out = os.popen(cmd).readlines()

Bagian yang sulit bagi saya adalah menyadari bagaimana menjalankan program java dari jalur yang berbeda. Pasti ada cara yang lebih baik tapi ini berhasil.

Ted Petrou
sumber
3

Perhatikan bahwa jawaban ini berlaku untuk NLTK v 3.0, dan tidak untuk versi yang lebih baru.

Sedikit pembaruan (atau hanya alternatif) pada jawaban komprehensif hazard89 tentang penggunaan Stanford Parser di NLTK dan Python

Dengan stanford-parser-full-2015-04-20, JRE 1.8 dan nltk 3.0.4 (python 2.7.6), tampaknya Anda tidak perlu lagi mengekstrak englishPCFG.ser.gz dari stanford-parser-xxx-models .jar atau menyiapkan lingkungan os.en

from nltk.parse.stanford import StanfordParser

english_parser = StanfordParser('path/stanford-parser.jar', 'path/stanford-parser-3.5.2-models.jar')

s = "The real voyage of discovery consists not in seeking new landscapes, but in having new eyes."

sentences = english_parser.raw_parse_sents((s,))
print sentences #only print <listiterator object> for this version

#draw the tree
for line in sentences:
    for sentence in line:
        sentence.draw()
SYK
sumber
3

Perhatikan bahwa jawaban ini berlaku untuk NLTK v 3.0, dan tidak untuk versi yang lebih baru.

Ini adalah jawaban alva versi windows

sentences = ('. '.join(['this is sentence one without a period','this is another foo bar sentence '])+'.').encode('ascii',errors = 'ignore')
catpath =r"YOUR CURRENT FILE PATH"

f = open('stanfordtemp.txt','w')
f.write(sentences)
f.close()

parse_out = os.popen(catpath+r"\nlp_tools\stanford-parser-2010-08-20\lexparser.bat "+catpath+r"\stanfordtemp.txt").readlines()

bracketed_parse = " ".join( [i.strip() for i in parse_out if i.strip() if i.strip()[0] == "("] )
bracketed_parse = "\n(ROOT".join(bracketed_parse.split(" (ROOT")).split('\n')
aa = map(lambda x :ParentedTree.fromstring(x),bracketed_parse)

CATATAN:

  • Di lexparser.bat Anda perlu mengubah semua jalur menjadi jalur absolut untuk menghindari kesalahan java seperti "kelas tidak ditemukan"

  • Saya sangat menyarankan Anda untuk menerapkan metode ini di bawah jendela karena saya Mencoba beberapa jawaban di halaman dan semua metode yang mengkomunikasikan python dengan Java gagal.

  • ingin mendengar dari Anda jika Anda berhasil di windows dan berharap Anda dapat memberi tahu saya bagaimana Anda mengatasi semua masalah ini.

  • cari python wrapper untuk stanford coreNLP untuk mendapatkan versi python


redreamality
sumber
2

Saya membutuhkan waktu berjam-jam dan akhirnya menemukan solusi sederhana untuk pengguna Windows. Pada dasarnya ini adalah versi ringkasan dari jawaban yang ada oleh alva, tetapi dibuat mudah untuk diikuti (mudah-mudahan) bagi mereka yang baru mengenal stanford NLP dan merupakan pengguna Window.

1) Unduh modul yang ingin Anda gunakan, seperti NER, POS, dll. Dalam kasus saya, saya ingin menggunakan NER, jadi saya mengunduh modul dari http://nlp.stanford.edu/software/stanford-ner-2015- 04-20.zip

2) Buka zip file.

3) Atur variabel lingkungan (classpath dan stanford_modules) dari folder yang telah dibuka zipnya.

import os
os.environ['CLASSPATH'] = "C:/Users/Downloads/stanford-ner-2015-04-20/stanford-ner.jar"
os.environ['STANFORD_MODELS'] = "C:/Users/Downloads/stanford-ner-2015-04-20/classifiers/"

4) tetapkan variabel lingkungan untuk JAVA, seperti di tempat Anda menginstal JAVA. bagi saya itu di bawah

os.environ['JAVAHOME'] = "C:/Program Files/Java/jdk1.8.0_102/bin/java.exe"

5) impor modul yang Anda inginkan

from nltk.tag import StanfordNERTagger

6) panggil model pretrained yang ada di folder classifier di folder unzip. tambahkan ".gz" di bagian akhir untuk ekstensi file. bagi saya model yang ingin saya gunakan adalahenglish.all.3class.distsim.crf.ser

st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz')

7) Sekarang jalankan parser !! dan kita selesai !!

st.tag('Rami Eid is studying at Stony Brook University in NY'.split())
StatguyUser
sumber
2

Jawaban yang Tidak Berlaku Lagi

Jawaban di bawah tidak berlaku lagi, gunakan solusi di https://stackoverflow.com/a/51981566/610569 untuk NLTK v3.3 dan yang lebih baru.


DIEDIT

Catatan: Jawaban berikut hanya akan berfungsi:

  • Versi NLTK == 3.2.5
  • Stanford Tools dikompilasi sejak 2016-10-31
  • Python 2.7, 3.5 dan 3.6

Karena kedua alat berubah agak cepat dan API mungkin terlihat sangat berbeda 3-6 bulan kemudian. Mohon perlakukan jawaban berikut sebagai sementara dan bukan sebagai solusi abadi.

Selalu merujuk ke https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software untuk instruksi terbaru tentang cara menghubungkan alat Stanford NLP menggunakan NLTK !!

TL; DR

Kode berikut berasal dari https://github.com/nltk/nltk/pull/1735#issuecomment-306091826

Di terminal:

wget http://nlp.stanford.edu/software/stanford-corenlp-full-2016-10-31.zip
unzip stanford-corenlp-full-2016-10-31.zip && cd stanford-corenlp-full-2016-10-31

java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-preload tokenize,ssplit,pos,lemma,parse,depparse \
-status_port 9000 -port 9000 -timeout 15000

Dengan Python:

>>> from nltk.tag.stanford import CoreNLPPOSTagger, CoreNLPNERTagger
>>> from nltk.parse.corenlp import CoreNLPParser

>>> stpos, stner = CoreNLPPOSTagger(), CoreNLPNERTagger()

>>> stpos.tag('What is the airspeed of an unladen swallow ?'.split())
[(u'What', u'WP'), (u'is', u'VBZ'), (u'the', u'DT'), (u'airspeed', u'NN'), (u'of', u'IN'), (u'an', u'DT'), (u'unladen', u'JJ'), (u'swallow', u'VB'), (u'?', u'.')]

>>> stner.tag('Rami Eid is studying at Stony Brook University in NY'.split())
[(u'Rami', u'PERSON'), (u'Eid', u'PERSON'), (u'is', u'O'), (u'studying', u'O'), (u'at', u'O'), (u'Stony', u'ORGANIZATION'), (u'Brook', u'ORGANIZATION'), (u'University', u'ORGANIZATION'), (u'in', u'O'), (u'NY', u'O')]


>>> parser = CoreNLPParser(url='http://localhost:9000')

>>> next(
...     parser.raw_parse('The quick brown fox jumps over the lazy dog.')
... ).pretty_print()  # doctest: +NORMALIZE_WHITESPACE
                     ROOT
                      |
                      S
       _______________|__________________________
      |                         VP               |
      |                _________|___             |
      |               |             PP           |
      |               |     ________|___         |
      NP              |    |            NP       |
  ____|__________     |    |     _______|____    |
 DT   JJ    JJ   NN  VBZ   IN   DT      JJ   NN  .
 |    |     |    |    |    |    |       |    |   |
The quick brown fox jumps over the     lazy dog  .

>>> (parse_fox, ), (parse_wolf, ) = parser.raw_parse_sents(
...     [
...         'The quick brown fox jumps over the lazy dog.',
...         'The quick grey wolf jumps over the lazy fox.',
...     ]
... )

>>> parse_fox.pretty_print()  # doctest: +NORMALIZE_WHITESPACE
                     ROOT
                      |
                      S
       _______________|__________________________
      |                         VP               |
      |                _________|___             |
      |               |             PP           |
      |               |     ________|___         |
      NP              |    |            NP       |
  ____|__________     |    |     _______|____    |
 DT   JJ    JJ   NN  VBZ   IN   DT      JJ   NN  .
 |    |     |    |    |    |    |       |    |   |
The quick brown fox jumps over the     lazy dog  .

>>> parse_wolf.pretty_print()  # doctest: +NORMALIZE_WHITESPACE
                     ROOT
                      |
                      S
       _______________|__________________________
      |                         VP               |
      |                _________|___             |
      |               |             PP           |
      |               |     ________|___         |
      NP              |    |            NP       |
  ____|_________      |    |     _______|____    |
 DT   JJ   JJ   NN   VBZ   IN   DT      JJ   NN  .
 |    |    |    |     |    |    |       |    |   |
The quick grey wolf jumps over the     lazy fox  .

>>> (parse_dog, ), (parse_friends, ) = parser.parse_sents(
...     [
...         "I 'm a dog".split(),
...         "This is my friends ' cat ( the tabby )".split(),
...     ]
... )

>>> parse_dog.pretty_print()  # doctest: +NORMALIZE_WHITESPACE
        ROOT
         |
         S
  _______|____
 |            VP
 |    ________|___
 NP  |            NP
 |   |         ___|___
PRP VBP       DT      NN
 |   |        |       |
 I   'm       a      dog

Silakan lihat di http://www.nltk.org/_modules/nltk/parse/corenlp.html untuk informasi lebih lanjut tentang API Stanford. Lihatlah docstringsnya!

alva
sumber
2

Perhatikan bahwa jawaban ini berlaku untuk NLTK v 3.0, dan tidak untuk versi yang lebih baru.

Saya tidak dapat meninggalkan ini sebagai komentar karena reputasi, tetapi karena saya menghabiskan (menyia-nyiakan?) Beberapa waktu untuk menyelesaikan ini, saya lebih suka membagikan masalah / solusi saya agar parser ini berfungsi di NLTK.

Dalam jawaban yang sangat bagus dari para alva , disebutkan bahwa:

misalnya untuk Parser, tidak akan ada direktori model.

Hal ini membuat saya salah pada:

  • tidak berhati-hati dengan nilai yang saya berikan STANFORD_MODELS (dan hanya peduli dengan saya CLASSPATH)
  • biarkan ../path/tostanford-parser-full-2015-2012-09/models directory* hampir kosong * (atau dengan file jar yang namanya tidak cocok dengan nltk regex)!

Jika OP, seperti saya, hanya ingin menggunakan parser, mungkin akan membingungkan bahwa ketika tidak mengunduh yang lain (tidak ada POStagger, tidak ada NER, ...) dan mengikuti semua petunjuk ini, kami masih mendapatkan kesalahan.

Akhirnya, untuk yang CLASSPATHdiberikan (berikut contoh dan penjelasan dalam jawaban dari utas ini) saya masih akan mendapatkan kesalahan:

NLTK tidak dapat menemukan stanford-parser - (\ d +) (. (\ D +)) + - models.jar! Setel variabel lingkungan CLASSPATH. Untuk informasi selengkapnya, di stanford-parser - (\ d +) (. (\ D +)) + - models.jar,

lihat: http://nlp.stanford.edu/software/lex-parser.shtml

ATAU:

NLTK tidak dapat menemukan stanford-parser.jar! Setel variabel lingkungan CLASSPATH. Untuk informasi lebih lanjut, di stanford-parser.jar, lihat: http://nlp.stanford.edu/software/lex-parser.shtml

Meskipun , yang terpenting, saya dapat memuat dan menggunakan parser dengan benar jika saya memanggil fungsi dengan semua argumen dan jalur yang ditentukan sepenuhnya, seperti di:

stanford_parser_jar = '../lib/stanford-parser-full-2015-04-20/stanford-parser.jar'
stanford_model_jar = '../lib/stanford-parser-full-2015-04-20/stanfor-parser-3.5.2-models.jar'    
parser = StanfordParser(path_to_jar=stanford_parser_jar, 
                    path_to_models_jar=stanford_model_jar)

Solusi untuk Parser saja:

Oleh karena itu kesalahan berasal NLTKdan bagaimana itu mencari toples menggunakan variabel yang disediakan STANFORD_MODELSdan CLASSPATHlingkungan. Untuk mengatasi ini, *-models.jardengan format yang benar (untuk mencocokkan regex dalam NLTKkode, jadi tidak ada -corenlp -.... jar) harus ditempatkan di folder yang ditunjuk oleh STANFORD_MODELS.

Yakni, saya pertama kali membuat:

mkdir stanford-parser-full-2015-12-09/models

Kemudian ditambahkan .bashrc:

export STANFORD_MODELS=/path/to/stanford-parser-full-2015-12-09/models

Dan terakhir, dengan menyalin stanford-parser-3.6.0-models.jar(atau versi yang sesuai), ke:

path/to/stanford-parser-full-2015-12-09/models/

Saya bisa StanfordParsermemuat dengan lancar di python dengan klasik CLASSPATHyang menunjuk stanford-parser.jar. Sebenarnya, dengan demikian, Anda dapat memanggil StanfordParsertanpa parameter, default hanya akan berfungsi.

H. Rev.
sumber
2

Saya menggunakan nltk versi 3.2.4. Dan kode berikut berhasil untuk saya.

from nltk.internals import find_jars_within_path
from nltk.tag import StanfordPOSTagger
from nltk import word_tokenize

# Alternatively to setting the CLASSPATH add the jar and model via their 
path:
jar = '/home/ubuntu/stanford-postagger-full-2017-06-09/stanford-postagger.jar'
model = '/home/ubuntu/stanford-postagger-full-2017-06-09/models/english-left3words-distsim.tagger'

pos_tagger = StanfordPOSTagger(model, jar)

# Add other jars from Stanford directory
stanford_dir = pos_tagger._stanford_jar.rpartition('/')[0]
stanford_jars = find_jars_within_path(stanford_dir)
pos_tagger._stanford_jar = ':'.join(stanford_jars)

text = pos_tagger.tag(word_tokenize("Open app and play movie"))
print(text)

Keluaran:

[('Open', 'VB'), ('app', 'NN'), ('and', 'CC'), ('play', 'VB'), ('movie', 'NN')]
Aditi
sumber
Saya pikir ini adalah pemberi tag dan bukan pengurai
Nadav B
1

Pengembangan baru parser Stanford berdasarkan model neural, dilatih menggunakan Tensorflow, baru-baru ini tersedia untuk digunakan sebagai API python. Model ini seharusnya jauh lebih akurat daripada moel berbasis Java. Anda pasti dapat berintegrasi dengan pipeline NLTK.

Tautkan ke parser. Repositori berisi model parser terlatih untuk 53 bahasa.

0x5050
sumber