用于分类大型数据集的NLP软件

时间:2011-08-30 19:00:11

标签: nlp nltk

背景

多年来,我一直在使用我自己的贝叶斯方法,根据大量不断更新的训练数据集对来自外部资源的新项目进行分类。

每种项目都有三种类型的分类:

  1. 30个类别,其中每个项目必须属于一个类别,最多两个类别。
  2. 其他10个类别,如果匹配较强,则每个项目仅与某个类别相关联,并且每个项目可以属于与匹配类别相同的多个类别。
  3. 其他4个类别,其中每个项目只能属于一个类别,如果没有强匹配,则该项目将被分配到默认类别。
  4. 每个项目包含大约2,000个字符的英文文本。在我的训练数据集中,大约有265,000个项目,其中包含10,000,000个特征的粗略估计(独特的三个单词短语)。

    我的自制方法相当成功,但绝对有改进的余地。我已经阅读了NLTK书中的“学习分类文本”这一章,这篇文章非常棒,并且给了我很好的NLP分类技术概述。我希望能够尝试不同的方法和参数,直到我的数据获得最佳分类结果。

    问题

    哪些现成的NLP工具可以有效地对如此大的数据集进行分类?

    到目前为止我尝试过的那些:

    • NLTK
    • TIMBL

    我尝试用数据集训练它们,这些数据集包含不到1%的可用训练数据:1,700项,375,000项功能。对于NLTK,我使用稀疏二进制格式,以及TIMBL的类似紧凑格式。

    两者似乎都依赖于在内存中做所有事情,并迅速消耗所有系统内存。我可以让他们使用微小的数据集,但没什么大的。我怀疑如果我尝试逐步添加训练数据,那么当时或者在进行实际分类时都会出现同样的问题。

    我看过谷歌的预测API,它似乎做了很多我正在寻找但不是一切的东西。如果可能的话,我也想避免依赖外部服务。

    关于功能的选择:多年来用我的自制方法进行测试,产生的三个单词短语效果最好。虽然我可以通过使用单词或两个单词短语来减少功能的数量,但这很可能会产生较差的结果,并且仍然会有大量的功能。

4 个答案:

答案 0 :(得分:3)

this post之后,根据个人经验,我建议Vowpal Wabbit。据说它拥有最快的文本分类算法之一。

答案 1 :(得分:2)

MALLET有许多分类器(NB,MaxEnt,CRF等)。这是Andrew McCallum的小组写的。 SVMLib是另一个不错的选择,但SVM模型通常需要比MaxEnt更多的调整。或者,在这种情况下,像K-means这样的在线集群可能并不坏。

一旦你训练了模型,SVMLib和MALLET就会非常快(C和Java)。模特训练可能需要一段时间!不幸的是,找到示例代码并不总是那么容易。我有some examples of how to use MALLET programmatically(与斯坦福分析器一起,这很慢并且可能因你的目的而过度杀伤)。 NLTK是一个很好的学习工具,而且非常简单,你可以在那里制作原型,这是理想的。

NLP更多地是关于功能和数据质量,而不是您使用的机器学习方法。 3克可能是好的,但那些字符n-gram怎么样呢?即,3克中的所有字符ngram用于解释拼写变化/词干/等?命名实体也可能有用,或某种词典。

答案 2 :(得分:2)

我会推荐Mahout,因为它用于处理超大规模的数据集。 ML算法是在Apache Hadoop(map / reduce)上构建的,因此缩放是固有的。

看看下面的分类部分,看看它是否有帮助。 https://cwiki.apache.org/confluence/display/MAHOUT/Algorithms

答案 3 :(得分:0)

您是否尝试过MALLET

我无法确定它是否会处理您的特定数据集,但我发现它在我以前的测试中非常强大。
但是,我的重点是主题建模而不是分类本身。

另外,请注意,对于许多NLP解决方案,您无需自己输入“功能”(如N-gram,即问题中提到的三字短语和双字短语),而是依赖于各种NLP函数可以产生自己的统计模型。