多标签文档分类

7

我有一个数据库,其中存储了基于以下三个字段的数据:id、文本和{标签}。请注意,每个文本已被分配给多个标签\标记\类别。我想建立一个模型(weka\rapidminer\mahout),能够推荐\分类一堆标签\标记\类别到给定的文本。

我听说过SVM和朴素贝叶斯分类器,但不确定它们是否支持多标签分类。任何指导我正确方向的东西都非常欢迎!

3个回答

4

基本的多标签分类方法是一对多(OvR),也叫做二元关联(BR)。基本思路是使用现成的二元分类器,例如朴素贝叶斯或SVM,然后创建K个实例来解决K个独立的分类问题。在类似Python的伪代码中:

for each class k:
    learner = SVM(settings)  # for example
    labels = [class_of(x) == k for x in samples]
    learner.learn(samples, labels)

在预测时,您只需对样本运行每个二元分类器并收集它们预测为正的标签。

(由于假定问题是独立的,因此显然可以并行进行培训和预测。有关执行多标签分类的两个Java软件包的链接,请参见维基百科。)


1
还有很多空间可以超越一系列独立的问题。例如,使用概率分类器(比如逻辑回归),您可以定义一个分布在结果标签集上的分布,例如主题模型或MRF,并进行全局优化。我相信您也可以使用Platt方法或某些直接判别全局标准将类似的想法纳入SVM中。 - Ben Allison
@BenAllison:当然,但我只是指出基本方法和一堆做更高级操作的工具包。 - Fred Foo

1

SVM本质上是二元分类器,但有许多替代方案使其适用于多标签环境,基本上是通过组合多个SVM的二进制实例来实现。

一些示例在SVM维基百科文章的多类别部分中。我不确定您是否对细节感兴趣,但它们包含在Weka和Rapidminer中。例如,SMO分类器是将SVM应用于多标签问题的变体之一。

朴素贝叶斯可以直接应用于多标签环境。


我认为你混淆了多类别和多标签分类。在前者中,每个样本只有一个类别,但可能有超过2种可能性;而在后者中,每个样本可以同时属于多个类别。 - Fred Foo
但是你如何学习阈值呢?这需要在朴素贝叶斯模型之上再拟合另一个模型。 - Fred Foo
@user2295350:对于文档,tf-idf加权词频是基本方法。 - Fred Foo
1
@larsmans 对于朴素贝叶斯、kNN和某些情况下的SVM,常见的方法之一是为每个文档-类别对获取一个分数。使用这种方法,您不需要为NB和kNN生成N个二进制分类器。在所有情况下,它们都使用训练集进行学习,并通过交叉验证和/或使用验证集来优化阈值,其中优化质量指标(例如F1)。完成此操作后,对于每个测试文档,分类器会产生每个类别的得分,如果该值高于阈值,则进行分类。 - miguelmalvarez
1
一些参考文献(之前由于空间不足无法粘贴)。[Lewis_2004] 关于最著名的文本分类集合之一(RCV1)的文章。他解释了如何在多标签环境中使用SVM进行阈值处理。[Yang_2001] 文本分类中阈值策略的研究。 - miguelmalvarez
显示剩余5条评论

0

我可以向您推荐一些工具,这些工具是weka的扩展,用于多标签分类。

  1. MEKA:WEKA的多标签扩展
  2. Mulan:用于多标签学习的Java库

还有一个SVM lib扩展SVMLib。如果您喜欢使用Python包,scikit learning也提供了一个多标签分类的包。

此外,ICML 2013年的一篇最新论文“Efficient Multi-label Classification with Many Labels”应该能帮助您实现多标签分类。如果您想自己实现一个多标签分类器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接