我在Postgres数据库中存储了大约300K文档,这些文档标记为主题类别(总共有150个类别)。我还有另外150k文档,这些文档还没有类别。我正在尝试找到对它们进行编程分类的最佳方法。

我一直在探索 NLTK 及其天真的贝叶斯分类器。似乎是一个很好的起点(如果您可以建议使用此任务的更好的分类算法,那么我全都是耳朵)。

我的问题是,我没有足够的RAM来一次训练NaiveBayesClassifier在所有150个Categoies/300K文档上(5个类别的培训8GB)。此外,分类器的准确性似乎会下降,因为我在更多类别上进行训练(90%的准确性为2个类别,81%,5,61%的精度为10)。

我是否应该一次在5个类别上训练分类器,然后通过分类器运行所有150K文档以查看是否有匹配项?似乎这会起作用,除了会有很多误报,这些文件实际上与任何类别都不匹配的文档会被分类器带入鞋子,因为它是最好的匹配...在那里...使用分类器的“无上述”选项的一种方法,以防文档不适合任何类别?

这是我的测试课 http://gist.github.com/451880

有帮助吗?

解决方案

您应该首先将您的文档转换为 TF-LOG(1 + IDF)向量: :术语频率很少,因此您应该使用python dict作为键,并将其计数为值,然后除以总数以获取全局频率。

另一个解决方案是将ABS(Hash(enter))例如作为正整数密钥。然后,您使用scipy.sparse向量,比Python dict更方便,更有效地执行线性代数操作。

还通过平均属于同一类别的所有标记文档的频率来构建150个频率向量。然后,要为新文档标记,您可以计算 余弦相似性 在文档向量和每个类别向量之间,并选择最相似的类别作为文档标签。

如果这还不够好,那么您应该尝试使用L1惩罚来训练逻辑回归模型 这个示例Scikit-Learn (这是@ephes解释的Liblinear的包装纸)。用于训练逻辑回归模型的向量应为先前引入的TD-LOG(1+IDF)向量,以获得良好的性能(精度和回忆)。 Scikit Learn Lib提供了一个Sklearn.metrics模块,其中包含例程来计算给定模型和给定数据集的分数。

对于较大的数据集:您应该尝试 Vowpal Wabbit 这可能是地球上最快的大规模文档分类问题的兔子(但不容易使用Python包装器Afaik)。

其他提示

您的文档有多大(单词数)? 150K训练Docs的记忆消耗不应该是问题。

幼稚的贝叶斯是一个不错的选择,尤其是当您拥有许多类别的训练示例或非常嘈杂的训练数据数据时。但是通常,线性支持向量机的性能要好得多。

您的问题是多类的问题(文档仅属于一个类别)还是多标签(文档属于一个或多个类别)?

准确性是判断分类器性能的糟糕选择。您应该宁愿使用精密vs召回,精密召回盈亏平衡点(PRBP),F1,AUC,必须查看根据信心 - thresthreshold的价值,根据精度(y)绘制了召回(x)的精确vs召回曲线(文档是否属于类别)。通常,您每类都会构建一个二进制分类器(一个类别的积极培训示例与所有其他训练示例的示例,这些示例不属于您当前类别)。您必须选择每个类别的最佳置信度阈值。如果您想将每类单一的措施组合到全球性能度量中,则必须微观(总结所有真实的阳性,假阳性,错误的负面因素,真实的负面因素以及CALC的合并分数)或宏(CALC CALC分数每类,并且然后平均分数平均得分)。

我们有数千万文件,数百万个培训示例和数千个类别(MultiLabel)。由于我们面临严重的培训时间问题(文档的数量是新的,更新或每天删除的很高),因此我们使用修改版本的版本 liblinear. 。但是,对于较小的问题,使用了liblinear周围的python包装器之一(liblinear2scipy 或者 Scikit-Learn)应该正常工作。

是否有一种方法可以为分类器提供“以上所有”选项,以防文档不适合任何类别?

您可能仅通过每次都受过“上述伪类别”训练而获得这种效果。如果您可以训练的最大训练是5个类别(尽管我不确定为什么它会吞噬这么多RAM),则每个实际的2K文档中的4个实际类别,以及带有2K文档的“无上述”类别从其他所有146个类别中随机取(如果您想要“分层采样”方法,则可能是13-14。

仍然感觉像是一个笨拙的方法,您可能会完全不同的方法更好 - 找到一个多维的DOC措施,将您的300K预先标记的DOC定义为150个合理可分离的群集,然后将每个群体定义为彼此,然后分配彼此 - 按因此确定的群集将文档归为适当的群集。我认为NLTK没有任何直接可用来支持这种事情的东西,但是,嘿,NLTK的成长如此之快,以至于我很可能错过了一些东西... ;-)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top