Синтаксический смысл из текста
Я понимаю, что это широкая тема, но я ищу хороший пример разбора значения из текста, в идеале на 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. Для теоретического обоснования того, что вы собираетесь кодировать, вы можете проверить основы статистической обработки естественного языка Криса Мэннинга и Генриха Шютце.
Вот книга, на которую я недавно наткнулся: Обработка естественного языка с 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)))
чтобы соответствовать одному из следующих:
- два слова, затем номер модели (включая многофункциональное устройство), затем "сканер"
- "Сканер", затем одно или два слова, затем номер модели (включая многофункциональное устройство)
В результате текст, извлеченный из поста, был похож,
- снят с производства сканер HP C9900A
- сканирует его старые рентгеновские снимки
- новый сканер Epson V700
- Сканер HP ScanJet 4850
- Сканер Epson Perfection 3170
Это решение с регулярными выражениями работает таким образом.