Можно ли использовать Stanford Parser в NLTK? (Я не говорю о Stanford POS.)
Можно ли использовать Stanford Parser в NLTK? (Я не говорю о Stanford POS.)
Ответы:
Обратите внимание, что этот ответ относится к 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:
Примечание 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.
Загрузите NLTK v3 по ссылке : https://github.com/nltk/nltk . И установите NLTK:
sudo python setup.py установить
Вы можете использовать загрузчик NLTK, чтобы получить Stanford Parser, используя Python:
import nltk
nltk.download()
Попробуй мой пример! (не забудьте изменить пути к банкам и изменить путь модели к местоположению ser.gz)
ИЛИ:
Загрузите и установите NLTK v3, как указано выше.
Загрузите последнюю версию ( имя текущей версии - stanford-parser-full-2015-01-29.zip): http://nlp.stanford.edu/software/lex-parser.shtml#Download
Распакуйте standford-parser-full-20xx-xx-xx.zip.
Создайте новую папку (в моем примере - «jars»). Поместите извлеченные файлы в эту папку jar: stanford-parser-3.xx-models.jar и stanford-parser.jar.
Как показано выше, вы можете использовать переменные среды (STANFORD_PARSER & STANFORD_MODELS), чтобы указать на эту папку «jars». Я использую Linux, поэтому, если вы используете Windows, используйте что-то вроде: C: // folder // jars.
Откройте stanford-parser-3.xx-models.jar с помощью диспетчера архивов (7zip).
Просмотрите внутри jar-файла; edu / stanford / nlp / модели / lexparser. Снова извлеките файл с именем englishPCFG.ser.gz. Запомните место, в которое вы извлекаете этот файл ser.gz.
При создании экземпляра StanfordParser вы можете указать путь к модели в качестве параметра. Это полный путь к модели, в нашем случае /location/of/englishPCFG.ser.gz.
Попробуй мой пример! (не забудьте изменить пути к банкам и изменить путь модели к местоположению ser.gz)
nltk.parse.stanford
? У меня только nltk.tag.stanford
в НЛТК 2.0.4
.
AttributeError: 'StanfordParser' object has no attribute 'raw_batch_parse'
raw_parse_sents()
for line in sentences: for sentence in line: sentence.draw()
вы можете выполнить draw () только для объекта Tree;)
NLTK official 3rd party tools
документации.
Ответ ниже устарел, используйте решение на https://stackoverflow.com/a/51981566/610569 для NLTK v3.3 и выше.
Примечание. Следующий ответ будет работать только с:
Поскольку оба инструмента меняются довольно быстро, через 3-6 месяцев API может выглядеть совсем иначе. Пожалуйста, рассматривайте следующий ответ как временное, а не вечное исправление.
Всегда обращайтесь к https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software для получения последней инструкции о том, как взаимодействовать с инструментами Stanford NLP с помощью NLTK !!
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 через интерфейс командной строки.
Во-вторых , NLTK
API к инструментам Стэнфордского НЛП сильно изменился по сравнению с версией 3.1. Поэтому рекомендуется обновить ваш пакет NLTK до версии 3.1.
В-третьих , NLTK
API для 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
переменные не является устаревшим и используется БОЛЬШЕ
Предполагая, что вы правильно установили Java в своей ОС.
Теперь установите / обновите свою версию NLTK (см. Http://www.nltk.org/install.html ):
sudo pip install -U nltk
sudo apt-get install python-nltk
Для Windows (используйте 32-битную двоичную установку):
( Почему не 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)
Теперь, когда вы проверили, что у вас есть правильная версия 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:
Настройте переменные среды так, чтобы NLTK мог автоматически найти соответствующий путь к файлу. Вам необходимо установить следующие переменные:
Добавьте соответствующий .jar
файл Stanford NLP в CLASSPATH
переменную среды.
stanford-ner-2015-04-20/stanford-ner.jar
stanford-postagger-full-2015-04-20/stanford-postagger.jar
stanford-parser-full-2015-04-20/stanford-parser.jar
jar-файл модели парсера,stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
Добавьте в STANFORD_MODELS
переменную соответствующий каталог модели (т.е. каталог, в котором вы можете найти, где сохранены предварительно обученные модели)
stanford-ner-2015-04-20/classifiers/
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)
Ответ ниже устарел, используйте решение на 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
len(i.strip()) > 0
иначе я получил бы ошибку индекса. Я предполагаю, что в моем выводе парсера была хотя бы одна строка, которая была чисто пробельной.
'
s, вы получите странные ошибки. Есть более эффективные способы вызывать вещи из командной строки
Начиная с версии NLTK v3.3, пользователям следует избегать использования тегеров Stanford NER или POS nltk.tag
и избегать использования токенизатора / сегментера Stanford из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')]
list(parser.raw_parse(text))
или list(parser.parse(parser.tokenize(text))
. Поправил пример;)
Для стэнфордского парсера есть интерфейс Python
На странице программного обеспечения Stanford Core NLP есть список оболочек Python:
Если я хорошо помню, синтаксический анализатор Стэнфорда - это 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, но может быть способ выполнять вызовы из командной строки.
Возможно, это не совсем тот маршрут, на который вы надеялись, но, надеюсь, он вдохновит вас. Удачи.
Обратите внимание, что этот ответ относится к 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. Я пытался заставить его читать файл грамматики на месте в банке, но пока не смог.
Вы можете использовать выходные данные 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)
Обратите внимание, что этот ответ относится к 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.
Я работаю на компьютере с 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-программу с другого пути. Должен быть способ получше, но он работает.
Обратите внимание, что этот ответ относится к 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()
Обратите внимание, что этот ответ относится к 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
Я потратил много часов и наконец нашел простое решение для пользователей 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())
Ответ ниже устарел, используйте решение на https://stackoverflow.com/a/51981566/610569 для NLTK v3.3 и выше.
Примечание. Следующий ответ будет работать только с:
Поскольку оба инструмента меняются довольно быстро, через 3-6 месяцев API может выглядеть совсем иначе. Пожалуйста, рассматривайте следующий ответ как временное, а не вечное исправление.
Всегда обращайтесь к https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software для получения последней инструкции о том, как взаимодействовать с инструментами Stanford NLP с помощью NLTK !!
Следующий код взят с 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. Взгляните на строки документации!
Обратите внимание, что этот ответ относится к 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
без параметров, значение по умолчанию будет работать.
Я использую версию 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')]
Совсем недавно новая разработка Стэнфордского парсера, основанная на нейронной модели, обученная с помощью Tensorflow, стала доступной для использования в качестве API Python. Предполагается, что эта модель будет намного более точной, чем модель на основе Java. Вы, безусловно, можете интегрироваться с конвейером NLTK.
Ссылка на парсер. Репозиторий содержит предварительно обученные модели парсеров для 53 языков.