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

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

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

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

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

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

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

Ответ 1

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

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

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

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

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

Удачи!

Ответ 2

Чтобы добавить к Роберту Элуэлл ответ:

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

Удачи!

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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