Как мне выполнить анализ зависимостей в NLTK? - PullRequest
31 голосов
/ 16 сентября 2011

Изучая книгу NLTK, не ясно, как сгенерировать дерево зависимостей из данного предложения.

Соответствующий раздел книги: подраздел главы по грамматике зависимости дает примерный рисунок , но он не показывает, как разобрать предложение, чтобы придумать эти отношения - или, может быть, я упускаю что-то фундаментальное в НЛП?

EDIT: Я хочу что-то похожее на то, что делает stanford parser : С учетом предложения «Я застрелил слона во сне», оно должно возвращать что-то вроде:

nsubj(shot-2, I-1)
det(elephant-4, an-3)
dobj(shot-2, elephant-4)
prep(shot-2, in-5)
poss(sleep-7, my-6)
pobj(in-5, sleep-7)

Ответы [ 7 ]

78 голосов
/ 19 ноября 2015

Мы можем использовать Stanford Parser из NLTK.

Требования

Вам нужно скачать две вещи с их сайта:

  1. Анализатор Stanford CoreNLP .
  2. Модель языка для выбранного языка (например, модель английского языка )

Внимание!

Убедитесь, что версия вашей языковой модели соответствует версии вашего синтаксического анализатора Stanford CoreNLP!

Текущая версия CoreNLP по состоянию на 22 мая 2018 года - 3.9.1.

После загрузки двух файлов распакуйте zip-файл в любое место.

Код Python

Далее загрузите модель и используйте ее через NLTK

from nltk.parse.stanford import StanfordDependencyParser

path_to_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser.jar'
path_to_models_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser-3.4.1-models.jar'

dependency_parser = StanfordDependencyParser(path_to_jar=path_to_jar, path_to_models_jar=path_to_models_jar)

result = dependency_parser.raw_parse('I shot an elephant in my sleep')
dep = result.next()

list(dep.triples())

выход

Вывод последней строки:

[((u'shot', u'VBD'), u'nsubj', (u'I', u'PRP')),
 ((u'shot', u'VBD'), u'dobj', (u'elephant', u'NN')),
 ((u'elephant', u'NN'), u'det', (u'an', u'DT')),
 ((u'shot', u'VBD'), u'prep', (u'in', u'IN')),
 ((u'in', u'IN'), u'pobj', (u'sleep', u'NN')),
 ((u'sleep', u'NN'), u'poss', (u'my', u'PRP$'))]

Я думаю, это то, что вы хотите.

7 голосов
/ 22 марта 2017

Если вам нужна более высокая производительность, тогда spacy (https://spacy.io/) - лучший выбор. Использование очень простое:

import spacy

nlp = spacy.load('en')
sents = nlp(u'A woman is walking through the door.')

В качестве выходных данных вы получите дерево зависимостей, и вы можетеочень легко отыскивать любую необходимую информацию. Вы также можете определить свои собственные конвейеры. Подробнее на их сайте.

https://spacy.io/docs/usage/

7 голосов
/ 16 сентября 2011

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

Выполнение анализа зависимостей на основе корпуса даже небольшого объема текста в Python не является идеальной производительностью-wise.Поэтому в NLTK они предоставляют обертку до MaltParser , анализатор зависимостей на основе корпуса.

Вы можете найти этот другой вопрос о RDF-представлении предложений актуально.

3 голосов
/ 06 марта 2015

Если вы хотите серьезно относиться к анализу зависимостей, не используйте NLTK, все алгоритмы устарели и работают медленно. Попробуйте что-то вроде этого: https://spacy.io/

2 голосов
/ 13 июня 2018

Чтобы использовать Stanford Parser из NLTK

1) Запустите сервер CoreNLP на локальном узле
Загрузите Stanford CoreNLP здесь (а также файл модели для вашего языка),Сервер можно запустить, выполнив следующую команду (подробности здесь )

# Run the server using all jars in the current directory (e.g., the CoreNLP home directory)
java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 -timeout 15000

или через NLTK API (сначала необходимо настроить переменную среды CORENLP_HOME)

os.environ["CORENLP_HOME"] = "dir"
client = corenlp.CoreNLPClient()
# do something
client.stop()

2) Вызвать анализатор зависимостей из NLTK

>>> from nltk.parse.corenlp import CoreNLPDependencyParser
>>> dep_parser = CoreNLPDependencyParser(url='http://localhost:9000')
>>> parse, = dep_parser.raw_parse(
...     'The quick brown fox jumps over the lazy dog.'
... )
>>> print(parse.to_conll(4))  
The     DT      4       det
quick   JJ      4       amod
brown   JJ      4       amod
fox     NN      5       nsubj
jumps   VBZ     0       ROOT
over    IN      9       case
the     DT      9       det
lazy    JJ      9       amod
dog     NN      5       nmod
.       .       5       punct

Подробнее см. Документацию здесь , также этот вопрос NLTK CoreNLPDependencyParser: Не удалосьустановить соединение .

1 голос
/ 25 июля 2013

Из документации Stanford Parser: «зависимости могут быть получены с помощью нашего программного обеспечения [...] для деревьев фразовой структуры с использованием класса EnglishGrammaticStructure, доступного в пакете синтаксического анализа».http://nlp.stanford.edu/software/stanford-dependencies.shtml

В руководстве по зависимостям также упоминается: «Или наш инструмент преобразования может преобразовать выходные данные других анализаторов групп в представление Стенфордских зависимостей».http://nlp.stanford.edu/software/dependencies_manual.pdf

В настоящее время ни одна из этих функций не реализована в NLTK.

0 голосов
/ 30 апреля 2019

Немного опоздал на вечеринку, но я хотел добавить пример кода с SpaCy, который даст вам желаемый вывод:

import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("I shot an elephant in my sleep")
for token in doc:
    print("{2}({3}-{6}, {0}-{5})".format(token.text, token.tag_, token.dep_, token.head.text, token.head.tag_, token.i+1, token.head.i+1))

А вот вывод, очень похожий на желаемый вывод:

nsubj(shot-2, I-1)
ROOT(shot-2, shot-2)
det(elephant-4, an-3)
dobj(shot-2, elephant-4)
prep(shot-2, in-5)
poss(sleep-7, my-6)
pobj(in-5, sleep-7)

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...