多年来,我一直在使用我自己的贝叶斯方法,根据大量不断更新的训练数据集对来自外部资源的新项目进行分类。
每种项目都有三种类型的分类:
每个项目包含大约2,000个字符的英文文本。在我的训练数据集中,大约有265,000个项目,其中包含10,000,000个特征的粗略估计(独特的三个单词短语)。
我的自制方法相当成功,但绝对有改进的余地。我已经阅读了NLTK书中的“学习分类文本”这一章,这篇文章非常棒,并且给了我很好的NLP分类技术概述。我希望能够尝试不同的方法和参数,直到我的数据获得最佳分类结果。
哪些现成的NLP工具可以有效地对如此大的数据集进行分类?
到目前为止我尝试过的那些:
我尝试用数据集训练它们,这些数据集包含不到1%的可用训练数据:1,700项,375,000项功能。对于NLTK,我使用稀疏二进制格式,以及TIMBL的类似紧凑格式。
两者似乎都依赖于在内存中做所有事情,并迅速消耗所有系统内存。我可以让他们使用微小的数据集,但没什么大的。我怀疑如果我尝试逐步添加训练数据,那么当时或者在进行实际分类时都会出现同样的问题。
我看过谷歌的预测API,它似乎做了很多我正在寻找但不是一切的东西。如果可能的话,我也想避免依赖外部服务。
关于功能的选择:多年来用我的自制方法进行测试,产生的三个单词短语效果最好。虽然我可以通过使用单词或两个单词短语来减少功能的数量,但这很可能会产生较差的结果,并且仍然会有大量的功能。
答案 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函数可以产生自己的统计模型。