Синтаксический смысл из текста

Я понимаю, что это широкая тема, но я ищу хороший пример разбора значения из текста, в идеале на Python. В качестве примера того, что я собираюсь сделать, если пользователь пишет в блоге:

"Мэнни Рамирес возвращается сегодня на" Доджерс "против Хьюстон Астрос",

что такое легкий / простой способ извлечь существительные из предложения? Для начала, я думаю, что я бы ограничил его собственными существительными, но я не хотел бы ограничиваться только этим (и я не хочу полагаться на простое регулярное выражение, которое предполагает, что заголовок ограничен как собственное существительное).

Чтобы еще больше усугубить этот вопрос, о чем я не спрашиваю? Нужно ли мне совокупность существующих слов, чтобы начать? Какие лексические аналитические материалы мне нужно знать, чтобы сделать эту работу? Я столкнулся с еще одним вопросом по теме, и сейчас я копаюсь в этих ресурсах.

7 ответов

Решение

Используйте NLTK, в частности главу 7 "Извлечение информации".

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

См. Разделы 7.5 и 7.6, посвященные подтемам распознавания именованных сущностей (чтобы разбить на категории и классифицировать Мэнни Рамереза ​​как личность, Доджерс как спортивную организацию и Хьюстон Астрос как другую спортивную организацию, или что угодно, что подходит вашему домену) и Извлечение отношений Существует блок NER, который вы можете подключить после установки NLTK. Из своих примеров извлекаем геополитическую единицу (ГПЕ) и человека:

>>> sent = nltk.corpus.treebank.tagged_sents()[22]
>>> print nltk.ne_chunk(sent) 
(S
  The/DT
  (GPE U.S./NNP)
  is/VBZ
  one/CD
  ...
  according/VBG
  to/TO
  (PERSON Brooke/NNP T./NNP Mossman/NNP)
  ...)

Обратите внимание, что вам все равно нужно знать токенизацию и теги, как обсуждалось в предыдущих главах, чтобы получить текст в правильном формате для этих задач IE.

Вам нужно взглянуть на Natural Language Toolkit, который предназначен именно для такого рода вещей.

Этот раздел руководства выглядит очень актуально: категоризация и пометка слов - вот выдержка:

>>> text = nltk.word_tokenize("And now for something completely different")
>>> nltk.pos_tag(text)
[('And', 'CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'),
('completely', 'RB'), ('different', 'JJ')]

Здесь мы видим, что и есть CC, координирующее соединение; сейчас и полностью есть РБ, или наречия; ибо есть IN, предлог; что-то NN, существительное; и отличается это JJ, прилагательное.

Natural Language Processing (NLP) - это название для анализа естественного языка. Существует множество алгоритмов и эвристик, и это активная область исследований. Какой бы алгоритм вы ни написали, его нужно будет обучать на корпусе. Как человек: мы учим язык, читая текст, написанный другими людьми (и / или слушая предложения, произнесенные другими людьми).

В практическом плане, посмотрите на Natural Language Toolkit. Для теоретического обоснования того, что вы собираетесь кодировать, вы можете проверить основы статистической обработки естественного языка Криса Мэннинга и Генриха Шютце.

http://nlp.stanford.edu/fsnlp/fsnlp-bigger.jpg

Вот книга, на которую я недавно наткнулся: Обработка естественного языка с Python

То, что вы хотите, называется NP (фраза существительное), чанкинг, или извлечение.

Некоторые ссылки здесь

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

Это действительно очень сложная тема. Как правило, такого рода вещи подпадают под рубрику "Обработка естественного языка" и в лучшем случае имеют тенденцию быть хитрыми. Сложность такого рода вещей заключается именно в том, почему до сих пор не существует полностью автоматизированной системы обслуживания клиентов и тому подобного.

Как правило, подход к этой вещи ДЕЙСТВИТЕЛЬНО зависит от того, какова ваша проблемная область. Если вы в состоянии разбить проблемную область, вы можете получить очень серьезные преимущества; Если использовать ваш пример, если вы можете определить, что ваша проблемная область - бейсбол, то это дает вам действительно хороший старт. Даже тогда, это много работы, чтобы получить что-то особенно полезное.

Для чего это стоит, да, существующий корпус слов будет полезен. Что еще более важно, определение ожидаемой функциональной сложности системы будет иметь решающее значение; Вам нужно разобрать простые предложения, или есть необходимость в разборе сложного поведения? Можете ли вы ограничить входные данные относительно простым набором?

Регулярные выражения могут помочь в некоторых сценариях. Вот подробный пример: Что такое самый упоминаемый сканер на форуме CNET, который использовал регулярное выражение для поиска всех упомянутых сканеров в сообщениях форума CNET.

В посте было использовано регулярное выражение как таковое:

(?i)((?:\w+\s\w+\s(?:(?:(?:[0-9]+[a-z\-]|[a-z]+[0-9\-]|[0-9])[a-z0-9\-]*)|all-in-one|all in one)\s(\w+\s){0,1}(?:scanner|photo scanner|flatbed scanner|adf scanner|scanning|document scanner|printer scanner|portable scanner|handheld scanner|printer\/scanner))|(?:(?:scanner|photo scanner|flatbed scanner|adf scanner|scanning|document scanner|printer scanner|portable scanner|handheld scanner|printer\/scanner)\s(\w+\s){1,2}(?:(?:(?:[0-9]+[a-z\-]|[a-z]+[0-9\-]|[0-9])[a-z0-9\-]*)|all-in-one|all in one)))

чтобы соответствовать одному из следующих:

  • два слова, затем номер модели (включая многофункциональное устройство), затем "сканер"
  • "Сканер", затем одно или два слова, затем номер модели (включая многофункциональное устройство)

В результате текст, извлеченный из поста, был похож,

  1. снят с производства сканер HP C9900A
  2. сканирует его старые рентгеновские снимки
  3. новый сканер Epson V700
  4. Сканер HP ScanJet 4850
  5. Сканер Epson Perfection 3170

Это решение с регулярными выражениями работает таким образом.

Другие вопросы по тегам