Как анализировать предложения на основе лексического содержимого (фразы) с помощью Python-NLTK

Может ли Python-NLTK распознать входную строку и проанализировать ее не только на основе пробелов, но и на содержимом? Скажем, "компьютерная система" стала фразой в этой ситуации. Может ли кто-нибудь предоставить пример кода?


строка ввода: "Опрос мнения пользователей о времени реакции компьютерной системы"

Ожидаемый результат: [ "A", "опрос", "из", "пользователь", "мнение", "из", "компьютерная система", "ответ", ]

Ответ 1

Технология, которую вы ищете, называется несколькими именами из нескольких подполей или под-подполей лингвистики и вычислений.


  • Чанкинг
    • От обработки естественного языка, он также вызывает мелкий синтаксический анализ,
    • Прочитайте Стив Абни о том, как это произошло: http://www.vinartus.net/spa/90e.pdf
    • Основные рамки и инструментальные средства NLP должны иметь их (например, OpenNLP, GATE, NLTK * (обратите внимание, что Chunker по умолчанию для NLTK работает только для имен объектов))
    • У Стэнфордского НЛП тоже есть: http://nlp.stanford.edu/projects/shallow-parsing.shtml

Я приведу пример кулера NE в NLTK:

>>> from nltk import word_tokenize, ne_chunk, pos_tag
>>> sent = "A survey of user opinion of computer system response time"
>>> chunked = ne_chunk(pos_tag(word_tokenize(sent)))
>>> for i in chunked:
...     print i
... 
('A', 'DT')
('survey', 'NN')
('of', 'IN')
('user', 'NN')
('opinion', 'NN')
('of', 'IN')
('computer', 'NN')
('system', 'NN')
('response', 'NN')
('time', 'NN')

С именованными объектами:

>>> sent2 = "Barack Obama meets Michael Jackson in Nihonbashi"
>>> chunked = ne_chunk(pos_tag(word_tokenize(sent2)))
>>> for i in chunked:
...     print i
... 
(PERSON Barack/NNP)
(ORGANIZATION Obama/NNP)
('meets', 'NNS')
(PERSON Michael/NNP Jackson/NNP)
('in', 'IN')
(GPE Nihonbashi/NNP)

Вы можете видеть, что это в значительной степени ошибочно, лучше что-то, чем ничего, я думаю.


  • Выделение нескольких слов
    • Горячая тема в НЛП, каждый хочет извлечь их по той или иной причине
    • Наиболее заметная работа Ивана Сага: http://lingo.stanford.edu/pubs/WP-2001-03.pdf и миазма всех видов алгоритмов извлечения и извлечение из документов ACL
    • Насколько это MWE очень загадочно, и мы не знаем, как классифицировать их автоматически или извлекать их должным образом, нет соответствующих инструментов для этого (как ни странно, исследователи вывода MWE часто могут быть получены с помощью Keyphrase Extraction или chunking...)

  • Вывод терминологии

    • Это происходит из исследований перевода, где они хотят, чтобы переводчики использовали правильное техническое слово при переводе документа.
    • Обратите внимание, что терминология поставляется с cornocopia стандартов ISO, из которых следует следовать из-за запутанной индустрии переводов, которая генерирует миллиарды доходов...
    • Однозначно, я понятия не имею, что отличает их от терминологического экстрактора, тех же алгоритмов, различного интерфейса... Я думаю, что единственное, что касается некоторых экстракторов терминов, - это возможность сделать это билингвально и автоматически создать словарь.
  • Вот несколько инструментов


Теперь вернемся к вопросу ОП.

Q: Может ли NLTK извлечь "компьютерную систему" ​​в качестве фразы?

A: Не действительно

Как показано выше, NLTK имеет предварительно подготовленный chunker, но он работает с объектами имен и даже в этом случае не все известные объекты распознаются.

Возможно, OP мог бы попробовать более радикальную идею, допустим, что последовательность существительных вместе всегда формирует фразу:

>>> from nltk import word_tokenize, pos_tag
>>> sent = "A survey of user opinion of computer system response time"
>>> tagged = pos_tag(word_tokenize(sent))
>>> chunks = []
>>> current_chunk = []
>>> for word, pos in tagged:
...     if pos.startswith('N'):
...             current_chunk.append((word,pos))
...     else:
...             if current_chunk:
...                     chunks.append(current_chunk)
...             current_chunk = []
... 
>>> chunks
[[('computer', 'NN'), ('system', 'NN'), ('response', 'NN'), ('time', 'NN')], [('survey', 'NN')], [('user', 'NN'), ('opinion', 'NN')]]
>>> for i in chunks:
...     print i
... 
[('computer', 'NN'), ('system', 'NN'), ('response', 'NN'), ('time', 'NN')]
[('survey', 'NN')]
[('user', 'NN'), ('opinion', 'NN')]

Так что даже с этим решением кажется, что попытка получить "компьютерную систему" ​​сложна. Но если вы думаете, что немного похоже на то, что "время реакции на компьютерную систему" ​​является более правильной фразой, чем "компьютерная система".

Не все интерпретации времени отклика компьютерной системы выглядят действительно:

  • [время отклика компьютерной системы]
  • [компьютер [система [ответ [время]]]]
  • [компьютерная система] [время ответа]
  • [компьютер [время отклика системы]]

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