用于文本分析的算法或库,特别是:主要词、跨文本的短语和文本集合
Posted
技术标签:
【中文标题】用于文本分析的算法或库,特别是:主要词、跨文本的短语和文本集合【英文标题】:Algorithms or libraries for textual analysis, specifically: dominant words, phrases across text, and collection of text 【发布时间】:2010-09-18 05:22:42 【问题描述】:我正在做一个项目,我需要分析一页文本和一组文本页以确定主导词。我想知道是否有一个库(首选 c# 或 java)可以为我处理繁重的工作。如果没有,是否有一种或多种算法可以实现我的以下目标。
我想要做的类似于从您在网络上找到的 url 或 rss 提要构建的词云,除了我不想要可视化。它们一直用于分析总统候选人的演讲,以了解主题或最常用的词是什么。
复杂之处在于我需要对数千个短文档执行此操作,然后是这些文档的集合或类别。
我最初的计划是解析文档,然后过滤常用词 - of、the、he、she 等。然后计算剩余词在文本中出现的次数(以及整个集合/类别) .
问题是将来我想处理词干、复数形式等。我也想看看有没有办法识别重要的短语。 (而不是一个单词的计数,一个短语的计数是2-3个单词)
感谢任何有关策略、库或算法的指导。
【问题讨论】:
【参考方案1】:您正在做的一个选择是词频到逆文档频率,或 tf-idf。在此计算下,最强项将具有最高权重。看看这里:http://en.wikipedia.org/wiki/Tf-idf
另一种选择是使用诸如朴素贝叶斯分类器之类的东西,使用单词作为特征,并找出文本中最强的特征来确定文档的类别。这与最大熵分类器类似。
就执行此操作的工具而言,最好的工具是 NLTK,这是一个包含大量文档和教程的 Python 库:http://nltk.sourceforge.net/
对于 Java,请尝试 OpenNLP:http://opennlp.sourceforge.net/
对于短语 stuff,请考虑我提供的第二个选项,即使用二元组和三元组作为特征,甚至作为 tf-idf 中的术语。
祝你好运!
【讨论】:
【参考方案2】:补充罗伯特·埃尔韦尔的回答:
词干和折叠词形。英文的一个简单方法是在小写单词形式上使用Porter Stemming。 “常用词”的术语是“停用词”或“停用列表” 按照建议通读 NLTK 书籍将很好地解释很多这些介绍性问题。 您必须解决的一些问题是解析句子(以便您的双元组和 n-gram 短语不会跨越句子边界)、将句子拆分为标记,以及决定如何处理所有格形式。这些东西没有一个是明确的,也没有任何一个有“正确答案”。另请参阅“nlp”和“自然语言”SO 标签。
祝你好运!这是一个不平凡的项目。
【讨论】:
我在帖子中添加了“自然语言”标签。【参考方案3】:好的。所以你有一个包含文本的文档和一个文档集合(语料库)。有很多方法可以做到这一点。
我建议使用 Lucene 引擎 (Java) 来索引您的文档。 Lucene 支持一种数据结构(索引),它在其中维护许多文档。文档本身是一个数据结构,可以包含“字段”——比如作者、标题、文本等。您可以选择哪些字段被索引,哪些字段不被索引。
将文档添加到索引是trivial。 Lucene 也是为速度而构建的,并且可以出色地扩展。
接下来,您要找出术语和频率。由于 lucene 在索引过程中已经为您计算了这一点,您可以使用 docFreq 函数并构建您自己的词频函数,或使用 IndexReader 类的 getTermFreqVectors 函数来获取词条(及其频率)。
现在由您决定如何对其进行排序以及您希望使用什么标准来过滤您想要的单词。要找出关系,您可以使用 wordnet 开源库的 Java API。要词干,请使用 Lucene 的 PorterStemFilter 类。短语重要性部分比较棘手,但一旦你走到这一步 - 你可以搜索关于如何将 n-gram 搜索集成到 Lucene (hint) 的提示。
祝你好运!
【讨论】:
【参考方案4】:您可以使用 Windows 平台 SDK 附带的 Windows 索引服务。或者,只需阅读以下介绍即可了解 NLP。
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
【讨论】:
这听起来是个不错的包。很高兴 MS 把它送人了。【参考方案5】:检查 MapReduce 模型以获取字数,然后按照 tf-idf 中的描述推导出频率
Hadoop 是一个 apache MapReduce 框架,可用于对许多文档进行字数统计的繁重任务。 http://hadoop.apache.org/common/docs/current/mapred_tutorial.html
您无法获得可以解决您想要的所有问题的单一框架。你必须选择正确的概念和框架组合才能得到你想要的。
【讨论】:
【参考方案6】:我也想看看是否有办法识别重要的短语。 (而不是一个单词的计数,一个短语的计数是2-3个单词)
这部分问题称为collocation extraction。 (至少如果您认为“重要短语”是指出现频率明显高于偶然出现的短语。)我 gave an answer 在 another SO question 关于那个特定的子问题。
【讨论】:
【参考方案7】:您正在寻找的似乎是词袋文档聚类/分类。 您将通过此搜索找到指导。
【讨论】:
以上是关于用于文本分析的算法或库,特别是:主要词、跨文本的短语和文本集合的主要内容,如果未能解决你的问题,请参考以下文章