文本分类的特征select与缩减

我目前正在做一个项目,一个简单的情绪分析器 ,以便在不同的情况下会有2和3个class 。 我使用的是一个语料相当丰富语料库 (大约200.000)。 为了特征select ,我使用袋字法,为了减less独特特征的数量,由于出现频率的 阈值而消除。 最后一组特征包括大约20,000个特征,实际上减less90% ,但是对于testing预测的预期准确性 还不够 。 我依次使用LibSVMSVM-light进行训练和预测(包括线性RBF内核 )以及PythonBash

到目前为止观察到的最高精度 是75%左右 ,我至less需要90%二进制分类就是这种情况。 对于多class培训 ,准确率降至〜60% 。 在这两种情况下,我至less需要90% ,并且不能如何增加它:通过优化训练参数通过优化特征select

我已经阅读了关于文本分类中的特征select的文章,并且我发现使用了三种不同的方法,实际上它们之间有明确的相关性。 这些方法如下:

  • 书包的频率方法(BOW)
  • 信息增益 (IG)
  • X ^ 2统计 (CHI)

第一种方法已经是我使用的方法,但是我使用它非常简单,需要指导以更好地使用它以获得足够高的准确性。 我也缺乏关于IGCHI实际实施的知识,并且希望有任何帮助来指导我。

非常感谢,如果您需要任何其他信息的帮助,请让我知道。


  • @larsmans: Frequency Threshold(频率阈值) :我正在寻找例子中唯一词的出现次数,例如,如果一个词在不同的例子中频繁出现,它被包含在特征集中作为一个独特的特征。

  • @TheManWithNoName:首先感谢您解释文档分类的一般问题。 我审查和试验了你提出的所有方法和其他方法。 我发现比例差异 (PD)方法是最好的特征select,其中function单一和术语存在 (TP)的权重(我不明白你为什么标签术语频率逆文档频率 (TF- IDF)作为索引方法,我宁愿把它看作一个特征加权方法)。 正如你所提到的, 预处理也是这个任务的一个重要方面。 我使用某些types的string消除来细化数据以及形态分析词干 。 另外请注意,我正在使用土耳其语 ,与英语相比,它有不同的特点 。 最后,我设法达到88%的准确度 (f-measure)和二级分类的84% 。 这些价值是我使用的模型成功的坚实certificate。 这是我迄今为止所做的。 现在从事聚类和缩减模型研究,已经尝试过LDALSI,并转向moVMF ,也许还有球形模型 (LDA + moVMF),这种模型在新闻语料库等客观性质的语料库上似乎效果较好。 如果您对这些问题有任何信息和指导,我将不胜感激。 我特别需要在特征空间方法(LDA,LSI,moVMF等)和聚类方法 (k-means,hierarchical等)之间build立一个接口(python oriented,open-source)。

这可能是晚了一点,但…

正如Bee指出的那样,您已经意识到,如果您在分类之前的阶段已经丢失了信息,则将SVM用作分类器会被浪费。 然而,文本分类的过程需要更多的只是几个阶段,每个阶段对结果都有显着的影响。 因此,在研究更复杂的特征select措施之前,有许多简单的可能性,通常需要更低的资源消耗。

您是否在执行令牌/表示到袋子格式之前预处理文件? 简单地删除停用词或标点符号可以大大提高准确性。

你有没有考虑改变你的书包表示法来使用,例如,单词对或n-gram? 你可能会发现,你有更多的维度开始,但他们进一步压缩,并包含更多有用的信息。

还值得注意的是降维特征select/特征提取。 不同之处在于特征select以单variables的方式减小了维度,即它以当前出现的个体为基础去除术语而不改变它们,而特征提取(我认为Ben Allison指的是)是多variables的,将一个或多个单个术语一起产生更高的orthangonal术语(希望)包含更多的信息并减less特征空间。

关于你使用文件频率,你只是使用包含一个术语的文件的概率/百分比,或者你使用文件中的术语密度? 如果第一类只有10个对手,而且每个都包含一个词,那么第一类确实与文档相关联。 但是,如果第二类只有10个文件每个包含相同的术语一百次,那么显然第二类与第一类的关系明显更高。 如果没有考虑术语密度,这些信息就会丢失,越less的类别对这种损失的影响就越大。 在类似的说明中,只保留频率高的术语并不总是谨慎的,因为它们实际上可能没有提供任何有用的信息。 例如,如果一个术语在每个文档中出现了一百次,那么它就被认为是一个噪声术语,虽然看起来很重要,但将它保留在特征集中并没有什么实际价值。

另外,你如何索引数据,你是否使用简单的布尔索引vector空间模型或更复杂的措施,如TF-IDF? 考虑到您的情况下类别数量较less,一个更复杂的测量将是有益的,因为它们可以说明每个类别在整个数据集中的重要性的重要性。

就个人而言,我会首先尝试一些上述的可能性,然后考虑调整复杂方程(或复合方程的组合)的特征select/提取,如果你需要额外的性能提升。


额外

基于新的信息,听起来好像你在正确的轨道上,84%以上的准确性(F1或BEP–基于多类问题的精度和召回)对于大多数数据集通常被认为是非常好的。 您可能已经成功地从数据中获得了所有信息丰富的function,或者less数仍在修剪中。

话虽如此,可以用来作为一个特定数据集减less可能性的预测因子的是“离群值计数”分析,它使用信息增益在外围特征中的下降来确定信息的可能性会有多大在functionselect过程中丢失。 你可以在原始数据和/或处理过的数据上使用它来估计你应该如何积极地修剪特征(或根据具体情况修改它们)。 一篇描述它的论文可以在这里find:

带有exception计数信息的纸张

关于将TF-IDF描述为索引方法,作为特征加权方法是正确的,但我认为它主要用作索引过程的一部分(尽pipe它也可以用于降维)。 这样做的推理是,一些措施更好地针对特征select/提取,而其他措施则更适合于文档向量中的特征加权(即索引数据)。 这通常是由于降维措施是在每个类别基础上确定的,而指标权重措施往往是更多的文件导向,以提供优越的向量表示。

关于LDA,LSI和moVMF,恐怕我对他们的经验太less,不能提供任何指导。 不幸的是,我也没有使用土耳其数据集或python语言。

我会build议降维而不是functionselect。 考虑奇异值分解 , 主成分分析 ,甚至更好的考虑它是为词袋表示, 潜在狄利克雷分配量身定做的。 这将允许您在概念上保留包含所有单词的表示,但是通过利用它们之间的相似性(甚至是同义词types)关系将它们折叠成较less的维度。

所有这些方法都有相当标准的实现,你可以访问和运行 – 如果你让我们知道你正在使用哪种语言,我或其他人将能够指出你在正确的方向。

线性svm推荐用于高维度特征。 根据我的经验,SVM精确度的最终限制取决于正面和负面的“特征”。 您可以执行网格search(或者在线性svm的情况下,您可以search最佳成本值)以find最佳参数以获得最大精度,但是最终受限于function集的可分离性。 你没有达到90%的事实意味着你仍然有一些工作要find更好的function来描述你的class级成员。

我相信这对于海报来说太晚了,但也许对其他人有用。 卡方减less特征的方法非常简单。 假设BoW二进制分类为C1和C2类,对于候选特征中的每个特征f计算C1中f的频率; 计算总词C1; 重复计算C2; 根据p值是否低于某个阈值(例如,p <0.05)计算卡方确定滤波器候选特征。 使用Python和nltk的教程可以在这里看到: http ://streamhacker.com/2010/06/16/text-classification-sentiment-analysis-eliminate-low-information-features/(但如果我没有记错,我相信作者错误地将这种技术应用于他的testing数据,这会偏离报告的结果)。