我正在开展一个项目,我需要分析一个文本页面和文本页面集合以确定主导词汇。我想知道是否有一个库(更喜欢c#或java)来处理繁重的工作。如果没有,是否有一个算法或多个可以实现我的目标。
我想要做的是类似于您在网络上找到的网址或RSS订阅源构建的文字云,除了我不想要可视化。他们一直用于分析总统候选人的演讲,看看主题或最常用词是什么。
复杂的是,我需要在成千上万的短文档,然后是这些文档的集合或类别上执行此操作。
我最初的计划是解析文档,然后过滤常用词 - ,他,她等等。然后计算剩余词出现在文本中的次数(以及整个集合/类别) 。
问题是,在将来,我想处理词干,复数形式等。我还想看看是否有办法识别重要的短语。 (而不是一个单词的计数,一个短语的计数一起是2-3个单词)
有关策略,库或算法的任何指导都会有所帮助。
答案 0 :(得分:17)
您正在做的一个选项是反向文档频率的术语频率,或tf-idf。在此计算中,最强的术语将具有最高权重。检查是否在这里:http://en.wikipedia.org/wiki/Tf-idf
另一种选择是使用类似于朴素贝叶斯分类器的东西,使用单词作为特征,并找到文本中最强大的特征来确定文档的类。这与最大熵分类器类似。
就这样做的工具而言,最好的工具是NLTK,这是一个包含大量文档和教程的Python库:http://nltk.sourceforge.net/
对于Java,请尝试OpenNLP:http://opennlp.sourceforge.net/
对于短语的东西,考虑我使用bigrams和trigrams作为特征提供的第二个选项,或者甚至作为tf-idf中的术语。
祝你好运!答案 1 :(得分:5)
加入Robert Elwell的回答:
这些东西都不是明确的,也没有任何“正确答案”。另请参阅“nlp”和“自然语言”SO标记。
祝你好运!这是一个非平凡的项目。答案 2 :(得分:1)
您可以使用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
答案 3 :(得分:1)
Alrighty。所以你有一个包含文本和文档集合的文档(语料库)。有很多方法可以做到这一点。
我建议使用Lucene引擎(Java)索引您的文档。 Lucene支持一种数据结构(索引),可以在其中维护许多文档。文档本身是一个可以包含“字段”的数据结构 - 比如作者,标题,文本等。您可以选择索引哪些字段以及哪些字段不是。
将文档添加到索引trivial。 Lucene也是为速度而设计的,可以很好地扩展。
接下来,您要了解术语和频率。由于lucene已经在索引过程中为您计算了这个,您可以使用docFreq函数并构建自己的术语频率函数,或使用IndexReader类的getTermFreqVectors函数来获取术语(及其频率)。
现在由您决定如何对其进行排序以及您希望使用哪些条件来过滤所需的单词。要弄清楚关系,可以使用Java API到wordnet开源库。要干扰单词,请使用Lucene的PorterStemFilter类。短语重要性部分比较棘手,但是一旦你到目前为止 - 你可以搜索关于如何将n-gram搜索整合到Lucene (hint)中的提示。
祝你好运!答案 4 :(得分:0)
检查MapReduce模型以获取字数,然后如tf-idf
中所述导出频率Hadoop是一个apache MapReduce框架,可用于许多文档上繁重的字数统计任务。 http://hadoop.apache.org/common/docs/current/mapred_tutorial.html
您无法获得可以解决所有问题的单一框架。你必须选择正确的概念和框架组合来获得你想要的东西。
答案 5 :(得分:0)
我还想看看是否有办法识别重要的短语。 (而不是一个单词的计数,一个短语的计数一起是2-3个单词)
您问题的这一部分称为collocation extraction。 (至少如果你把“重要的短语”变成看起来比偶然出现得多的短语。)我gave an answer在another SO question关于那个特定的子问题。{/ p>
答案 6 :(得分:0)
您正在寻找的东西似乎被称为词袋文档聚类/分类。 您可以通过此搜索找到指导。