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

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

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

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

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

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

Любое руководство по стратегии, библиотекам или алгоритмам, которые могли бы помочь, приветствуются.

7 ответов

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

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

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

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

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

Удачи!

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

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

Ничто из этого не является четким и не имеет "правильных ответов". Смотрите также теги "nlp" и "natural-language".

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

Вы можете использовать службу индексирования 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

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

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

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

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

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

Удачи!

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

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

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

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

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

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

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