多年来,我一直在使用自己的类似贝叶斯方法,根据大型且不断更新的训练数据集对来自外部来源的新项目进行分类。
每个项目都有三种类型的分类:
每项由约 2,000 个字符的英文文本组成。 在我的训练数据集中,大约有 265,000 个项目,其中包含粗略估计的 10,000,000 个特征(独特的三词短语)。
我的自制方法相当成功,但肯定还有改进的空间。 我读过 NLTK 书的“学习分类文本”一章,这章很棒,让我对 NLP 分类技术有一个很好的概述。 我希望能够尝试不同的方法和参数,直到获得数据的最佳分类结果。
有哪些现成的 NLP 工具可以有效地对如此大的数据集进行分类?
到目前为止我尝试过的:
我尝试使用包含不到 1% 的可用训练数据的数据集来训练它们:1,700 个项目,375,000 个特征。 对于 NLTK,我使用了稀疏二进制格式,对于 TIMBL 使用了类似的紧凑格式。
两者似乎都依赖于在内存中完成所有操作,并很快耗尽了所有系统内存。 我可以让他们处理很小的数据集,但不能处理很大的数据集。 我怀疑,如果我尝试增量添加训练数据,那么或者在进行实际分类时都会出现同样的问题。
我查看了 Google 的 Prediction API,它似乎可以完成我正在寻找的大部分功能,但不是全部。 如果可能的话,我还想避免依赖外部服务。
关于特征的选择:在多年来我的自制方法的测试中,三个单词短语产生了迄今为止最好的结果。 尽管我可以通过使用单词或两个单词短语来减少特征数量,但这很可能会产生较差的结果,并且仍然会产生大量特征。
在这篇文章之后,根据个人经验,我会推荐Vowpal Wabbit。据说它拥有最快的文本分类算法之一。
MALLET 有许多分类器(NB、MaxEnt、CRF 等)。这是安德鲁·麦卡勒姆的小组写的。 SVMLib 是另一个不错的选择,但 SVM 模型通常需要比 MaxEnt 更多的调整。或者,在这种情况下,某种在线聚类(例如 K-means)可能也不错。
训练完模型后,SVMLib 和 MALLET 的速度相当快(C 和 Java)。不过模型训练可能需要一段时间!不幸的是,找到示例代码并不总是那么容易。我有一些关于如何以编程方式使用 MALLET 的示例(以及斯坦福解析器,它速度很慢,而且对于您的目的来说可能有点过分)。 NLTK 是一个很棒的学习工具,而且非常简单,您可以对您正在做的事情进行原型设计,这是理想的选择。 NLP 更多的是关于特征和数据质量,而不是您使用哪种机器学习方法。 3-gram 可能不错,但是跨这些的字符 n-gram 怎么样?即,3-gram 中的所有字符 ngram 都用于解释拼写变化/词干提取/等?命名实体或某种词典也可能有用。
木槌吗? 我不确定它是否能处理您的特定数据集,但我发现它在我之前的测试中非常强大。
然而,我的重点是主题建模而不是分类本身。
此外,请注意,对于许多 NLP 解决方案,您不需要自己输入“特征”(如 N 元语法,即问题中提到的三词短语和两词短语),而是依赖于各种NLP 可以生成自己的统计模型。