Чи можна використовувати Стенфордський парсер в NLTK? (Я не кажу про Стенфордський POS.)
Чи можна використовувати Стенфордський парсер в NLTK? (Я не кажу про Стенфордський 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()
Вихід:
[Дерево ('ROOT', [Дерево ('S', [Дерево ('INTJ', [Дерево ('UH', ['Привіт'])]), Дерево (',', [',']), Дерево ('NP', [Дерево ('PRP $', ['Моє']), Дерево ('NN', ['ім'я'])]), Дерево ('VP', [Дерево ('VBZ', [ 'is']), Tree ('ADJP', [Tree ('JJ', ['Melroy'])])]]), Tree ('.', ['.'])])]), Tree (' ROOT ', [Дерево (' SBARQ ', [Дерево (' WHNP ', [Дерево (' WP ', [' Що '])]), Дерево (' SQ ', [Дерево (' VBZ ', [' є ' ]), Tree ('NP', [Tree ('PRP $', ['your']), Tree ('NN', ['name'])])])), Tree ('.', ['? '])])])]
Примітка 1: У цьому прикладі банки аналізатора та моделі знаходяться в одній папці.
Примітка 2:
Примітка 3. Файл englishPCFG.ser.gz можна знайти всередині файлу models.jar (/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz). Будь ласка, використовуйте менеджер архівів come, щоб «розпакувати» файл models.jar.
Примітка 4: Переконайтесь, що ви використовуєте Java JRE (Runtime Environment) 1.8 також відомий як Oracle JDK 8. В іншому випадку ви отримаєте: Непідтримувана major.minor версія 52.0.
Завантажте NLTK v3 з: https://github.com/nltk/nltk . І встановіть NLTK:
sudo python setup.py встановити
Ви можете скористатися завантажувачем NLTK, щоб отримати Стенфордський парсер, використовуючи Python:
import nltk
nltk.download()
Спробуйте мій приклад! (не забудьте змінити шляхи jar та змініть шлях моделі до розташування 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.
Створіть нову папку ("баночки" в моєму прикладі). Помістіть витягнуті файли в цю папку jar: stanford-parser-3.xx-models.jar та stanford-parser.jar.
Як показано вище, ви можете використовувати змінні середовища (STANFORD_PARSER & STANFORD_MODELS), щоб вказати на цю папку "jar". Я використовую Linux, тому, якщо ви використовуєте Windows, будь ласка, використовуйте щось на зразок: C: // folder // jar.
Відкрийте stanford-parser-3.xx-models.jar за допомогою менеджера архівів (7zip).
Переглянути всередині файлу jar; edu / stanford / nlp / models / lexparser. Знову витягніть файл під назвою 'englishPCFG.ser.gz'. Запам’ятайте місце, де ви витягли цей файл ser.gz.
Створюючи екземпляр StanfordParser, ви можете вказати шлях до моделі як параметр. Це повний шлях до моделі, у нашому випадку /location/of/englishPCFG.ser.gz.
Спробуйте мій приклад! (не забудьте змінити шляхи jar та змініть шлях моделі до розташування 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 () на об’єкті Дерева;)
NLTK official 3rd party tools
документації.
Відповідь нижче застаріла, будь ласка, використовуйте рішення на https://stackoverflow.com/a/51981566/610569 для NLTK v3.3 і вище.
Примітка: Наступна відповідь буде працювати лише на:
Оскільки обидва інструменти змінюються досить швидко, і API може виглядати зовсім інакше через 3-6 місяців. Будь ласка, сприйміть наступну відповідь як часову, а не вічну виправлення.
Завжди звертайтесь до https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software для отримання останньої інструкції про те, як взаємодіяти інструменти Стенфордського 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'])])]
По-перше , слід зазначити, що інструменти Стенфордського NLP написані на Java, а NLTK - на Python . Спосіб взаємодії NLTK з інструментом здійснюється через виклик інструменту Java через інтерфейс командного рядка.
По-друге , NLTK
API для інструментів Stanford NLP досить сильно змінився з версії 3.1. Тож бажано оновити свій пакет NLTK до версії 3.1.
По-третє , NLTK
API до Stanford NLP Tools обгортає окремі NLP-інструменти, наприклад, Stanford POS tagger , Stanford NER Tagger , Stanford Parser .
Для POS та NER мітки він НЕ обгортає пакет Stanford Core NLP .
Для Стенфордського синтаксичного аналізатора це особливий випадок, коли він охоплює як Стенфордський синтаксичний аналізатор, так і Стенфордський основний НЛП (особисто я не використовував останній за допомогою NLTK, я б скоріше пішов за демонстрацією @ dimazest на http: //www.eecs. qmul.ac.uk/~dm303/stanford-dependency-parser-nltk-and-anaconda.html )
Слід зазначити , що станом NLTK v3.1, то STANFORD_JAR
і STANFORD_PARSER
змінні не є застарілим і використовується БІЛЬШЕ
Припускаючи, що ви належним чином встановили 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 інструментів Stanford NLP:
from nltk.parse.stanford import StanfordParser
from nltk.parse.stanford import StanfordDependencyParser
from nltk.parse.stanford import StanfordNeuralDependencyParser
from nltk.tag.stanford import StanfordPOSTagger, StanfordNERTagger
from nltk.tokenize.stanford import StanfordTokenizer
( Примітка : Імпорт, наведений вище, ТІЛЬКИ гарантує, що ви використовуєте правильну версію NLTK, що містить ці API. Не бачити помилок при імпорті, не означає, що ви успішно налаштували NLTK API для використання інструментів Stanford)
Тепер, коли ви перевірили, чи маєте ви правильну версію 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
і файл моделі парсерної моделі,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 для КРОКУ 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 і вище.
Станом на поточний Стенфордський синтаксичний аналізатор (20.04.2015), вихідні дані для lexparser.sh
змінились, тому сценарій нижче не працюватиме.
Але ця відповідь зберігається як застаріла версія, проте вона все одно буде працювати з http://nlp.stanford.edu/software/stanford-parser-2012-11-12.zip .
Я пропоную вам не возитися з Jython, JPype. Нехай python робить речі з python, а хай Java робить java-речі, отримуйте через консоль вихідні дані Stanford Parser.
Після того, як ви встановили Stanford Parser у вашому домашньому каталозі ~/
, просто скористайтеся цим рецептом python, щоб отримати синтаксичний синтаксичний аналіз:
import os
sentence = "this is a foo bar i want to parse."
os.popen("echo '"+sentence+"' > ~/stanfordtemp.txt")
parser_out = os.popen("~/stanford-parser-2012-11-12/lexparser.sh ~/stanfordtemp.txt").readlines()
bracketed_parse = " ".join( [i.strip() for i in parser_out if i.strip()[0] == "("] )
print bracketed_parse
len(i.strip()) > 0
інакше я отримав помилку індексу. Я думаю, у моєму висновку парсера був принаймні один рядок, який був просто пробілом.
'
s, ви отримаєте дивні помилки. Є кращі способи зателефонувати за допомогою командного рядка
Починаючи з NLTK v3.3, користувачі повинні уникати міток Stanford NER або POS від nltk.tag
, а також уникати Stanford tokenizer / segmenter відnltk.tokenize
.
Натомість використовуйте нове nltk.parse.corenlp.CoreNLPParser
API.
Будь ласка, див. Https://github.com/nltk/nltk/wiki/Stanford-CoreNLP-API-in-NLTK
(Уникаючи відповіді лише на посилання, я вставив документи з вікі NLTK github нижче)
Спочатку оновіть свій NLTK
pip3 install -U nltk # Make sure is >=3.3
Потім завантажте необхідні пакети CoreNLP:
cd ~
wget http://nlp.stanford.edu/software/stanford-corenlp-full-2018-02-27.zip
unzip stanford-corenlp-full-2018-02-27.zip
cd stanford-corenlp-full-2018-02-27
# Get the Chinese model
wget http://nlp.stanford.edu/software/stanford-chinese-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-chinese.properties
# Get the Arabic model
wget http://nlp.stanford.edu/software/stanford-arabic-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-arabic.properties
# Get the French model
wget http://nlp.stanford.edu/software/stanford-french-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-french.properties
# Get the German model
wget http://nlp.stanford.edu/software/stanford-german-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-german.properties
# Get the Spanish model
wget http://nlp.stanford.edu/software/stanford-spanish-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-spanish.properties
Залишившись у stanford-corenlp-full-2018-02-27
каталозі, запустіть сервер:
java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-preload tokenize,ssplit,pos,lemma,ner,parse,depparse \
-status_port 9000 -port 9000 -timeout 15000 &
Потім у Python:
>>> from nltk.parse import CoreNLPParser
# Lexical Parser
>>> parser = CoreNLPParser(url='http://localhost:9000')
# Parse tokenized text.
>>> list(parser.parse('What is the airspeed of an unladen swallow ?'.split()))
[Tree('ROOT', [Tree('SBARQ', [Tree('WHNP', [Tree('WP', ['What'])]), Tree('SQ', [Tree('VBZ', ['is']), Tree('NP', [Tree('NP', [Tree('DT', ['the']), Tree('NN', ['airspeed'])]), Tree('PP', [Tree('IN', ['of']), Tree('NP', [Tree('DT', ['an']), Tree('JJ', ['unladen'])])]), Tree('S', [Tree('VP', [Tree('VB', ['swallow'])])])])]), Tree('.', ['?'])])])]
# Parse raw string.
>>> list(parser.raw_parse('What is the airspeed of an unladen swallow ?'))
[Tree('ROOT', [Tree('SBARQ', [Tree('WHNP', [Tree('WP', ['What'])]), Tree('SQ', [Tree('VBZ', ['is']), Tree('NP', [Tree('NP', [Tree('DT', ['the']), Tree('NN', ['airspeed'])]), Tree('PP', [Tree('IN', ['of']), Tree('NP', [Tree('DT', ['an']), Tree('JJ', ['unladen'])])]), Tree('S', [Tree('VP', [Tree('VB', ['swallow'])])])])]), Tree('.', ['?'])])])]
# Neural Dependency Parser
>>> from nltk.parse.corenlp import CoreNLPDependencyParser
>>> dep_parser = CoreNLPDependencyParser(url='http://localhost:9000')
>>> parses = dep_parser.parse('What is the airspeed of an unladen swallow ?'.split())
>>> [[(governor, dep, dependent) for governor, dep, dependent in parse.triples()] for parse in parses]
[[(('What', 'WP'), 'cop', ('is', 'VBZ')), (('What', 'WP'), 'nsubj', ('airspeed', 'NN')), (('airspeed', 'NN'), 'det', ('the', 'DT')), (('airspeed', 'NN'), 'nmod', ('swallow', 'VB')), (('swallow', 'VB'), 'case', ('of', 'IN')), (('swallow', 'VB'), 'det', ('an', 'DT')), (('swallow', 'VB'), 'amod', ('unladen', 'JJ')), (('What', 'WP'), 'punct', ('?', '.'))]]
# Tokenizer
>>> parser = CoreNLPParser(url='http://localhost:9000')
>>> list(parser.tokenize('What is the airspeed of an unladen swallow?'))
['What', 'is', 'the', 'airspeed', 'of', 'an', 'unladen', 'swallow', '?']
# POS Tagger
>>> pos_tagger = CoreNLPParser(url='http://localhost:9000', tagtype='pos')
>>> list(pos_tagger.tag('What is the airspeed of an unladen swallow ?'.split()))
[('What', 'WP'), ('is', 'VBZ'), ('the', 'DT'), ('airspeed', 'NN'), ('of', 'IN'), ('an', 'DT'), ('unladen', 'JJ'), ('swallow', 'VB'), ('?', '.')]
# NER Tagger
>>> ner_tagger = CoreNLPParser(url='http://localhost:9000', tagtype='ner')
>>> list(ner_tagger.tag(('Rami Eid is studying at Stony Brook University in NY'.split())))
[('Rami', 'PERSON'), ('Eid', 'PERSON'), ('is', 'O'), ('studying', 'O'), ('at', 'O'), ('Stony', 'ORGANIZATION'), ('Brook', 'ORGANIZATION'), ('University', 'ORGANIZATION'), ('in', 'O'), ('NY', 'STATE_OR_PROVINCE')]
Запустіть сервер трохи інакше, все ще з каталогу `stanford-corenlp-full-2018-02-27:
java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-serverProperties StanfordCoreNLP-chinese.properties \
-preload tokenize,ssplit,pos,lemma,ner,parse \
-status_port 9001 -port 9001 -timeout 15000
У Python:
>>> parser = CoreNLPParser('http://localhost:9001')
>>> list(parser.tokenize(u'我家没有电脑。'))
['我家', '没有', '电脑', '。']
>>> list(parser.parse(parser.tokenize(u'我家没有电脑。')))
[Tree('ROOT', [Tree('IP', [Tree('IP', [Tree('NP', [Tree('NN', ['我家'])]), Tree('VP', [Tree('VE', ['没有']), Tree('NP', [Tree('NN', ['电脑'])])])]), Tree('PU', ['。'])])])]
Запустіть сервер:
java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-serverProperties StanfordCoreNLP-arabic.properties \
-preload tokenize,ssplit,pos,parse \
-status_port 9005 -port 9005 -timeout 15000
У Python:
>>> from nltk.parse import CoreNLPParser
>>> parser = CoreNLPParser('http://localhost:9005')
>>> text = u'انا حامل'
# Parser.
>>> parser.raw_parse(text)
<list_iterator object at 0x7f0d894c9940>
>>> list(parser.raw_parse(text))
[Tree('ROOT', [Tree('S', [Tree('NP', [Tree('PRP', ['انا'])]), Tree('NP', [Tree('NN', ['حامل'])])])])]
>>> list(parser.parse(parser.tokenize(text)))
[Tree('ROOT', [Tree('S', [Tree('NP', [Tree('PRP', ['انا'])]), Tree('NP', [Tree('NN', ['حامل'])])])])]
# Tokenizer / Segmenter.
>>> list(parser.tokenize(text))
['انا', 'حامل']
# POS tagg
>>> pos_tagger = CoreNLPParser('http://localhost:9005', tagtype='pos')
>>> list(pos_tagger.tag(parser.tokenize(text)))
[('انا', 'PRP'), ('حامل', 'NN')]
# NER tag
>>> ner_tagger = CoreNLPParser('http://localhost:9005', tagtype='ner')
>>> list(ner_tagger.tag(parser.tokenize(text)))
[('انا', 'O'), ('حامل', 'O')]
Запустіть сервер:
java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-serverProperties StanfordCoreNLP-french.properties \
-preload tokenize,ssplit,pos,parse \
-status_port 9004 -port 9004 -timeout 15000
У Python:
>>> parser = CoreNLPParser('http://localhost:9004')
>>> list(parser.parse('Je suis enceinte'.split()))
[Tree('ROOT', [Tree('SENT', [Tree('NP', [Tree('PRON', ['Je']), Tree('VERB', ['suis']), Tree('AP', [Tree('ADJ', ['enceinte'])])])])])]
>>> pos_tagger = CoreNLPParser('http://localhost:9004', tagtype='pos')
>>> pos_tagger.tag('Je suis enceinte'.split())
[('Je', 'PRON'), ('suis', 'VERB'), ('enceinte', 'ADJ')]
Запустіть сервер:
java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-serverProperties StanfordCoreNLP-german.properties \
-preload tokenize,ssplit,pos,ner,parse \
-status_port 9002 -port 9002 -timeout 15000
У Python:
>>> parser = CoreNLPParser('http://localhost:9002')
>>> list(parser.raw_parse('Ich bin schwanger'))
[Tree('ROOT', [Tree('NUR', [Tree('S', [Tree('PPER', ['Ich']), Tree('VAFIN', ['bin']), Tree('AP', [Tree('ADJD', ['schwanger'])])])])])]
>>> list(parser.parse('Ich bin schwanger'.split()))
[Tree('ROOT', [Tree('NUR', [Tree('S', [Tree('PPER', ['Ich']), Tree('VAFIN', ['bin']), Tree('AP', [Tree('ADJD', ['schwanger'])])])])])]
>>> pos_tagger = CoreNLPParser('http://localhost:9002', tagtype='pos')
>>> pos_tagger.tag('Ich bin schwanger'.split())
[('Ich', 'PPER'), ('bin', 'VAFIN'), ('schwanger', 'ADJD')]
>>> pos_tagger = CoreNLPParser('http://localhost:9002', tagtype='pos')
>>> pos_tagger.tag('Ich bin schwanger'.split())
[('Ich', 'PPER'), ('bin', 'VAFIN'), ('schwanger', 'ADJD')]
>>> ner_tagger = CoreNLPParser('http://localhost:9002', tagtype='ner')
>>> ner_tagger.tag('Donald Trump besuchte Angela Merkel in Berlin.'.split())
[('Donald', 'PERSON'), ('Trump', 'PERSON'), ('besuchte', 'O'), ('Angela', 'PERSON'), ('Merkel', 'PERSON'), ('in', 'O'), ('Berlin', 'LOCATION'), ('.', 'O')]
Запустіть сервер:
java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-serverProperties StanfordCoreNLP-spanish.properties \
-preload tokenize,ssplit,pos,ner,parse \
-status_port 9003 -port 9003 -timeout 15000
У Python:
>>> pos_tagger = CoreNLPParser('http://localhost:9003', tagtype='pos')
>>> pos_tagger.tag(u'Barack Obama salió con Michael Jackson .'.split())
[('Barack', 'PROPN'), ('Obama', 'PROPN'), ('salió', 'VERB'), ('con', 'ADP'), ('Michael', 'PROPN'), ('Jackson', 'PROPN'), ('.', 'PUNCT')]
>>> ner_tagger = CoreNLPParser('http://localhost:9003', tagtype='ner')
>>> ner_tagger.tag(u'Barack Obama salió con Michael Jackson .'.split())
[('Barack', 'PERSON'), ('Obama', 'PERSON'), ('salió', 'O'), ('con', 'O'), ('Michael', 'PERSON'), ('Jackson', 'PERSON'), ('.', 'O')]
list(parser.raw_parse(text))
або list(parser.parse(parser.tokenize(text))
. Виправлений приклад;)
Існує інтерфейс python для синтаксичного аналізатора Stanford
На сторінці програмного забезпечення Stanford Core NLP є список обгортки python:
Якщо я добре пам’ятаю, синтаксичний аналізатор Стенфорда - це бібліотека Java, тому на вашому сервері / комп’ютері повинен бути запущений інтерпретатор Java.
Я використовував його один раз на сервері в поєднанні з php-сценарієм. Сценарій використовував функцію exec () php для здійснення виклику синтаксичного аналізатора з командного рядка приблизно так:
<?php
exec( "java -cp /pathTo/stanford-parser.jar -mx100m edu.stanford.nlp.process.DocumentPreprocessor /pathTo/fileToParse > /pathTo/resultFile 2>/dev/null" );
?>
Я не пам'ятаю всіх деталей цієї команди, вона в основному відкрила файлToParse, проаналізувала його та записала вихідні дані у resultFile. Потім PHP відкриє файл результатів для подальшого використання.
Кінець команди спрямовує детальний аналізатор на NULL, щоб запобігти непотрібній інформації командного рядка, яка порушує сценарій.
Я не дуже багато знаю про Python, але може існувати спосіб зробити виклики командного рядка.
Можливо, це не точний маршрут, на який ви сподівалися, але, сподіваємось, це дасть вам деяке натхнення. Удачі.
Зауважте, що ця відповідь стосується NLTK v 3.0, а не новіших версій.
Ось адаптація коду небезпеки98, яка працює з nltk3.0.0 на windoze, і, мабуть, також на інших платформах, налаштуйте імена каталогів відповідно до ваших налаштувань:
import os
from nltk.parse import stanford
os.environ['STANFORD_PARSER'] = 'd:/stanford-parser'
os.environ['STANFORD_MODELS'] = 'd:/stanford-parser'
os.environ['JAVAHOME'] = 'c:/Program Files/java/jre7/bin'
parser = stanford.StanfordParser(model_path="d:/stanford-grammars/englishPCFG.ser.gz")
sentences = parser.raw_parse_sents(("Hello, My name is Melroy.", "What is your name?"))
print sentences
Зверніть увагу, що команда аналізу змінилася (див. Вихідний код на www.nltk.org/_modules/nltk/parse/stanford.html) і що вам потрібно визначити змінну JAVAHOME. Я намагався змусити його прочитати граматичний файл in situ у банку, але досі цього не вдалося зробити.
Ви можете використати вивід Stanford Parsers для створення дерева в nltk (nltk.tree.Tree).
Якщо припустити, що синтаксичний аналізатор Стенфорда дає вам файл, в якому для кожного речення існує рівно одне дерево синтаксичного аналізу. Тоді цей приклад працює, хоча це може виглядати не дуже пітонічно:
f = open(sys.argv[1]+".output"+".30"+".stp", "r")
parse_trees_text=[]
tree = ""
for line in f:
if line.isspace():
parse_trees_text.append(tree)
tree = ""
elif "(. ...))" in line:
#print "YES"
tree = tree+')'
parse_trees_text.append(tree)
tree = ""
else:
tree = tree + line
parse_trees=[]
for t in parse_trees_text:
tree = nltk.Tree(t)
tree.__delitem__(len(tree)-1) #delete "(. .))" from tree (you don't need that)
s = traverse(tree)
parse_trees.append(tree)
Зауважте, що ця відповідь стосується 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, і ви можете просто запустити парсер нормально, як це робиться за допомогою команди like, але як в іншому каталозі, тому вам не потрібно редагувати файл lexparser.bat. Просто поставте на повний шлях.
cmd = r'java -cp \Documents\stanford_nlp\stanford-parser-full-2015-01-30 edu.stanford.nlp.parser.lexparser.LexicalizedParser -outputFormat "typedDependencies" \Documents\stanford_nlp\stanford-parser-full-2015-01-30\stanford-parser-3.5.1-models\edu\stanford\nlp\models\lexparser\englishFactored.ser.gz stanfordtemp.txt'
parse_out = os.popen(cmd).readlines()
Складною частиною для мене було усвідомлення того, як запустити програму Java з іншого шляху. Має бути кращий спосіб, але це працює.
Зауважте, що ця відповідь стосується NLTK v 3.0, а не новіших версій.
Невелике оновлення (або просто альтернатива) вичерпної відповіді небезпеки89 щодо використання Стенфордського аналізатора в NLTK та Python
З допомогою stanford-parser-full-20.04.2015, JRE 1.8 та nltk 3.0.4 (python 2.7.6), здається, вам більше не потрібно витягувати englishPCFG.ser.gz із stanford-parser-xxx-models .jar або налаштування будь-якого os.environ
from nltk.parse.stanford import StanfordParser
english_parser = StanfordParser('path/stanford-parser.jar', 'path/stanford-parser-3.5.2-models.jar')
s = "The real voyage of discovery consists not in seeking new landscapes, but in having new eyes."
sentences = english_parser.raw_parse_sents((s,))
print sentences #only print <listiterator object> for this version
#draw the tree
for line in sentences:
for sentence in line:
sentence.draw()
Зауважте, що ця відповідь стосується NLTK v 3.0, а не новіших версій.
Ось версія вікна відповіді alvas
sentences = ('. '.join(['this is sentence one without a period','this is another foo bar sentence '])+'.').encode('ascii',errors = 'ignore')
catpath =r"YOUR CURRENT FILE PATH"
f = open('stanfordtemp.txt','w')
f.write(sentences)
f.close()
parse_out = os.popen(catpath+r"\nlp_tools\stanford-parser-2010-08-20\lexparser.bat "+catpath+r"\stanfordtemp.txt").readlines()
bracketed_parse = " ".join( [i.strip() for i in parse_out if i.strip() if i.strip()[0] == "("] )
bracketed_parse = "\n(ROOT".join(bracketed_parse.split(" (ROOT")).split('\n')
aa = map(lambda x :ParentedTree.fromstring(x),bracketed_parse)
ПРИМІТКИ:
В lexparser.bat
вам необхідно змінити всі шляхи в абсолютний шлях до помилок уникнути ява , такі як «клас не найден»
Я настійно рекомендую вам застосувати цей метод під Windows, оскільки я спробував кілька відповідей на сторінці, і всі методи повідомляють python з Java не вдається.
хотіли б почути вас, якщо ви досягли успіху у вікнах, і хотіли б сказати мені, як ви подолали всі ці проблеми.
шукати обгортку python для Stanford coreNLP, щоб отримати версію python
Я зайняв багато годин і нарешті знайшов просте рішення для користувачів Windows. В основному це узагальнена версія існуючої відповіді від alvas, але вона стала простою для спостереження (сподіваємось) для тих, хто новачок у Стенфордському НЛП і є користувачем Window.
1) Завантажте модуль, який ви хочете використовувати, наприклад, NER, POS тощо. У моєму випадку я хотів використовувати NER, тому завантажив модуль з http://nlp.stanford.edu/software/stanford-ner-2015- 04-20.zip
2) Розпакуйте файл.
3) Встановіть змінні середовища (classpath та stanford_modules) із розпакованої папки.
import os
os.environ['CLASSPATH'] = "C:/Users/Downloads/stanford-ner-2015-04-20/stanford-ner.jar"
os.environ['STANFORD_MODELS'] = "C:/Users/Downloads/stanford-ner-2015-04-20/classifiers/"
4) встановіть змінні середовища для JAVA, як там, де ви встановили JAVA. для мене це було нижче
os.environ['JAVAHOME'] = "C:/Program Files/Java/jdk1.8.0_102/bin/java.exe"
5) імпортуйте потрібний модуль
from nltk.tag import StanfordNERTagger
6) викликати попередньо навчену модель, яка присутня в папці класифікатора в розпакованій папці. додайте ".gz" в кінці для розширення файлу. для мене моделлю, яку я хотів використовувати, булаenglish.all.3class.distsim.crf.ser
st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz')
7) Тепер запустіть парсер !! і ми закінчили !!
st.tag('Rami Eid is studying at Stony Brook University in NY'.split())
Відповідь нижче застаріла, будь ласка, використовуйте рішення на https://stackoverflow.com/a/51981566/610569 для NLTK v3.3 і вище.
Примітка: Наступна відповідь буде працювати лише на:
Оскільки обидва інструменти змінюються досить швидко, і API може виглядати зовсім інакше через 3-6 місяців. Будь ласка, сприйміть наступну відповідь як часову, а не вічну виправлення.
Завжди звертайтесь до https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software для отримання останньої інструкції про те, як взаємодіяти інструменти Стенфордського 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 для отримання додаткової інформації про Стенфордський API. Погляньте на документацію!
Зауважте, що ця відповідь стосується NLTK v 3.0, а не новіших версій.
Я не можу залишити це як коментар через репутацію, але оскільки я витратив (змарнував?) Деякий час на вирішення цього питання, я б скоріше поділився своєю проблемою / рішенням, щоб змусити цей парсер працювати в NLTK.
У чудовій відповіді від alvas згадується, що:
наприклад, для синтаксичного аналізатора не буде каталогу моделі.
Це призвело мене помилково до:
STANFORD_MODELS
(і дбаю лише про свою CLASSPATH
)../path/tostanford-parser-full-2015-2012-09/models directory
* практично порожнім * (або з jar-файлом, ім'я якого не відповідає регулярному виразу nltk)!Якщо ОП, як і я, просто хотів скористатися парсером, може бути заплутаним тим, що, не завантажуючи нічого іншого (ні POStagger, ні NER, ...) і дотримуючись усіх цих інструкцій, ми все одно отримуємо помилку.
Врешті-решт, для будь-якого з CLASSPATH
поданих (наступних прикладів та пояснень у відповідях із цієї теми) я все одно отримаю помилку:
NLTK не вдалося знайти синтаксичний парсер - (\ d +) (. (\ D +)) + - models.jar! Встановіть змінну середовища CLASSPATH. Для отримання додаткової інформації про парфорд-парсер - (\ d +) (. (\ D +)) + - models.jar,
див .: http://nlp.stanford.edu/software/lex-parser.shtml
АБО:
NLTK не вдалося знайти stanford-parser.jar! Встановіть змінну середовища CLASSPATH. Для отримання додаткової інформації про stanford-parser.jar див .: http://nlp.stanford.edu/software/lex-parser.shtml
Хоча , що важливо, я міг би правильно завантажувати та використовувати парсер, якби викликав функцію з усіма аргументами та повністю вказаними шляхами, як у:
stanford_parser_jar = '../lib/stanford-parser-full-2015-04-20/stanford-parser.jar'
stanford_model_jar = '../lib/stanford-parser-full-2015-04-20/stanfor-parser-3.5.2-models.jar'
parser = StanfordParser(path_to_jar=stanford_parser_jar,
path_to_models_jar=stanford_model_jar)
Тому помилка виникла в тому, NLTK
як вона шукає банки, використовуючи вхідні змінні STANFORD_MODELS
та CLASSPATH
змінні середовища. Щоб вирішити цю проблему, файл *-models.jar
з правильним форматуванням (щоб відповідати регулярному NLTK
виразу в коді, тому немає jar -corenlp -....) повинен знаходитися в папці, позначеній STANFORD_MODELS
.
А саме, я вперше створив:
mkdir stanford-parser-full-2015-12-09/models
Потім додано в .bashrc
:
export STANFORD_MODELS=/path/to/stanford-parser-full-2015-12-09/models
І нарешті, скопіювавши stanford-parser-3.6.0-models.jar
(або відповідну версію), у:
path/to/stanford-parser-full-2015-12-09/models/
Я міг StanfordParser
би плавно завантажувати python з класикою, на CLASSPATH
яку вказує stanford-parser.jar
. Насправді, як такий, ви можете телефонувати StanfordParser
без параметрів, за замовчуванням це просто спрацює.
Я використовую 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 мов.