Стэнфордский парсер и NLTK


90

Можно ли использовать Stanford Parser в NLTK? (Я не говорю о Stanford 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()

Выход:

[Дерево ('КОРЕНЬ', [Дерево ('S', [Дерево ('INTJ', [Дерево ('UH', ['Привет'])]), Дерево (',', [',']), Дерево ('NP', [Дерево ('PRP $', ['My']), Дерево ('NN', ['name'])]), Дерево ('VP', [Дерево ('VBZ', [ 'is']), Tree ('ADJP', [Tree ('JJ', ['Melroy'])])]), Tree ('.', ['.'])])]), Tree (' КОРЕНЬ ', [Дерево (' SBARQ ', [Дерево (' WHNP ', [Дерево (' WP ', [' Что '])]), Дерево (' SQ ', [Дерево (' VBZ ', [' равно ' ]), Tree ('NP', [Tree ('PRP $', ['your']), Tree ('NN', ['name'])])]), Tree ('.', ['? '])])])]

Примечание 1. В этом примере 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). Воспользуйтесь менеджером архивов, чтобы «распаковать» файл 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, чтобы получить 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.xx-models.jar и stanford-parser.jar.

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

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

  6. Просмотрите внутри jar-файла; edu / stanford / nlp / модели / lexparser. Снова извлеките файл с именем englishPCFG.ser.gz. Запомните место, в которое вы извлекаете этот файл ser.gz.

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

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


1
Какая версия нлтк добавлена 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 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 (Дерево)). Итак, пример кода: for line in sentences: for sentence in line: sentence.draw() вы можете выполнить draw () только для объекта Tree;)
dangerous89

1
@ dangerous89, извините за перезапись вашего ответа примечанием EDITED. Недавно люди жаловались на парсер Stanford Dependency, добавленный только недавно, начиная с 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 составляется с 20 апреля 2015 г.
  • Python 2.7, 3.4 и 3.5 (Python 3.6 еще официально не поддерживается)

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

Всегда обращайтесь к 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 через интерфейс командной строки.

Во-вторых , NLTKAPI к инструментам Стэнфордского НЛП сильно изменился по сравнению с версией 3.1. Поэтому рекомендуется обновить ваш пакет NLTK до версии 3.1.

В-третьих , NLTKAPI для 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 ):

  • Используя 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 Стэнфордских инструментов НЛП:

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


ШАГ 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.jarjar-файл модели парсера,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 для STEP 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 и выше.


Отредактировано

В текущем парсере 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 в свой домашний каталог ~/, просто используйте этот рецепт 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
в качестве альтернативы, использовать этот питон обертку для Стэнфорде corenlp инструментов, bitbucket.org/torotoki/corenlp-python
Alvas

3
Будьте осторожны с этим. Если ваш ввод содержит какие-либо 's, вы получите странные ошибки. Есть более эффективные способы вызывать вещи из командной строки
Ник Гарви,

21

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

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

См. 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')]

Отличный ответ. Спасибо
Эбен

Спасибо, это очень полезно. Однако арабский синтаксический анализ неверен. Он
разбивает

Используйте list(parser.raw_parse(text))или list(parser.parse(parser.tokenize(text)). Поправил пример;)
alvas

1
Не могу поверить, что это больше не рекламируется !!
Nimitz14 03

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



6

Если я хорошо помню, синтаксический анализатор Стэнфорда - это java-библиотека, поэтому у вас должен быть интерпретатор Java, работающий на вашем сервере / компьютере.

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

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

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


6

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

Вот адаптация кода dangerous98, который работает с 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. Я пытался заставить его читать файл грамматики на месте в банке, но пока не смог.


Я из 1989 года, а не из 98, но спасибо за пример;)
dangerous89 09

4

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

Предположим, что stanford parser дает вам файл, в котором есть ровно одно дерево синтаксического анализа для каждого предложения. Тогда этот пример работает, хотя он может выглядеть не очень питоническим:

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, а не к более поздним версиям.

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

Небольшое обновление (или просто альтернатива) исчерпывающего ответа dangerous89 на использование 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-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 вам необходимо изменить все пути в абсолютный путь к ошибкам избежать ява , такие как «класс не найден»

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

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

  • найдите оболочку python для stanford coreNLP, чтобы получить версию python



2

Я потратил много часов и наконец нашел простое решение для пользователей Windows. В основном это обобщенная версия существующего ответа от alvas, но ее легко отслеживать (надеюсь) для тех, кто плохо знаком с станфордским НЛП и является пользователями Windows.

1) Загрузите модуль, который вы хотите использовать, например NER, POS и т. Д. В моем случае я хотел использовать NER, поэтому я загрузил модуль с http://nlp.stanford.edu/software/stanford-ner-2015- 04-20.zip

2) Разархивируйте файл.

3) Установите переменные среды (путь к классам и 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 составляется с 31 октября 2016 г.
  • Python 2.7, 3.5 и 3.6

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

Всегда обращайтесь к 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

Пожалуйста, посетите http://www.nltk.org/_modules/nltk/parse/corenlp.html для получения дополнительной информации о Stanford API. Взгляните на строки документации!


2

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

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

В отличном ответе alvas упоминается, что:

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

Это привело меня к неправильному выводу:

  • не будьте осторожны с ценностями, которые я придаю 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)

Решение только для парсера:

Следовательно, ошибка возникла из-за NLTKтого, как он ищет jar-файлы с использованием предоставленных переменных STANFORD_MODELSи CLASSPATHокружения. Чтобы решить эту проблему, файл *-models.jarс правильным форматированием (чтобы соответствовать регулярному выражению в NLTKкоде, поэтому без -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без параметров, значение по умолчанию будет работать.


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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.