Stanford Parser และ NLTK


90

เป็นไปได้ไหมที่จะใช้ Stanford Parser ใน NLTK (ฉันไม่ได้พูดถึง Stanford POS)


6
ดูสิ่งนี้ด้วย: gist.github.com/alvations/e1df0ba227e542955a8a
alvas

3
ลิงก์นี้จะต้องมองเห็นได้มากขึ้น บางทีคำตอบด้านบนควรได้รับการแก้ไขเพื่อพูดถึงสิ่งนี้หรือไม่?
Lalo Sánchez

1
เพียงแค่ทราบด้านข้างที่นี่พวก ตรวจสอบให้แน่ใจว่า Java ของคุณเป็นรุ่นล่าสุดสำหรับ Stanford NLP และ JAVA_HOME ได้รับการตั้งค่าอย่างถูกต้อง บางครั้งผู้คนอาจได้รับข้อผิดพลาด "แปลก ๆ " ซึ่งอาจเกิดจากสาเหตุนี้
Meng Zhao

สำหรับ NLTK v3.3 โปรดดูstackoverflow.com/a/51981566/610569
alvas

คำตอบ:


90

โปรดทราบว่าคำตอบนี้ใช้กับ NLTK v 3.0 ไม่ใช่กับเวอร์ชันล่าสุด

ได้เลยลองทำสิ่งต่อไปนี้ใน 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()

เอาท์พุต:

[Tree ('ROOT', [Tree ('S', [Tree ('INTJ', [Tree ('UH', ['Hello'])]), Tree (',', [',']), Tree ('NP', [Tree ('PRP $', ['My']), Tree ('NN', ['name'])]), Tree ('VP', [Tree ('VBZ', [ 'is']), Tree ('ADJP', [Tree ('JJ', ['Melroy'])])]), Tree ('.', ['.'])])), Tree (' ROOT ', [Tree (' SBARQ ', [Tree (' WHNP ', [Tree (' WP ', [' What '])]), Tree (' SQ ', [Tree (' VBZ ', [' is ' ]), Tree ('NP', [Tree ('PRP $', ['your']), Tree ('NN', ['name'])])]), Tree ('.', ['? '])])])]

หมายเหตุ 1: ในตัวอย่างนี้ทั้ง parser & model jar อยู่ในโฟลเดอร์เดียวกัน

โน้ต 2:

  • ชื่อไฟล์ของ stanford parser คือ: stanford-parser.jar
  • ชื่อไฟล์ของโมเดล stanford คือ: stanford-parser-xxx-models.jar

หมายเหตุ 3: ไฟล์ englishPCFG.ser.gz สามารถพบได้ในไฟล์ models.jar (/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz) โปรดใช้ come archive manager เพื่อ 'unzip' ไฟล์ models.jar

หมายเหตุ 4: ตรวจสอบให้แน่ใจว่าคุณใช้ Java JRE (Runtime Environment) 1.8หรือที่เรียกว่า Oracle JDK 8 มิฉะนั้นคุณจะได้รับ: Unsupported major.minor เวอร์ชัน 52.0

การติดตั้ง

  1. ดาวน์โหลด NLTK v3 จาก: https://github.com/nltk/nltk และติดตั้ง NLTK:

    sudo python setup.py ติดตั้ง

  2. คุณสามารถใช้ NLTK downloader เพื่อรับ Stanford Parser โดยใช้ Python:

    import nltk
    nltk.download()
    
  3. ลองดูตัวอย่างของฉันสิ! (อย่าลืมเปลี่ยนเส้นทาง jar และเปลี่ยนเส้นทางโมเดลไปยังตำแหน่ง ser.gz)

หรือ:

  1. ดาวน์โหลดและติดตั้ง NLTK v3 เช่นเดียวกับด้านบน

  2. ดาวน์โหลดเวอร์ชันล่าสุดจาก ( ชื่อไฟล์เวอร์ชันปัจจุบันคือ stanford-parser-full-2015-01-29.zip): http://nlp.stanford.edu/software/lex-parser.shtml#Download

  3. แตกไฟล์ standford-parser-full-20xx-xx-xx.zip

  4. สร้างโฟลเดอร์ใหม่ ('jars' ในตัวอย่างของฉัน) วางไฟล์ที่แตกแล้วลงในโฟลเดอร์ jar นี้: stanford-parser-3.xx-models.jar และ stanford-parser.jar

    ดังที่แสดงไว้ด้านบนคุณสามารถใช้ตัวแปรสภาพแวดล้อม (STANFORD_PARSER & STANFORD_MODELS) เพื่อชี้ไปที่โฟลเดอร์ "jars" นี้ ฉันใช้ลินุกซ์ดังนั้นหากคุณใช้ Windows โปรดใช้สิ่งที่ต้องการ: C: // folder // jars

  5. เปิด stanford-parser-3.xx-models.jar โดยใช้ Archive manager (7zip)

  6. เรียกดูภายในไฟล์ jar edu / stanford / nlp / models / lexparser อีกครั้งแตกไฟล์ชื่อ 'englishPCFG.ser.gz' จำตำแหน่งที่คุณแตกไฟล์ ser.gz นี้

  7. เมื่อสร้างอินสแตนซ์ StanfordParser คุณสามารถระบุเส้นทางโมเดลเป็นพารามิเตอร์ได้ นี่คือเส้นทางที่สมบูรณ์ไปยังโมเดลในกรณีของเรา /location/of/englishPCFG.ser.gz

  8. ลองดูตัวอย่างของฉันสิ! (อย่าลืมเปลี่ยนเส้นทาง jar และเปลี่ยนเส้นทางโมเดลไปยังตำแหน่ง ser.gz)


1
เพิ่ม nltk รุ่นnltk.parse.stanfordไหน ฉันมีเพียงแค่nltk.tag.stanfordใน 2.0.4NLTK
alexis

1
AttributeError: 'StanfordParser' object has no attribute 'raw_batch_parse'
Nick Retallack

5
@alexis: ดาวน์โหลด nltk 3.0 จากที่นี่ @Nick Retallack: ควรเปลี่ยนเป็นraw_parse_sents()
Rasika Perera

1
โอเคคุณพูดถูก NLTK เปลี่ยนฟังก์ชันเป็น: raw_parse_sents () ดูเอกสาร: nltk.org/_modules/nltk/parse/stanford.html หากคุณใช้ raw_parse () คุณจะดึง iter (Tree) เป็นค่าส่งคืน ความหมายตัวอย่างข้างต้นของ draw () ควรใช้งานได้ หากคุณใช้ raw_parse_sents () คุณจะต้องมีการวนซ้ำสองครั้ง มันส่งคืน iter (iter (Tree)) ตัวอย่างโค้ด: for line in sentences: for sentence in line: sentence.draw() คุณสามารถดำเนินการวาด () บนวัตถุต้นไม้เท่านั้น)
danger89

1
@ danger89 ขออภัยที่เขียนทับคำตอบของคุณด้วยข้อความที่แก้ไข เมื่อเร็ว ๆ นี้มีคนบ่นเกี่ยวกับตัวแยกวิเคราะห์การพึ่งพา Stanford เพิ่งถูกเพิ่มเข้ามาเมื่อไม่นานมานี้ตั้งแต่ NLTK v3.1 และฉันคิดว่าพวกเขากำลังทำสำเนาโค้ดบางส่วนที่นี่และที่นั่นจากคำตอบที่เลิกใช้แล้วที่นี่ ดังนั้นเพื่อลดความสับสนฉันคิดว่าเป็นการดีที่สุดที่จะเพิ่มข้อจำกัดความรับผิดชอบในคำตอบทั้งหมดที่นี่เกี่ยวกับการปฏิบัติตามคำแนะนำจากNLTK official 3rd party toolsเอกสารประกอบ
alvas

77

คำตอบที่ไม่สนับสนุน

คำตอบด้านล่างนี้เลิกใช้แล้วโปรดใช้วิธีแก้ปัญหาในhttps://stackoverflow.com/a/51981566/610569สำหรับ NLTK v3.3 ขึ้นไป


แก้ไข

หมายเหตุ: คำตอบต่อไปนี้ใช้ได้เฉพาะกับ:

  • เวอร์ชัน NLTK> = 3.2.4
  • Stanford Tools รวบรวมตั้งแต่ 2015-04-20
  • Python 2.7, 3.4 และ 3.5 (Python 3.6 ยังไม่รองรับอย่างเป็นทางการ)

เนื่องจากเครื่องมือทั้งสองเปลี่ยนแปลงค่อนข้างเร็วและ API อาจดูแตกต่างกันมากใน 3-6 เดือนต่อมา โปรดถือว่าคำตอบต่อไปนี้เป็นเพียงชั่วคราวและไม่ใช่การแก้ไขชั่วนิรันดร์

อ้างอิงhttps://github.com/nltk/nltk/wiki/Installing-Third-Party-Softwareเสมอสำหรับคำแนะนำล่าสุดเกี่ยวกับวิธีการเชื่อมต่อเครื่องมือ Stanford NLP โดยใช้ NLTK !!


TL; ดร

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

จากนั้น:

>>> 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'])])]

ในระยะยาว:


ประการแรกหนึ่งต้องทราบว่าเครื่องมือที่สแตนฟอ NLP จะเขียนใน JavaและNLTK ถูกเขียนในหลาม วิธีที่ NLTK เชื่อมต่อเครื่องมือคือการเรียกเครื่องมือ Java ผ่านอินเทอร์เฟซบรรทัดคำสั่ง

ประการที่สองที่NLTKAPI ไปเป็นเครื่องมือสแตนฟอ NLP มีการเปลี่ยนแปลงค่อนข้างมากตั้งแต่เวอร์ชัน 3.1 ดังนั้นขอแนะนำให้อัปเดตแพ็คเกจ NLTK ของคุณเป็น v3.1

ประการที่สามที่NLTKAPI เพื่อเครื่องมือสแตนฟอ NLP ล้อมรอบเครื่องมือ NLP ของแต่ละบุคคลเช่นStanford POS Tagger , Stanford NER Tagger , Stanford Parser

สำหรับ POS และ NER Tagger ก็ไม่ได้ห่อรอบแพคเกจสแตนฟอแกน NLP

สำหรับ Stanford Parser มันเป็นกรณีพิเศษที่ล้อมรอบทั้ง Stanford Parser และ Stanford Core NLP (โดยส่วนตัวฉันไม่ได้ใช้รุ่นหลังโดยใช้ NLTK ฉันอยากจะติดตามการสาธิตของ @ dimazest ในhttp: //www.eecs qmul.ac.uk/~dm303/stanford-dependency-parser-nltk-and-anaconda.html )

โปรดทราบว่าตั้งแต่ NLTK v3.1 ตัวแปรSTANFORD_JARและSTANFORD_PARSERถูกเลิกใช้งานและไม่ใช้อีกต่อไป


อีกต่อไป:


ขั้นตอนที่ 1

สมมติว่าคุณได้ติดตั้ง Java อย่างเหมาะสมบนระบบปฏิบัติการของคุณ

ตอนนี้ติดตั้ง / อัปเดตเวอร์ชัน NLTK ของคุณ (ดูhttp://www.nltk.org/install.html ):

  • ใช้ pip :sudo pip install -U nltk
  • Debian distro (ใช้ apt-get):sudo apt-get install python-nltk

สำหรับ Windows (ใช้การติดตั้งไบนารี 32 บิต):

  1. ติดตั้ง Python 3.4: http://www.python.org/downloads/ (หลีกเลี่ยงเวอร์ชัน 64 บิต)
  2. ติดตั้ง Numpy (ทางเลือก): http://sourceforge.net/projects/numpy/files/NumPy/ (เวอร์ชันที่ระบุ pythnon3.4)
  3. ติดตั้ง NLTK: http://pypi.python.org/pypi/nltk
  4. ทดสอบการติดตั้ง: เริ่ม> Python34 จากนั้นพิมพ์ import nltk

( ทำไมไม่ 64 บิตดูhttps://github.com/nltk/nltk/issues/1079 )


จากความหวาดระแวงตรวจสอบnltkเวอร์ชันของคุณอีกครั้งใน python:

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

หรือในบรรทัดคำสั่ง:

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

ตรวจสอบให้แน่ใจว่าคุณเห็น3.1เป็นผลลัพธ์

สำหรับความหวาดระแวงมากขึ้นให้ตรวจสอบว่า API เครื่องมือ Stanford NLP ที่คุณชื่นชอบทั้งหมดพร้อมใช้งาน:

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

( หมายเหตุ : การนำเข้าดังกล่าวจะเท่านั้น . ให้แน่ใจว่าคุณกำลังใช้รุ่น NLTK ที่ถูกต้องที่มี API เหล่านี้ไม่เห็นข้อผิดพลาดในการนำเข้าไม่ได้หมายความว่าคุณได้ประสบความสำเร็จในการกำหนดค่า API NLTK ที่จะใช้เครื่องมือ Stanford)


ขั้นตอนที่ 2

ตอนนี้คุณได้ตรวจสอบแล้วว่าคุณมี NLTK เวอร์ชันที่ถูกต้องซึ่งมีอินเทอร์เฟซเครื่องมือ Stanford NLP ที่จำเป็น คุณต้องดาวน์โหลดและแยกเครื่องมือ Stanford NLP ที่จำเป็นทั้งหมด

TL; DRใน 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

ใน Windows / Mac:


ขั้นตอนที่ 3

ตั้งค่าตัวแปรสภาพแวดล้อมเพื่อให้ NLTK ค้นหาเส้นทางไฟล์ที่เกี่ยวข้องโดยอัตโนมัติ คุณต้องตั้งค่าตัวแปรต่อไปนี้:

  • เพิ่ม.jarไฟล์Stanford NLP ที่เหมาะสมให้กับ CLASSPATHตัวแปรสภาพแวดล้อม

    • เช่นสำหรับ NER ก็จะเป็น stanford-ner-2015-04-20/stanford-ner.jar
    • เช่นสำหรับ POS ก็จะเป็น stanford-postagger-full-2015-04-20/stanford-postagger.jar
    • เช่นสำหรับตัวแยกวิเคราะห์มันจะเป็นstanford-parser-full-2015-04-20/stanford-parser.jarและไฟล์ jar ของโมเดลตัวแยกวิเคราะห์stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
  • เพิ่มไดเร็กทอรีโมเดลที่เหมาะสมให้กับSTANFORD_MODELSตัวแปร (เช่นไดเร็กทอรีที่คุณสามารถค้นหาตำแหน่งที่บันทึกโมเดลที่ได้รับการฝึกฝนมาก่อน)

    • เช่นสำหรับ NER จะอยู่ใน stanford-ner-2015-04-20/classifiers/
    • เช่นสำหรับ POS จะอยู่ใน stanford-postagger-full-2015-04-20/models/
    • เช่นสำหรับ Parser จะไม่มีไดเร็กทอรีโมเดล

ในโค้ดจะเห็นว่ามันค้นหาSTANFORD_MODELSไดเร็กทอรีก่อนที่จะต่อท้ายชื่อรุ่น นอกจากนี้ยังเห็นว่า API จะพยายามค้นหาสภาพแวดล้อมระบบปฏิบัติการโดยอัตโนมัติสำหรับ`` CLASSPATH )

หมายเหตุว่าเป็นของ NLTK v3.1 ที่STANFORD_JARตัวแปรจะเลิกใช้อีกต่อไป ข้อมูลโค้ดที่พบในคำถาม Stackoverflow ต่อไปนี้อาจไม่ทำงาน:

TL; DR สำหรับขั้นตอนที่ 3 บน 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

( สำหรับ Windows : ดูhttps://stackoverflow.com/a/17176423/610569สำหรับคำแนะนำในการตั้งค่าตัวแปรสภาพแวดล้อม)

คุณต้องตั้งค่าตัวแปรตามด้านบนก่อนเริ่ม python จากนั้น:

>>> 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'])])])])])])]

หรือคุณสามารถลองเพิ่มตัวแปรสภาพแวดล้อมภายใน python ตามที่คำตอบก่อนหน้านี้ได้แนะนำ แต่คุณยังสามารถบอก parser / tagger ได้โดยตรงเพื่อเริ่มต้นเส้นทางตรงที่คุณเก็บ.jarไฟล์และโมเดลของคุณไว้

ไม่จำเป็นต้องตั้งค่าตัวแปรสภาพแวดล้อมหากคุณใช้วิธีการต่อไปนี้แต่เมื่อ API เปลี่ยนชื่อพารามิเตอร์คุณจะต้องเปลี่ยนตามนั้น นั่นคือเหตุผลที่แนะนำให้ตั้งค่าตัวแปรสภาพแวดล้อมมากกว่าที่จะแก้ไขโค้ด python ของคุณให้เหมาะกับเวอร์ชัน NLTK

ตัวอย่างเช่น ( โดยไม่ต้องตั้งค่าตัวแปรสภาพแวดล้อม ):

# 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)

23

ในฐานะของ NLTK v3.3 ผู้ใช้ควรหลีกเลี่ยงการ Stanford NER หรือ POS taggers จากnltk.tagและหลีกเลี่ยงการสแตนฟอ tokenizer / segmenter nltk.tokenizeจาก

ใช้nltk.parse.corenlp.CoreNLPParserAPI ใหม่แทน

โปรดดูhttps://github.com/nltk/nltk/wiki/Stanford-CoreNLP-API-in-NLTK


(หลีกเลี่ยงการตอบเฉพาะลิงก์ฉันได้วางเอกสารจาก NLTK github wiki ด้านล่างแล้ว)

ขั้นแรกให้อัปเดต NLTK ของคุณ

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

จากนั้นดาวน์โหลดแพ็คเกจ CoreNLP ที่จำเป็น:

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 

ภาษาอังกฤษ

ยังคงอยู่ในstanford-corenlp-full-2018-02-27ไดเร็กทอรีเริ่มเซิร์ฟเวอร์:

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

จากนั้นใน 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')]

ชาวจีน

เริ่มต้นเซิร์ฟเวอร์แตกต่างกันเล็กน้อยจากไดเร็กทอรี 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

ใน 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', ['。'])])])]

อาหรับ

เริ่มเซิร์ฟเวอร์:

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

ใน 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')]

ฝรั่งเศส

เริ่มเซิร์ฟเวอร์:

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

ใน 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')]

เยอรมัน

เริ่มเซิร์ฟเวอร์:

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

ใน 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')]

ภาษาสเปน

เริ่มเซิร์ฟเวอร์:

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

ใน 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')]

คำตอบที่ยอดเยี่ยม ขอบคุณ
Eben

ขอบคุณสิ่งนี้มีประโยชน์มาก แม้ว่าการแยกวิเคราะห์ภาษาอาหรับจะไม่ถูกต้อง เป็นการแยกข้อความเป็นตัวอักษรแทนคำ
Labibah

ใช้list(parser.raw_parse(text))หรือ list(parser.parse(parser.tokenize(text)). แก้ไขตัวอย่าง;)
alvas

1
ไม่เชื่อไม่ได้โฆษณาเพิ่ม !!
Nimitz14

1
น่าเศร้าที่ NLTK มีคนไม่เพียงพอที่จะไปพบปะพูดคุยหรือมีทรัพยากรในการจัดประชุมนักพัฒนาที่น่าสนใจเพื่อโปรโมตเครื่องมือ = (อย่าลังเลที่จะแนะนำคุณลักษณะนี้หรือ NLTK ให้กับชุมชนรอบตัวคุณ
alvas

22

คำตอบที่ไม่สนับสนุน

คำตอบด้านล่างนี้เลิกใช้แล้วโปรดใช้วิธีแก้ปัญหาในhttps://stackoverflow.com/a/51981566/610569สำหรับ NLTK v3.3 ขึ้นไป


แก้ไขแล้ว

ในขณะที่ตัวแยกวิเคราะห์ Stanford ปัจจุบัน (2015-04-20) เอาต์พุตเริ่มต้นสำหรับlexparser.shมีการเปลี่ยนแปลงดังนั้นสคริปต์ด้านล่างจะไม่ทำงาน

แต่คำตอบนี้จะถูกเก็บไว้เพื่อประโยชน์ในการรับมรดกก็จะยังคงทำงานร่วมกับhttp://nlp.stanford.edu/software/stanford-parser-2012-11-12.zipแม้ว่า


คำตอบเดิม

ฉันแนะนำว่าอย่ายุ่งกับ Jython, JPype ให้ python ทำ python และปล่อยให้ java ทำ java รับเอาต์พุต Stanford Parser ผ่านคอนโซล

หลังจากที่คุณติดตั้งStanford Parserในโฮมไดเร็กตอรี่ของคุณ~/แล้วเพียงแค่ใช้สูตรหลามนี้เพื่อแยกวิเคราะห์วงเล็บแบน

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

1
สิ่งนี้ใช้ได้ผลสำหรับฉันยกเว้นฉันต้องการเพิ่มเงื่อนไขเพื่อตรวจสอบlen(i.strip()) > 0มิฉะนั้นฉันได้รับข้อผิดพลาดของดัชนี ฉันเดาว่าเอาต์พุตตัวแยกวิเคราะห์ของฉันมีอย่างน้อยหนึ่งบรรทัดที่เป็นช่องว่างล้วนๆ
aelfric5578

1
หรือใช้กระดาษห่อ python นี้สำหรับเครื่องมือ stanford corenlp bitbucket.org/torotoki/corenlp-python
alvas

3
ระวังเรื่องนี้ด้วย หากข้อมูลของคุณมี's ใด ๆคุณจะได้รับข้อผิดพลาดแปลก ๆ มีวิธีที่ดีกว่าในการเรียกสิ่งต่างๆในบรรทัดคำสั่ง
Nick Garvey



6

ถ้าฉันจำได้ดี Stanford parser เป็นไลบรารี java ดังนั้นคุณต้องมี Java interpreter ที่ทำงานบนเซิร์ฟเวอร์ / คอมพิวเตอร์ของคุณ

ฉันใช้ครั้งเดียวเซิร์ฟเวอร์รวมกับสคริปต์ php สคริปต์ใช้ฟังก์ชัน exec () ของ php เพื่อทำการเรียกใช้บรรทัดคำสั่งไปยัง parser ดังนี้:

<?php

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

?>

ฉันจำรายละเอียดทั้งหมดของคำสั่งนี้ไม่ได้โดยทั่วไปแล้วมันจะเปิด fileToParse แยกวิเคราะห์และเขียนผลลัพธ์ใน resultFile PHP จะเปิดไฟล์ผลลัพธ์เพื่อใช้งานต่อไป

จุดสิ้นสุดของคำสั่งกำหนด verbose ของตัวแยกวิเคราะห์เป็น NULL เพื่อป้องกันไม่ให้ข้อมูลบรรทัดคำสั่งที่ไม่จำเป็นรบกวนสคริปต์

ฉันไม่รู้เกี่ยวกับ Python มากนัก แต่อาจมีวิธีการเรียกบรรทัดคำสั่ง

มันอาจจะไม่ใช่เส้นทางที่คุณหวังไว้ แต่หวังว่ามันจะทำให้คุณมีแรงบันดาลใจ ขอให้โชคดี


6

โปรดทราบว่าคำตอบนี้ใช้กับ NLTK v 3.0 ไม่ใช่กับเวอร์ชันล่าสุด

ต่อไปนี้คือการปรับรหัสของ danger98 ที่ทำงานร่วมกับ nltk3.0.0 บน windoze และคาดว่าแพลตฟอร์มอื่น ๆ จะปรับชื่อไดเรกทอรีตามความเหมาะสมสำหรับการตั้งค่าของคุณ:

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

โปรดสังเกตว่าคำสั่งการแยกวิเคราะห์มีการเปลี่ยนแปลง (ดูซอร์สโค้ดที่ www.nltk.org/_modules/nltk/parse/stanford.html) และคุณต้องกำหนดตัวแปร JAVAHOME ฉันพยายามทำให้มันอ่านไฟล์ไวยากรณ์ในแหล่งกำเนิดใน jar แต่ก็ยังทำไม่สำเร็จ


ฉันมาจากปี 1989 ไม่ใช่ 98 แต่ขอบคุณสำหรับตัวอย่างของคุณ)
danger89

4

คุณสามารถใช้เอาต์พุต Stanford Parsers เพื่อสร้าง Tree ใน nltk (nltk.tree.Tree)

สมมติว่าตัวแยกวิเคราะห์ของสแตนฟอร์ดให้ไฟล์ที่มีโครงสร้างการแยกวิเคราะห์หนึ่งบรรทัดสำหรับทุกประโยค จากนั้นตัวอย่างนี้ใช้งานได้แม้ว่ามันอาจจะดูไม่พี ธ อนิกมาก:

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
+1 สำหรับการปล่อยให้ java ทำ java และ python ทำ python ขึ้นอยู่กับวิธีที่คุณเรียกใช้คำสั่ง java และอ็อพชันใดการแยกวิเคราะห์ไฟล์เอาต์พุตจาก stanford parser อาจแตกต่างกัน จะเป็นการดีถ้าคุณเพิ่มรายละเอียดเกี่ยวกับวิธีที่คุณเรียกว่า Stanford Parse เพื่อรับไฟล์เอาต์พุต
alvas

4

โปรดทราบว่าคำตอบนี้ใช้กับ NLTK v 3.0 ไม่ใช่กับเวอร์ชันล่าสุด

เนื่องจากไม่มีใครพูดถึงจริงๆและมันก็ทำให้ฉันมีปัญหามากนี่เป็นอีกทางเลือกหนึ่งในการใช้ Stanford parser ใน 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)

ด้วยวิธีนี้คุณไม่จำเป็นต้องกังวลเกี่ยวกับเส้นทางอีกต่อไป

สำหรับผู้ที่ไม่สามารถใช้งานได้อย่างถูกต้องบน Ubuntu หรือรันโค้ดใน Eclipse


3

ฉันใช้เครื่อง windows และคุณสามารถเรียกใช้โปรแกรมแยกวิเคราะห์ได้ตามปกติเหมือนที่คุณทำจากคำสั่งเช่นเดียวกับในไดเรกทอรีอื่นดังนั้นคุณไม่จำเป็นต้องแก้ไขไฟล์ lexparser.bat แค่ใส่เต็มเส้นทาง

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()

ส่วนที่ยุ่งยากสำหรับฉันคือการตระหนักถึงวิธีเรียกใช้โปรแกรม java จากเส้นทางอื่น ต้องมีวิธีที่ดีกว่านี้ แต่ได้ผล


3

โปรดทราบว่าคำตอบนี้ใช้กับ NLTK v 3.0 ไม่ใช่กับเวอร์ชันล่าสุด

การอัปเดตเล็กน้อย (หรือทางเลือกอื่น) เกี่ยวกับคำตอบที่ครอบคลุมของ Danger89 เกี่ยวกับการใช้ Stanford Parser ใน NLTK และ Python

ด้วย stanford-parser-full-2015-04-20, JRE 1.8 และ nltk 3.0.4 (python 2.7.6) ดูเหมือนว่าคุณไม่จำเป็นต้องแยกภาษาอังกฤษอีกต่อไป PCFG.ser.gz จาก stanford-parser-xxx-models .jar หรือตั้งค่า os.environ

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()

3

โปรดทราบว่าคำตอบนี้ใช้กับ NLTK v 3.0 ไม่ใช่กับเวอร์ชันล่าสุด

นี่คือคำตอบของ alvas รุ่น 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)

หมายเหตุ:

  • ในlexparser.bat คุณจำเป็นต้องเปลี่ยนทุกเส้นทางเข้าไปในเส้นทางที่แน่นอนที่จะหลีกเลี่ยงข้อผิดพลาด Java เช่น "ชั้นไม่พบ"

  • ฉันขอแนะนำให้คุณใช้วิธีนี้ใน windows เนื่องจากฉันได้ลองหลายคำตอบในหน้านี้และวิธีการทั้งหมดสื่อสาร python กับ Java ล้มเหลว

  • หวังว่าจะได้ยินจากคุณหากคุณประสบความสำเร็จบน windows และหวังว่าคุณจะบอกฉันว่าคุณเอาชนะปัญหาเหล่านี้ได้อย่างไร

  • ค้นหา python wrapper สำหรับ stanford coreNLP เพื่อรับเวอร์ชัน python



2

ฉันใช้เวลาหลายชั่วโมงและในที่สุดก็พบวิธีง่ายๆสำหรับผู้ใช้ Windows โดยทั่วไปแล้วเวอร์ชันสรุปของคำตอบที่มีอยู่โดย alvas แต่ทำตามได้ง่าย (หวังว่า) สำหรับผู้ที่ยังใหม่กับ stanford NLP และเป็นผู้ใช้ Window

1)ดาวน์โหลดโมดูลที่คุณต้องการใช้เช่น NER, POS เป็นต้นในกรณีของฉันฉันต้องการใช้ NER ดังนั้นฉันจึงดาวน์โหลดโมดูลจากhttp://nlp.stanford.edu/software/stanford-ner-2015- 04-20.zip

2)เปิดเครื่องรูดไฟล์

3)ตั้งค่าตัวแปรสภาพแวดล้อม (classpath และ stanford_modules) จากโฟลเดอร์ที่คลายซิป

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)ตั้งค่าตัวแปรสภาพแวดล้อมสำหรับ JAVA เช่นเดียวกับที่คุณติดตั้ง JAVA สำหรับฉันมันอยู่ด้านล่าง

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

5)นำเข้าโมดูลที่คุณต้องการ

from nltk.tag import StanfordNERTagger

6)เรียกแบบจำลองที่กำหนดไว้ล่วงหน้าซึ่งมีอยู่ในโฟลเดอร์ลักษณนามในโฟลเดอร์ที่คลายซิป เพิ่ม ".gz" ต่อท้ายสำหรับนามสกุลไฟล์ สำหรับฉันรุ่นที่ฉันต้องการใช้คือenglish.all.3class.distsim.crf.ser

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

7)ตอนนี้รันโปรแกรมแยกวิเคราะห์ !! แล้วก็เสร็จ !!

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


2

คำตอบที่ไม่สนับสนุน

คำตอบด้านล่างนี้เลิกใช้แล้วโปรดใช้วิธีแก้ปัญหาในhttps://stackoverflow.com/a/51981566/610569สำหรับ NLTK v3.3 ขึ้นไป


แก้ไข

หมายเหตุ: คำตอบต่อไปนี้ใช้ได้เฉพาะกับ:

  • NLTK เวอร์ชัน == 3.2.5
  • Stanford Tools รวบรวมตั้งแต่ 2016-10-31
  • Python 2.7, 3.5 และ 3.6

เนื่องจากเครื่องมือทั้งสองเปลี่ยนแปลงค่อนข้างเร็วและ API อาจดูแตกต่างกันมากใน 3-6 เดือนต่อมา โปรดถือว่าคำตอบต่อไปนี้เป็นเพียงชั่วคราวและไม่ใช่การแก้ไขชั่วนิรันดร์

อ้างอิงhttps://github.com/nltk/nltk/wiki/Installing-Third-Party-Softwareเสมอสำหรับคำแนะนำล่าสุดเกี่ยวกับวิธีการเชื่อมต่อเครื่องมือ Stanford NLP โดยใช้ NLTK !!

TL; ดร

รหัสติดตามมาจากhttps://github.com/nltk/nltk/pull/1735#issuecomment-306091826

ในอาคารผู้โดยสาร:

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

ใน 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

โปรดดูที่http://www.nltk.org/_modules/nltk/parse/corenlp.html สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Stanford API ดู docstrings!


2

โปรดทราบว่าคำตอบนี้ใช้กับ NLTK v 3.0 ไม่ใช่กับเวอร์ชันล่าสุด

ฉันไม่สามารถแสดงความคิดเห็นนี้ได้เนื่องจากชื่อเสียง แต่เนื่องจากฉันใช้เวลา (เสียไป?) ในการแก้ปัญหานี้ฉันจึงอยากแบ่งปันปัญหา / วิธีแก้ปัญหาเพื่อให้โปรแกรมแยกวิเคราะห์นี้ทำงานใน NLTK

ในคำตอบที่ยอดเยี่ยม จาก alvasมีการกล่าวถึง:

เช่นสำหรับ Parser จะไม่มีไดเร็กทอรีโมเดล

สิ่งนี้ทำให้ฉันผิดไปที่:

  • ไม่ระวังค่าที่ฉันใส่STANFORD_MODELS (และสนใจเฉพาะไฟล์CLASSPATH )
  • ปล่อยให้../path/tostanford-parser-full-2015-2012-09/models directory* แทบว่างเปล่า * (หรือด้วยไฟล์ jar ที่ชื่อไม่ตรงกับ nltk regex)!

ถ้า OP อย่างฉันแค่ต้องการใช้ตัวแยกวิเคราะห์อาจทำให้สับสนว่าเมื่อไม่ดาวน์โหลดสิ่งอื่นใด (ไม่มี POStagger, ไม่มี NER, ... ) และทำตามคำแนะนำทั้งหมดนี้เรายังคงได้รับข้อผิดพลาด

ในที่สุดสำหรับสิ่งที่CLASSPATHกำหนด (ทำตามตัวอย่างและคำอธิบายในคำตอบจากเธรดนี้) ฉันยังคงได้รับข้อผิดพลาด:

NLTK ไม่พบ stanford-parser - (\ d +) (. (\ d +)) + - models.jar! ตั้งค่าตัวแปรสภาพแวดล้อม CLASSPATH สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ stanford-parser - (\ d +) (. (\ d +)) + - models.jar,

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

หรือ:

NLTK ไม่พบ stanford-parser.jar! ตั้งค่าตัวแปรสภาพแวดล้อม CLASSPATH สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ stanford-parser.jar โปรดดู: http://nlp.stanford.edu/software/lex-parser.shtml

แม้ว่าที่สำคัญฉันสามารถโหลดและใช้ตัวแยกวิเคราะห์ได้อย่างถูกต้องหากฉันเรียกฟังก์ชันด้วยอาร์กิวเมนต์และเส้นทางทั้งหมดที่ระบุไว้อย่างครบถ้วนดังใน:

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)

วิธีแก้ปัญหาสำหรับ Parser เพียงอย่างเดียว:

ดังนั้นข้อผิดพลาดจึงเกิดขึ้นNLTKและวิธีการค้นหาไหโดยใช้ตัวแปรที่ให้มาSTANFORD_MODELSและCLASSPATHสภาพแวดล้อม ในการแก้ปัญหานี้*-models.jarด้วยการจัดรูปแบบที่ถูกต้อง (เพื่อให้ตรงกับ regex ในNLTKโค้ดดังนั้น no -corenlp -.... jar) จะต้องอยู่ในโฟลเดอร์ที่กำหนดโดยSTANFORD_MODELSจะต้องอยู่ในโฟลเดอร์ที่กำหนดโดย

ฉันสร้างครั้งแรก:

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

จากนั้นเพิ่มใน.bashrc:

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

และสุดท้ายโดยการคัดลอกstanford-parser-3.6.0-models.jar(หรือเวอร์ชันที่เกี่ยวข้อง) ลงใน:

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

ฉันจะได้รับStanfordParserในการโหลดได้อย่างราบรื่นในหลามกับคลาสสิกที่ชี้ไปยังCLASSPATH stanford-parser.jarจริงๆแล้วคุณสามารถโทรได้StanfordParserโดยไม่ต้องใช้พารามิเตอร์ใด ๆ ค่าเริ่มต้นก็จะใช้ได้


2

ฉันใช้ nltk เวอร์ชัน 3.2.4 และรหัสต่อไปนี้ใช้ได้ผลสำหรับฉัน

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)

เอาท์พุต:

[('Open', 'VB'), ('app', 'NN'), ('and', 'CC'), ('play', 'VB'), ('movie', 'NN')]

ฉันคิดว่านี่คือแท็กเกอร์ไม่ใช่ตัวแยกวิเคราะห์
Nadav B

1

การพัฒนาใหม่ของตัวแยกวิเคราะห์ Stanford โดยใช้แบบจำลองระบบประสาทซึ่งได้รับการฝึกฝนโดยใช้ Tensorflow นั้นเพิ่งมีให้ใช้เป็น python API โมเดลนี้ควรจะแม่นยำกว่าโมเอลที่ใช้ Java มาก คุณสามารถรวมเข้ากับท่อ NLTK ได้อย่างแน่นอน

ลิงก์ไปยังโปรแกรมแยกวิเคราะห์ ที่เก็บ Ther มีโมเดลตัวแยกวิเคราะห์ที่ผ่านการฝึกอบรมมาแล้วสำหรับ 53 ภาษา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.