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.
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
# GUIfor 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.
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.
Buka stanford-parser-3.xx-models.jar menggunakan Manajer arsip (7zip).
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.
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.
Coba contoh saya! (jangan lupa ubah jalur jar dan ubah jalur model ke lokasi ser.gz)
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.
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.
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.
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
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:
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)
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
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.
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 .
(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:
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.
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:
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.
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.
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)
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:
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.
Bagian yang sulit bagi saya adalah menyadari bagaimana menjalankan program java dari jalur yang berbeda. Pasti ada cara yang lebih baik tapi ini berhasil.
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 treefor line in sentences:
for sentence in line:
sentence.draw()
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
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.
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())
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.
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.
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,
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:
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.
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.
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)
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.
Jawaban:
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:
Catatan 1: Dalam contoh ini, parser & model jars berada dalam folder yang sama.
Catatan 2:
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
Unduh NLTK v3 dari: https://github.com/nltk/nltk . Dan instal NLTK:
sudo python setup.py install
Anda dapat menggunakan pengunduh NLTK untuk mendapatkan Stanford Parser, menggunakan Python:
import nltk nltk.download()
Coba contoh saya! (jangan lupa ubah jalur jar dan ubah jalur model ke lokasi ser.gz)
ATAU:
Unduh dan instal NLTK v3, sama seperti di atas.
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
Ekstrak file standford-parser-full-20xx-xx-xx.zip.
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.
Buka stanford-parser-3.xx-models.jar menggunakan Manajer arsip (7zip).
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.
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.
Coba contoh saya! (jangan lupa ubah jalur jar dan ubah jalur model ke lokasi ser.gz)
sumber
nltk.parse.stanford
? Saya hanya adanltk.tag.stanford
di NLTK2.0.4
.AttributeError: 'StanfordParser' object has no attribute 'raw_batch_parse'
raw_parse_sents()
for line in sentences: for sentence in line: sentence.draw()
Anda hanya dapat mengeksekusi draw () pada objek Tree;)NLTK official 3rd party tools
dokumentasi.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:
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 ,
NLTK
API ke alat Stanford NLP telah berubah cukup banyak sejak versi 3.1. Jadi disarankan untuk memperbarui paket NLTK Anda ke v3.1.Ketiga , para
NLTK
API 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_JAR
danSTANFORD_PARSER
variabel sudah ditinggalkan dan TIDAK LAGI digunakanLebih 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 ):
sudo pip install -U nltk
sudo apt-get install python-nltk
Untuk Windows (Gunakan penginstalan biner 32-bit):
( Mengapa tidak 64 bit? Lihat https://github.com/nltk/nltk/issues/1079 )
Kemudian keluar dari paranoia, periksa kembali
nltk
versi 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.1
hasilnya.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
.jar
file Stanford NLP yang sesuai keCLASSPATH
variabel lingkungan.stanford-ner-2015-04-20/stanford-ner.jar
stanford-postagger-full-2015-04-20/stanford-postagger.jar
stanford-parser-full-2015-04-20/stanford-parser.jar
dan file jar model parser,stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
Tambahkan direktori model yang sesuai ke
STANFORD_MODELS
variabel (yaitu direktori tempat Anda dapat menemukan tempat penyimpanan model terlatih)stanford-ner-2015-04-20/classifiers/
stanford-postagger-full-2015-04-20/models/
Di dalam kode, lihat bahwa ia mencari
STANFORD_MODELS
direktori sebelum menambahkan nama model. Juga lihat itu, API juga secara otomatis mencoba mencari lingkungan OS untuk `CLASSPATH )Perhatikan bahwa pada NLTK v3.1,
STANFORD_JAR
variabel 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
.jar
file 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)
sumber
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.sh
telah 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
sumber
len(i.strip()) > 0
jika tidak saya mendapat kesalahan indeks. Saya kira keluaran parser saya memiliki setidaknya satu baris yang murni spasi.'
s, Anda akan mendapatkan beberapa kesalahan aneh. Ada cara yang lebih baik untuk memanggil sesuatu pada baris perintahMulai NLTK v3.3, pengguna harus menghindari penandaan Stanford NER atau POS
nltk.tag
, dan menghindari Stanford tokenizer / segmenter darinltk.tokenize
.Alih-alih gunakan
nltk.parse.corenlp.CoreNLPParser
API 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-27
direktori, 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')]
sumber
list(parser.raw_parse(text))
ataulist(parser.parse(parser.tokenize(text))
. Memperbaiki contoh;)Ada antarmuka python untuk stanford parser
http://projects.csail.mit.edu/spatial/Stanford_Parser
sumber
Halaman perangkat lunak Stanford Core NLP memiliki daftar pembungkus python:
http://nlp.stanford.edu/software/corenlp.shtml#Extensions
sumber
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.
sumber
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.
sumber
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)
sumber
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.
sumber
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.
sumber
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()
sumber
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
sumber
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 adalah
english.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())
sumber
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:
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!
sumber
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:
Hal ini membuat saya salah pada:
STANFORD_MODELS
(dan hanya peduli dengan sayaCLASSPATH
)../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
CLASSPATH
diberikan (berikut contoh dan penjelasan dalam jawaban dari utas ini) saya masih akan mendapatkan kesalahan:lihat: http://nlp.stanford.edu/software/lex-parser.shtml
ATAU:
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
NLTK
dan bagaimana itu mencari toples menggunakan variabel yang disediakanSTANFORD_MODELS
danCLASSPATH
lingkungan. Untuk mengatasi ini,*-models.jar
dengan format yang benar (untuk mencocokkan regex dalamNLTK
kode, jadi tidak ada -corenlp -.... jar) harus ditempatkan di folder yang ditunjuk olehSTANFORD_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
StanfordParser
memuat dengan lancar di python dengan klasikCLASSPATH
yang menunjukstanford-parser.jar
. Sebenarnya, dengan demikian, Anda dapat memanggilStanfordParser
tanpa parameter, default hanya akan berfungsi.sumber
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')]
sumber
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.
sumber