Разборчивость Значение из текста
Я понимаю, что это широкая тема, но я ищу хороший учебник по анализу смысла из текста, в идеале в Python. В качестве примера того, что я хочу сделать, если пользователь делает запись в блоге, например:
"Мэнни Рамирес делает свое возвращение для ловкачей сегодня против Хьюстон Астрос",
какой легкий/простой способ получить существительные из предложения? Чтобы начать, я думаю, что я ограничил бы его именами, но я бы не хотел ограничиваться только этим (и я не хочу полагаться на простое регулярное выражение, которое предполагает, что Title Capped является правильным существительным).
Чтобы сделать этот вопрос еще хуже, какие вещи я не прошу, чтобы я был? Нужен ли мне набор существующих слов для начала? Какой материал лексического анализа мне нужно знать, чтобы сделать эту работу? Я столкнулся с еще одним вопросом по этой теме, и теперь я просматриваю эти ресурсы.
Ответы
Ответ 1
Используйте NLTK, в частности глава 7 о Извлечение информации.
Вы говорите, что хотите извлечь смысл, и есть модули для семантического анализа, но я думаю, что IE - это все, что вам нужно - и, честно говоря, одна из единственных областей компьютеров NLP может работать прямо сейчас.
См. разделы 7.5 и 7.6 в подтемах распознавания именных имен (чтобы разделить и классифицировать Мэнни Рамреса как человека, Доджерса как спортивную организацию, а Хьюстон Астрос - как другую спортивную организацию, или что-то, что подходит вашему домену) и Отношения. Существует NER chunker, который вы можете подключить, как только вы установили NLTK. Из их примеров извлечение геополитической сущности (GPE) и человека:
>>> 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.
Ответ 2
Вам нужно посмотреть 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, координирующей связью; теперь и полностью - это RB или наречия; для - IN, предлог; что-то - это NN, существительное; и другой - JJ, прилагательное.
Ответ 3
Обработка естественного языка (NLP) - это имя для синтаксического анализа, ну, естественный язык. Существует множество алгоритмов и эвристик, и это активная область исследований. Какой бы алгоритм вы ни кодировали, его нужно будет обучать на корпусе. Также как человек: мы изучаем язык, читая текст, написанный другими людьми (и/или слушая предложения, произнесенные другими людьми).
В практическом плане ознакомьтесь с Инструментом Natural Language Toolkit. Для теоретического обоснования того, что вы собираетесь кодировать, вы можете проверить Основы статистической обработки естественного языка Крисом Мэннином и Хинрихом Шютце.
alt text http://nlp.stanford.edu/fsnlp/fsnlp-bigger.jpg
Ответ 4
Вот книга, которую я наткнулся недавно: Обработка естественного языка с помощью Python
Ответ 5
То, что вы хотите, называется фрагментацией NP (noun phrase) или извлечения.
Некоторые ссылки здесь
Как уже отмечалось, это очень проблемный предмет. Чем больше вы можете сузить его, тем эффективнее будет. И вам придется тренировать свою программу в своем конкретном домене.
Ответ 6
Это действительно сложная тема. Как правило, этот материал подпадает под рубрику "Обработка естественного языка" и в лучшем случае имеет тенденцию быть сложным. Трудность такого рода вещей - именно то, почему до сих пор нет полностью автоматизированной системы обработки обслуживания клиентов и т.п.
Как правило, подход к этому материалу ДЕЙСТВИТЕЛЬНО зависит от того, что именно представляет собой ваш проблемный домен. Если вы сможете узнать о проблемном домене, вы можете получить некоторые очень серьезные преимущества; чтобы использовать ваш пример, если вы можете определить, что ваш проблемный домен является бейсболом, то это дает вам действительно сильный начальный старт. Даже тогда, это много работы, чтобы получить что-то особенно полезное.
Для чего это стоит, да, существующий состав слов будет полезен. Что еще более важно, определение ожидаемой функциональной сложности системы будет критически важным; вам нужно разбирать простые предложения, или существует необходимость в синтаксическом анализе сложного поведения? Можете ли вы ограничить входные данные относительно простым набором?
Ответ 7
Регулярные выражения могут помочь в некоторых сценариях. Вот подробный пример: Какой наиболее известный сканер на форуме 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
Это решение регулярного выражения работало в некотором роде.