2008-10-20 12 views
21

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

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

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

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

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

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

ответ

17

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

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

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

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

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

Удачи вам!

5

Чтобы добавить ответ Роберта Elwell в:

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

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

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

+0

Я добавил тег «natural-language» к сообщению. – 2008-10-21 00:39:18

1

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

+0

Это звучит неплохо. Приятно MS отдать его. – 2008-10-21 12:56:40

1

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

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

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

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

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

Удачи вам!

0

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

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

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

0

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

Эта часть проблемы называется collocation extraction. (По крайней мере, если вы принимаете «важные фразы» как фразы, которые появляются значительно чаще, чем случайно). I gave an answer по адресу another SO question об этой конкретной подзадаче.

0

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