Подтвердить что ты не робот

Стэнфордский Парсер и НЛТК

Можно ли использовать Stanford Parser в NLTK? (Я не говорю о Стэнфордском ПОС.)

4b9b3361

Ответ 1

Обратите внимание, что этот ответ относится к 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: В этом примере парсер & Баночки с моделями находятся в одной папке.

Примечание 2:

  • Имя файла анализатора Стэнфорда: stanford-parser.jar
  • Имя файла моделей Стэнфорда: stanford-parser-x.x.x-models.jar

Примечание 3: Файл englishPCFG.ser.gz можно найти внутри файла models.jar(/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz). Пожалуйста, используйте менеджер архивов для распаковки файла models.jar.

Примечание 4: Убедитесь, что вы используете Java JRE (среда выполнения) 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, чтобы получить Stanford Parser, используя Python:

    import nltk
    nltk.download()
    
  3. Попробуйте мой пример! (не забудьте изменить пути к банкам и изменить путь к модели на местоположение 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.x.x-models.jar и stanford-parser.jar.

    Как показано выше, вы можете использовать переменные окружения (STANFORD_PARSER & STANFORD_MODELS), чтобы указать на эту папку 'jars'. Я использую Linux, поэтому, если вы используете Windows, используйте что-то вроде: C://folder//jars.

  5. Откройте stanford-parser-3.x.x-models.jar с помощью диспетчера архивов (7zip).

  6. Просмотрите файл фляги; Edu/Стэнфорд /NLP/модели /lexparser. Снова извлеките файл с именем "englishPCFG.ser.gz". Запомните место, где вы извлекаете этот файл ser.gz.

  7. При создании экземпляра StanfordParser вы можете указать путь к модели в качестве параметра. Это полный путь к модели, в нашем случае /location/of/englishPCFG.ser.gz.

  8. Попробуйте мой пример! (не забудьте изменить пути jar и изменить путь модели в местоположение ser.gz)

Ответ 2

Устаревший ответ

Ответ ниже не рекомендуется, используйте решение на fooobar.com/questions/84038/... для 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; 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'])])]

В длинных:


Во-первых,, следует отметить, что инструменты Stanford NLP написаны на Java, а NLTK написаны на Python. NLTK взаимодействует с инструментом через вызов инструмента Java через интерфейс командной строки.

Во-вторых,API NLTK для инструментов Stanford NLP сильно изменился с версии 3.1. Поэтому рекомендуется обновить пакет NLTK до версии 3.1.

В-третьих,API NLTK для Stanford NLP Tools охватывает отдельные инструменты NLP, например, Stanford POS tagger, Stanford NER Tagger, Stanford Parser.

Для тегов POS и NER он НЕ охватывает пакет Stanford Core 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):

  • Используя пункт: 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-интерфейсы. Отсутствие ошибок при импорте не означает, что вы успешно настроил 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 мог автоматически находить соответствующий путь к файлу. Вы должны установить следующие переменные:

  • Добавьте соответствующий файл Stanford NLP .jar в переменную среды 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/
    • например для парсера модель каталога не будет.

В коде убедитесь, что он ищет каталог 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: инструкции по настройке переменных среды см. в fooobar.com/questions/26099/...)

Вы ДОЛЖНЫ установить переменные, как указано выше, до запуска 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)

Ответ 3

Устаревший ответ

Ответ ниже устарел, воспользуйтесь решением на fooobar.com/questions/84038/... для 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" через консоль.

После того, как вы установили " Стэнфордский парсер" в своем домашнем каталоге ~/, просто используйте этот рецепт 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

Ответ 4

Начиная с NLTK v3.3, пользователи должны избегать тегов Stanford NER или POS из nltk.tag и избегать токенайзера/сегментатора Stanford из nltk.tokenize.

Вместо этого используйте новый API nltk.parse.corenlp.CoreNLPParser.

Пожалуйста, смотрите 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', ['。'])])])]

Arabic

Запустите сервер:

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

Ответ 7

Если я хорошо помню, парсер Stanford - это Java-библиотека, поэтому на вашем сервере/компьютере должен быть Java-интерпретатор.

Я использовал его один раз на сервере в сочетании с php script. script используется функция php exec() для вызова командной строки для синтаксического анализатора следующим образом:

<?php

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

?>

Я не помню всех деталей этой команды, она в основном открыла fileToParse, проанализировала ее и написала вывод в файле результатов. Затем PHP откроет файл результатов для дальнейшего использования.

Конец команды направляет парсерный аргумент в NULL, чтобы предотвратить ненужную информацию из командной строки от нарушения script.

Я мало знаю о Python, но может быть способ сделать вызовы командной строки.

Возможно, это не тот точный маршрут, на который вы надеялись, но, надеюсь, это даст вам некоторое вдохновение. Удачи.

Ответ 8

EDITED

С 15 октября 2015 года библиотека PyPi была обновлена ​​с помощью NLTK v3.1, которая имеет стабилизированную версию API инструментов Stanford NLP. (https://pypi.python.org/pypi/nltk)

Кроме того, NLTK v3.1 может быть установлен с помощью диспетчера пакетов Ubuntu apt-get с https://launchpad.net/ubuntu/+source/nltk (см. https://github.com/nltk/nltk/issues/747)


Оригинальный ответ

Пакет PyPi (который загружается с помощью pip и easy_install) ужасно устарел (с 2012 года). Чтобы получить доступ к SP, вам необходимо загрузить последнюю сборку (https://github.com/nltk/nltk) и установить ее. Это позволит вам использовать решение, данное @Danger89

Ответ 9

Обратите внимание, что этот ответ относится к NLTK версии 3.0, а не к более поздним версиям.

Вот адаптация кода risk98, который работает с 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 в банке, но до сих пор этого не делал.

Ответ 10

Вы можете использовать вывод Stanford Parsers для создания дерева в nltk (nltk.tree.Tree).

Предполагая, что анализатор stanford дает вам файл, в котором для каждого предложения есть ровно одно дерево разбора. Тогда этот пример работает, хотя он может выглядеть не очень 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)

Ответ 11

Обратите внимание, что этот ответ относится к NLTK версии 3.0, а не к более поздним версиям.

Поскольку никто не упомянул об этом, и это как-то сильно меня беспокоило, вот альтернативный способ использования парсера Stanford в 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.

Ответ 12

Обратите внимание, что этот ответ относится к NLTK версии 3.0, а не к более поздним версиям.

Вот версия Windows 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 вам необходимо изменить все пути в абсолютный путь, чтобы избежать ошибок Java, таких как "класс не найден",

  • Я настоятельно рекомендую применить этот метод под окнами, так как я пробовал несколько ответов на странице и все методы обмениваются питом с ошибкой Java.

  • хочу услышать от вас, если вы преуспеете в окнах, и хотите, чтобы вы могли рассказать мне, как вы преодолеваете все эти проблемы.

  • Поиск python-оболочки для stanford coreNLP для получения версии python


Ответ 13

Я нахожусь на компьютере с 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 с другого пути. Должен быть лучший способ, но это работает.

Ответ 14

Обратите внимание, что этот ответ относится к NLTK версии 3.0, а не к более поздним версиям.

Небольшое обновление (или просто альтернатива) по поводу опасности89 всесторонний ответ на использование Stanford Parser в NLTK и Python

С stanford-parser-full-2015-04-20, JRE 1.8 и nltk 3.0.4 (python 2.7.6), кажется, что вам больше не нужно извлекать englishPCFG.ser.gz из моделей stanford-parser-xxx.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()

Ответ 15

Обратите внимание, что этот ответ относится к NLTK версии 3.0, а не к более поздним версиям.

Я не могу оставить это в качестве комментария из-за репутации, но поскольку я потратил (потратил впустую?) Некоторое время, решив это, я предпочел бы поделиться своей проблемой/решением, чтобы заставить этот парсер работать в NLTK.

В отличном ответе от alvas говорится, что:

например, для Parser не будет каталога моделей.

Это привело меня неправильно:

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

Если 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. Для получения дополнительной информации о Стэнфорде 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, с правильным форматированием (для соответствия регулярному выражению в коде 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 плавно загружаться в python с классическим CLASSPATH который указывает на stanford-parser.jar. Фактически, как таковой, вы можете вызвать StanfordParser без параметров, значение по умолчанию будет работать.

Ответ 16

Я занял много часов и, наконец, нашел простое решение для пользователей 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())

Ответ 17

Я использую версию 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')]

Ответ 18

Устаревший ответ

Ответ ниже устарел, воспользуйтесь решением на fooobar.com/questions/84038/... для 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; 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

Для получения дополнительной информации о Стэнфордском API см. Http://www.nltk.org/_modules/nltk/parse/corenlp.html. Взгляните на докстроны!

Ответ 19

Новая разработка синтаксического анализатора Stanford, основанная на нейронной модели, обученная с использованием Tensorflow, совсем недавно стала доступной для использования в качестве Python API. Предполагается, что эта модель будет гораздо более точной, чем основанная на Java программа. Вы, безусловно, можете интегрироваться с конвейером NLTK.

Ссылка на парсер. В хранилище содержатся предварительно обученные модели синтаксического анализатора для 53 языков.