文本分析的算法或库,具体包括:文本中的主要单词、短语和文本集合。

21

我正在开发一个项目,需要分析一篇文本和多个文本集合以确定主要单词。我想知道是否有一个库(最好是c#或java),可以为我处理重活。如果没有,是否有算法或多个算法可以实现我的以下目标。

我想做的与从网址或rss提要构建的单词云类似,但我不需要可视化效果。它们经常用于分析总统候选人的演讲,以查看主题或最常用的单词。

问题在于,我需要在数千个短文档上进行此操作,然后是这些文档的集合或类别。

我的初始计划是解析该文档,然后过滤掉常见的单词- of、the、he、she等。然后计算剩余单词在文本中(以及整个集合/类别)出现的次数。

问题在于,在未来,我想处理词干、复数形式等。我还想知道是否有办法识别重要短语。 (不是单词的计数,而是2-3个单词组合的计数)

如有帮助的策略、库或算法,请指导。

7个回答

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
补充Robert Elwell的回答:
  • 词干提取和词形折叠。在英语中,一种简单的方法是对小写的单词形式使用Porter Stemming
  • "常见单词"的术语为"停用词"或"停用词列表"
  • 建议阅读NLTK书籍,可以很好地解释这些入门问题。
  • 你需要解决的一些问题包括解析句子(使你的二元组和n-gram短语不跨越句子边界)、将句子分成标记,并决定如何处理所有格形式等。

所有这些都没有明确的答案。请参见“nlp”和“natural-language”SO标签。

祝你好运!这是一个非平凡的项目。


我为帖子添加了“自然语言”标签。 - Account deleted

1

好的,所以你有一个包含文本和文档集合(语料库)的文件。有许多方法可以做到这一点。

我建议使用Lucene引擎(Java)来索引您的文档。Lucene支持一种数据结构(索引),它维护其中的许多文档。文档本身是一个数据结构,可以包含“字段” - 例如,作者、标题、文本等。您可以选择哪些字段被索引,哪些不被索引。

将文档添加到索引中是微不足道的。Lucene还专为速度而构建,并且可以出色地扩展。

接下来,您需要确定术语和频率。由于Lucene在索引过程中已经为您计算了这一点,因此您可以使用docFreq函数并构建自己的术语频率函数,或者使用IndexReader类的getTermFreqVectors函数获取术语(及其频率)。

现在由您来决定如何对其进行排序以及使用哪些标准来过滤您想要的单词。为了找出单词之间的关系,您可以使用Java API访问WordNet开源库。要将单词还原为词根形式,请使用Lucene的PorterStemFilter类。短语重要性部分比较棘手,但是一旦您走到这一步-您可以搜索有关如何将n元素搜索集成到Lucene中 (提示)的建议。

祝你好运!


1

听起来是个很不错的套餐。微软很慷慨地提供了它。 - Gregg Lind

0

看起来你正在寻找的是袋子模型文档聚类/分类。你可以通过这个搜索找到相关指导。


0

检查MapReduce模型以获取单词计数,然后按照tf-idf中描述的方式推导频率。

Hadoop是一个Apache MapReduce框架,可用于对许多文档进行单词计数的繁重任务。 http://hadoop.apache.org/common/docs/current/mapred_tutorial.html

您无法获得一个解决所有问题的单一框架。您必须选择正确的概念和框架组合来获得所需的结果。


0
我还想看看是否有一种方法来识别重要短语。(而不是单词的数量,而是2-3个单词组合的数量)
你问题的这部分被称为搭配提取。(至少如果您认为“重要短语”是显著比偶然更经常出现的短语。)我在另一个SO问题上针对该特定子问题给出了答案。(点击此处查看)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接