Алгоритмы или библиотеки для текстового анализа, в частности: доминирующие слова, фразы по всему тексту и коллекция текста - PullRequest
21 голосов
/ 21 октября 2008

Я работаю над проектом, в котором мне нужно проанализировать страницу текста и наборы страниц текста, чтобы определить доминирующие слова. Я хотел бы знать, если есть библиотека (предпочитают C # или Java), которая будет обрабатывать тяжелую работу для меня. Если нет, есть ли алгоритм или несколько, которые бы достигли моих целей ниже.

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

Сложность в том, что мне нужно сделать это с тысячами коротких документов, а затем с коллекциями или категориями этих документов.

Мой первоначальный план состоял в том, чтобы проанализировать документ, затем отфильтровать общие слова - из, он, она и т. Д. Затем подсчитать, сколько раз оставшиеся слова появляются в тексте (и в целом коллекции / категории) ,

Проблема заключается в том, что в будущем я хотел бы работать с основами, множественными формами и т. Д. Я также хотел бы посмотреть, есть ли способ определить важные фразы. (Вместо количества слов, количество фраз составляет 2-3 слова вместе)

Будем благодарны за любые рекомендации по стратегии, библиотекам или алгоритмам, которые могут помочь.

Ответы [ 7 ]

17 голосов
/ 21 октября 2008

Одним из вариантов того, что вы делаете, является термин «частота - обратная частота документа», или tf-idf. Сильнейшие слагаемые будут иметь самый высокий вес при этом расчете. Проверьте здесь: http://en.wikipedia.org/wiki/Tf-idf

Другой вариант - использовать что-то вроде наивного байесовского классификатора, используя слова в качестве объектов, и найти наиболее сильные элементы в тексте для определения класса документа. Это будет работать аналогично с классификатором максимальной энтропии.

Что касается инструментов для этого, лучше всего начать с NLTK, библиотеки Python с обширной документацией и учебными пособиями: http://nltk.sourceforge.net/

Для Java попробуйте OpenNLP: http://opennlp.sourceforge.net/

Что касается фразы, рассмотрите второй вариант, который я предложил, используя биграммы и триграммы как функции или даже как термины в tf-idf.

Удачи!

5 голосов
/ 21 октября 2008

Добавить к ответу Роберта Элвелла:

  • стоящие и сворачивающиеся словоформы. Простой метод на английском языке - использовать Porter Stemming в строчных словах в нижнем регистре.
  • термин для «общих слов» - «стоп-слово» или «стоп-лист»
  • Прочтение предложенной книги НЛТК хорошо объяснит многие из этих вводных вопросов.
  • Некоторые проблемы, с которыми вам приходится сталкиваться, - это разбор предложений (чтобы ваши биграммы и n-грамматические фразы не пересекали границы предложений), разбиение предложений на токены и решение, например, что делать с притяжательными формами.

Ни один из этих материалов не является четким, и при этом ни один из них не имеет "правильных ответов". Смотрите также теги "nlp" и "естественный язык" SO.

Удачи! Это нетривиальный проект.

1 голос
/ 05 июня 2009

Alrighty. Итак, у вас есть документ, содержащий текст и набор документов (корпус). Есть несколько способов сделать это.

Я бы предложил использовать движок Lucene (Java) для индексации ваших документов. Lucene поддерживает структуру данных (индекс), в которой хранится несколько документов. Сам документ - это структура данных, которая может содержать «поля», например, автора, заголовок, текст и т. Д. Вы можете выбрать, какие поля индексируются, а какие нет.

Добавление документов в индекс тривиально . Lucene также создан для скорости и может превосходно масштабироваться.

Далее вы хотите выяснить условия и частоты. Поскольку lucene уже рассчитал это для вас в процессе индексирования, вы можете использовать либо функцию docFreq и создать свою собственную функцию частоты термина, либо использовать функцию getTermFreqVectors класса IndexReader для получения терминов (и их частот).

Теперь вам решать, как его отсортировать и какие критерии вы хотите использовать для фильтрации нужных вам слов. Чтобы выяснить отношения, вы можете использовать Java API к библиотеке с открытым исходным кодом wordnet. Чтобы обрезать слова, используйте класс Lucene PorterStemFilter. Часть важности фразы сложнее, но как только вы дошли до этого - вы можете найти советы о том, как интегрировать n-граммовый поиск в Lucene (подсказка) .

Удачи!

1 голос
/ 21 октября 2008

Вы можете использовать службу индексирования Windows, которая поставляется с Windows Platform SDK. Или просто прочитайте следующее введение, чтобы получить обзор НЛП.

http://msdn.microsoft.com/en-us/library/ms693179(VS.85).aspx http://i.msdn.microsoft.com/ms693179.wbr-index-create(en-us,VS.85).gif

http://i.msdn.microsoft.com/ms693179.wbr-query-process(en-us,VS.85).gif

0 голосов
/ 10 апреля 2011

Кажется, что то, что вы ищете, называется кластеризацией / классификацией документов. Вы найдете руководство по этому поиску.

0 голосов
/ 29 октября 2009

Я также хотел бы посмотреть, есть ли способ определить важные фразы. (Вместо количества слов, количество фраз составляет 2-3 слова вместе)

Эта часть вашей проблемы называется извлечение словосочетания . (По крайней мере, если вы возьмете «важные фразы» в качестве фраз, которые появляются значительно чаще, чем случайно.) Я дал ответ на другой вопрос SO об этой конкретной подзадаче. 1011 *

0 голосов
/ 22 сентября 2009

Проверьте модель MapReduce, чтобы получить количество слов и затем получить частоту, как описано в tf-idf

Hadoop - это Apache MapReduce, который может использоваться для тяжелой задачи подсчета слов во многих документах. http://hadoop.apache.org/common/docs/current/mapred_tutorial.html

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

...