Стенфорд Парсер та НЛТК


90

Чи можна використовувати Стенфордський парсер в NLTK? (Я не кажу про Стенфордський POS.)


6
Дивіться також: gist.github.com/alvations/e1df0ba227e542955a8a
alvas

3
Це посилання має бути більш видимим. Можливо, слід відредагувати верхню відповідь, щоб згадати про це?
Лало Санчес,

1
Тільки допоміжна записка тут, хлопці. Переконайтеся, що ваша Java оновлюється для Stanford NLP, а JAVA_HOME налаштовано належним чином. Іноді люди можуть отримувати "дивні" помилки, які можуть бути через це.
Мен Чжао

Відповіді:


89

Зауважте, що ця відповідь стосується 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()

Вихід:

[Дерево ('ROOT', [Дерево ('S', [Дерево ('INTJ', [Дерево ('UH', ['Привіт'])]), Дерево (',', [',']), Дерево ('NP', [Дерево ('PRP $', ['Моє']), Дерево ('NN', ['ім'я'])]), Дерево ('VP', [Дерево ('VBZ', [ 'is']), Tree ('ADJP', [Tree ('JJ', ['Melroy'])])]]), Tree ('.', ['.'])])]), Tree (' ROOT ', [Дерево (' SBARQ ', [Дерево (' WHNP ', [Дерево (' WP ', [' Що '])]), Дерево (' SQ ', [Дерево (' VBZ ', [' є ' ]), Tree ('NP', [Tree ('PRP $', ['your']), Tree ('NN', ['name'])])])), Tree ('.', ['? '])])])]

Примітка 1: У цьому прикладі банки аналізатора та моделі знаходяться в одній папці.

Примітка 2:

  • Назва файлу синтаксичного аналізатора Stanford: stanford-parser.jar
  • Назва файлу Stanford models: Stanford-parser-xxx-models.jar

Примітка 3. Файл englishPCFG.ser.gz можна знайти всередині файлу models.jar (/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz). Будь ласка, використовуйте менеджер архівів come, щоб «розпакувати» файл models.jar.

Примітка 4: Переконайтесь, що ви використовуєте Java JRE (Runtime Environment) 1.8 також відомий як Oracle JDK 8. В іншому випадку ви отримаєте: Непідтримувана major.minor версія 52.0.

Встановлення

  1. Завантажте NLTK v3 з: https://github.com/nltk/nltk . І встановіть NLTK:

    sudo python setup.py встановити

  2. Ви можете скористатися завантажувачем NLTK, щоб отримати Стенфордський парсер, використовуючи 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. Створіть нову папку ("баночки" в моєму прикладі). Помістіть витягнуті файли в цю папку jar: stanford-parser-3.xx-models.jar та stanford-parser.jar.

    Як показано вище, ви можете використовувати змінні середовища (STANFORD_PARSER & STANFORD_MODELS), щоб вказати на цю папку "jar". Я використовую Linux, тому, якщо ви використовуєте Windows, будь ласка, використовуйте щось на зразок: C: // folder // jar.

  5. Відкрийте stanford-parser-3.xx-models.jar за допомогою менеджера архівів (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.4.
Алексіс

1
AttributeError: 'StanfordParser' object has no attribute 'raw_batch_parse'
Нік Реталак

5
@alexis: скачати NLTK 3.0 з тут @Nick Реталлак: воно повинно бути зміненоraw_parse_sents()
Расік Перери

1
Гаразд, ти маєш рацію. NLTK змінює функцію на: raw_parse_sents (). Див. Документацію: nltk.org/_modules/nltk/parse/stanford.html Якщо ви використовуєте raw_parse (), ви отримаєте ітер (Дерево) як повернене значення. Це означає, що наведений вище зразок малювання () повинен працювати. Якщо ви використовуєте raw_parse_sents (), вам, мабуть, потрібен подвійний цикл; він повертає iter (iter (Дерево)). Отже, приклад коду: for line in sentences: for sentence in line: sentence.draw() Ви можете виконати draw () на об’єкті Дерева;)
danger89

1
@ danger89, вибачте, що переписали вашу відповідь ЗМЕНЕНОЮ нотаткою. Нещодавно люди скаржилися на те, що парсер Стенфордської залежності доданий нещодавно, оскільки NLTK v3.1, і я думаю, вони тут і там дублювали деякі фрагменти коду із застарілих відповідей тут. Тому, щоб мінімізувати плутанину, я вважав, що найкраще додати застереження до всіх відповідей тут щодо дотримання інструкцій з NLTK official 3rd party toolsдокументації.
альвас

77

Застаріла відповідь

Відповідь нижче застаріла, будь ласка, використовуйте рішення на https://stackoverflow.com/a/51981566/610569 для NLTK v3.3 і вище.


ВИДАЛЕНО

Примітка: Наступна відповідь буде працювати лише на:

  • Версія NLTK> = 3.2.4
  • Stanford Tools, складений з 20.04.2015
  • Python 2.7, 3.4 та 3.5 (Python 3.6 ще не підтримується офіційно)

Оскільки обидва інструменти змінюються досить швидко, і API може виглядати зовсім інакше через 3-6 місяців. Будь ласка, сприйміть наступну відповідь як часову, а не вічну виправлення.

Завжди звертайтесь до https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software для отримання останньої інструкції про те, як взаємодіяти інструменти Стенфордського NLP за допомогою 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

Тоді:

>>> 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 - на Python . Спосіб взаємодії NLTK з інструментом здійснюється через виклик інструменту Java через інтерфейс командного рядка.

По-друге , NLTKAPI для інструментів Stanford NLP досить сильно змінився з версії 3.1. Тож бажано оновити свій пакет NLTK до версії 3.1.

По-третє , NLTKAPI до Stanford NLP Tools обгортає окремі NLP-інструменти, наприклад, Stanford POS tagger , Stanford NER Tagger , Stanford Parser .

Для POS та NER мітки він НЕ обгортає пакет 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 (за допомогою 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. Не бачити помилок при імпорті, не означає, що ви успішно налаштували NLTK API для використання інструментів 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і файл моделі парсерної моделі,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/
    • наприклад, для синтаксичного аналізатора не буде каталогу моделі.

У коді переконайтеся, що він шукає 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, як пропонували попередні відповіді, але ви також можете безпосередньо сказати синтаксичному аналізатору / тегу ініціалізуватися до прямого шляху, де ви зберігали .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)

22

Застаріла відповідь

Відповідь нижче застаріла, будь ласка, використовуйте рішення на https://stackoverflow.com/a/51981566/610569 для NLTK v3.3 і вище.


Відредаговано

Станом на поточний Стенфордський синтаксичний аналізатор (20.04.2015), вихідні дані для lexparser.sh змінились, тому сценарій нижче не працюватиме.

Але ця відповідь зберігається як застаріла версія, проте вона все одно буде працювати з http://nlp.stanford.edu/software/stanford-parser-2012-11-12.zip .


Оригінальна відповідь

Я пропоную вам не возитися з Jython, JPype. Нехай python робить речі з python, а хай Java робить java-речі, отримуйте через консоль вихідні дані Stanford Parser.

Після того, як ви встановили Stanford Parser у вашому домашньому каталозі ~/, просто скористайтеся цим рецептом python, щоб отримати синтаксичний синтаксичний аналіз:

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, ви отримаєте дивні помилки. Є кращі способи зателефонувати за допомогою командного рядка
Нік Гарві,

20

Починаючи з NLTK v3.3, користувачі повинні уникати міток Stanford NER або POS від nltk.tag, а також уникати Stanford tokenizer / segmenter відnltk.tokenize .

Натомість використовуйте нове nltk.parse.corenlp.CoreNLPParser API.

Будь ласка, див. Https://github.com/nltk/nltk/wiki/Stanford-CoreNLP-API-in-NLTK


(Уникаючи відповіді лише на посилання, я вставив документи з вікі NLTK github нижче)

Спочатку оновіть свій 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')]

Відмінна відповідь. Дякую
Ебен

Дякую, це дуже корисно. Але арабський синтаксичний розбір неправильний. Це розбиває текст на літери замість слів
Labibah

Використовуйте list(parser.raw_parse(text))або list(parser.parse(parser.tokenize(text)). Виправлений приклад;)
alvas

1
Не можу повірити, що це більше не рекламується !!
Nimitz14,

1
На жаль, у NLTK не вистачає людей, які збираються навколо зустрічей, щоб вести переговори, або у них є ресурси для проведення дивовижної конференції розробників для просування інструменту = (Не соромтеся представляти цю функцію або NLTK для спільноти навколо вас.
alvas



6

Якщо я добре пам’ятаю, синтаксичний аналізатор Стенфорда - це бібліотека Java, тому на вашому сервері / комп’ютері повинен бути запущений інтерпретатор Java.

Я використовував його один раз на сервері в поєднанні з php-сценарієм. Сценарій використовував функцію exec () php для здійснення виклику синтаксичного аналізатора з командного рядка приблизно так:

<?php

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

?>

Я не пам'ятаю всіх деталей цієї команди, вона в основному відкрила файлToParse, проаналізувала його та записала вихідні дані у resultFile. Потім PHP відкриє файл результатів для подальшого використання.

Кінець команди спрямовує детальний аналізатор на NULL, щоб запобігти непотрібній інформації командного рядка, яка порушує сценарій.

Я не дуже багато знаю про Python, але може існувати спосіб зробити виклики командного рядка.

Можливо, це не точний маршрут, на який ви сподівалися, але, сподіваємось, це дасть вам деяке натхнення. Удачі.


6

Зауважте, що ця відповідь стосується NLTK v 3.0, а не новіших версій.

Ось адаптація коду небезпеки98, яка працює з 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. Я намагався змусити його прочитати граматичний файл in situ у банку, але досі цього не вдалося зробити.


Я з 1989 року не 98, але дякую за ваш приклад;)
небезпека89

4

Ви можете використати вивід Stanford Parsers для створення дерева в 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 та які параметри, синтаксичний аналіз вихідного файлу із парсерського аналізатора може відрізнятися. Було б добре, якщо б ви також додали деталі про те, як ви зателефонували в Стенфордський синтаксичний аналіз, щоб отримати вихідний файл.
alvas

4

Зауважте, що ця відповідь стосується NLTK v 3.0, а не новіших версій.

Оскільки ніхто насправді не згадував, і це мене якось сильно турбувало, ось альтернативний спосіб використання парфордського парсера в 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, і ви можете просто запустити парсер нормально, як це робиться за допомогою команди like, але як в іншому каталозі, тому вам не потрібно редагувати файл 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, а не новіших версій.

Невелике оновлення (або просто альтернатива) вичерпної відповіді небезпеки89 щодо використання Стенфордського аналізатора в NLTK та Python

З допомогою stanford-parser-full-20.04.2015, JRE 1.8 та nltk 3.0.4 (python 2.7.6), здається, вам більше не потрібно витягувати englishPCFG.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

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 вам необхідно змінити всі шляхи в абсолютний шлях до помилок уникнути ява , такі як «клас не найден»

  • Я настійно рекомендую вам застосувати цей метод під Windows, оскільки я спробував кілька відповідей на сторінці, і всі методи повідомляють python з Java не вдається.

  • хотіли б почути вас, якщо ви досягли успіху у вікнах, і хотіли б сказати мені, як ви подолали всі ці проблеми.

  • шукати обгортку python для Stanford coreNLP, щоб отримати версію python



2

Я зайняв багато годин і нарешті знайшов просте рішення для користувачів Windows. В основному це узагальнена версія існуючої відповіді від alvas, але вона стала простою для спостереження (сподіваємось) для тих, хто новачок у Стенфордському НЛП і є користувачем 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 для отримання останньої інструкції про те, як взаємодіяти інструменти Стенфордського NLP за допомогою NLTK !!

TL; DR

Наступний код походить від 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 для отримання додаткової інформації про Стенфордський API. Погляньте на документацію!


2

Зауважте, що ця відповідь стосується NLTK v 3.0, а не новіших версій.

Я не можу залишити це як коментар через репутацію, але оскільки я витратив (змарнував?) Деякий час на вирішення цього питання, я б скоріше поділився своєю проблемою / рішенням, щоб змусити цей парсер працювати в NLTK.

У чудовій відповіді від alvas згадується, що:

наприклад, для синтаксичного аналізатора не буде каталогу моделі.

Це призвело мене помилково до:

  • не будь обережним до цінності, яку я приділяю STANFORD_MODELS (і дбаю лише про свою CLASSPATH)
  • залиште ../path/tostanford-parser-full-2015-2012-09/models directory* практично порожнім * (або з jar-файлом, ім'я якого не відповідає регулярному виразу nltk)!

Якщо ОП, як і я, просто хотів скористатися парсером, може бути заплутаним тим, що, не завантажуючи нічого іншого (ні POStagger, ні NER, ...) і дотримуючись усіх цих інструкцій, ми все одно отримуємо помилку.

Врешті-решт, для будь-якого з CLASSPATHподаних (наступних прикладів та пояснень у відповідях із цієї теми) я все одно отримаю помилку:

NLTK не вдалося знайти синтаксичний парсер - (\ d +) (. (\ D +)) + - models.jar! Встановіть змінну середовища CLASSPATH. Для отримання додаткової інформації про парфорд-парсер - (\ 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)

Рішення лише для аналізатора:

Тому помилка виникла в тому, NLTKяк вона шукає банки, використовуючи вхідні змінні STANFORD_MODELSта CLASSPATHзмінні середовища. Щоб вирішити цю проблему, файл *-models.jarз правильним форматуванням (щоб відповідати регулярному NLTKвиразу в коді, тому немає jar -corenlp -....) повинен знаходитися в папці, позначеній 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би плавно завантажувати python з класикою, на 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')]

Я думаю, що це мітка, а не парсер
Надав Б

1

Нещодавно з’явилася нова розробка Стенфордського синтаксичного аналізатора, заснована на нейронній моделі, навчена Tensorflow, яка може використовуватися як API python. Ця модель повинна бути набагато точнішою, ніж моел на базі Java. Ви, звичайно, можете інтегруватися з конвеєром NLTK.

Посилання на парсер. Репозиторій містить попередньо навчені моделі синтаксичного аналізу для 53 мов.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.