文本分类的特征选择与缩减

时间:2012-11-28 11:22:00

标签: nlp svm feature-extraction sentiment-analysis

我目前正在开发一个项目,一个简单情绪分析器,以便单独案例中有 2和3个类。我在独特单词(大约200.000)的方式中使用了非常丰富语料库。我使用词汇方法进行功能选择并减少唯一功能的数量,因为 出现频率的阈值最终功能包含大约20.000个功能,实际上减少90%,但不够用于预期准确性 LibSVM SVM-light 进行训练和预测(线性 RBF内核)和一般来说还 Python Bash

到目前为止观察到的最高准确度 约为75%,而我至少需要90%。这是二进制分类的情况。对于多级培训,准确度降至 ~60%。我在两种情况下都需要至少90%,并且无法计算如何增加它:通过优化训练参数通过优化特征选择?< / p>

我在文本分类中阅读了有关特征选择的文章,我发现使用了三种不同的方法,它们之间实际上有明显的相关性。这些方法如下:

  • 词袋(BOW)的频率逼近
  • 信息增益(IG)
  • X ^ 2统计(CHI)

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

非常感谢,如果您需要任何其他信息以获取帮助,请告诉我们。


  • @larsmans:频率阈值:我正在寻找示例中出现的唯一字词,这样如果一个单词在不同的示例中频繁出现,它就会包含在该功能中设置为一个独特的功能。

  • @TheManWithNoName:首先感谢您努力解释文档分类的一般问题。我检查并试验了你提出的所有方法和其他方法。我发现比例差异(PD)方法最适合于特征选择,其中特征是单向和术语存在(TP)用于加权(我不明白为什么您将 Term-Frequency-Inverse-Document-Frequency (TF-IDF)标记为索引方法,我将其视为功能加权方法。正如您所提到的,预处理也是此任务的一个重要方面。我使用某些类型的字符串消除来优化数据以及形态解析阻止。另请注意,我正在使用土耳其语,与英语相比具有不同的特征。最后,我为二元分类达到 ~88%准确度(f-measure),多类 ~84% 即可。这些值是我使用的模型成功的坚实证据。这就是我到目前为止所做的。现在正在研究聚类和缩减模型,尝试过 LDA LSI ,然后继续 moVMF ,可能球形模型 (LDA + moVMF),它似乎在具有客观性质的语料库上更好地工作,如新闻语料库。如果您对这些问题有任何信息和指导,我将不胜感激。我需要信息特别是在特征空间降维方法(LDA,LSI,moVMF等)和聚类方法(k)之间设置接口(面向python,开源) - 意思,等级等。)。

5 个答案:

答案 0 :(得分:36)

这可能有点晚了,但是......

正如Bee指出并且您已经知道,如果您在分类之前已经丢失了阶段中的信息,那么使用SVM作为分类器将会被浪费。然而,文本分类的过程需要更多,只需几个阶段,每个阶段对结果有显着影响。因此,在研究更复杂的特征选择测量之前,有许多更简单的可能性,通常需要更低的资源消耗。

在执行tokensiation / representation to words-of-words格式之前,您是否预处理文档?简单地删除停用词或标点符号可以大大提高准确性。

您是否考虑过更改要使用的词袋表示,例如单词对或n-gram?您可能会发现自己有更多维度,但它们会进一步缩减并包含更多有用的信息。

还值得注意的是,降维特征选择/特征提取。不同之处在于特征选择以单变量的方式减小尺寸,即它在当前出现的情况下单独删除术语而不改变它们,而特征提取(我认为Ben Allison指的是)是多变量的,组合一个或多个单个术语一起产生更高的orthangonal术语,(希望)包含更多信息并减少特征空间。

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

另外,如何索引数据,是使用带有简单布尔索引的向量空间模型还是使用更复杂的度量(如TF-IDF)?考虑到场景中的类别数量较少,更复杂的度量将是有益的,因为它们可以解释每个类别在整个数据集中的重要性的术语重要性。

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


其他

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

话虽如此,可以用来预测特定数据集的积极降维程度的预测因素是“异常值计数”分析,该分析利用外围特征中信息增益的下降来确定它的可能性。在功能选择期间,该信息将丢失。您可以在原始数据和/或已处理数据上使用它来估计您应该如何积极地修剪特征(或根据具体情况取消它们)。可以在这里找到描述它的论文:

Paper with Outlier Count information

关于将TF-IDF描述为索引方法,你是一个正确的特征加权度量,但我认为它主要用作索引过程的一部分(尽管它也可以用于降维)。对此的推理是,一些测量更好地针对特征选择/提取,而其他测量更适合于特征在文档向量中的特征加权(即索引数据)。这通常是由于尺寸减少措施是基于每个类别确定的,而指数加权措施倾向于更加面向文档以提供更好的矢量表示。

关于LDA,LSI和moVMF,我担心我们对它们提供任何指导的经验太少。不幸的是,我还没有使用土耳其数据集或python语言。

答案 1 :(得分:5)

我建议降维,而不是选择特征。考虑singular value decompositionprincipal component analysis,或者更好地考虑它是​​针对词袋表示而定制的Latent Dirichlet Allocation。这将允许您在概念上保留包含所有单词的表示,但通过利用它们之间的相似性(甚至同义词类型)关系将它们折叠为更少的维度。

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

答案 2 :(得分:1)

对于高维特征,建议使用线性svm。根据我的经验,SVM精度的最终限制取决于正面和负面的“特征”。您可以进行网格搜索(或者在线性svm的情况下,您可以搜索最佳成本值)以找到最佳参数以获得最大精度,但最终您受到功能集可分性的限制。你没有获得90%这一事实意味着你仍然需要做一些工作来寻找更好的功能来描述你的班级成员。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

有一个python库供功能选择 TextFeatureSelection。该库以分数的形式为每个单词标记,双字母组,三字母组等提供区分能力。

那些了解机器学习中特征选择方法的人,它基于 filter方法,并为ML工程师提供了所需的工具,以提高其NLP和深度学习模型中的分类准确性。它有4种方法,分别是卡方共同信息比例差异信息获取,以帮助选择单词作为功能,然后再输入到机器学习分类器中。

from TextFeatureSelection import TextFeatureSelection

#Multiclass classification problem
input_doc_list=['i am very happy','i just had an awesome weekend','this is a very difficult terrain to trek. i wish i stayed back at home.','i just had lunch','Do you want chips?']
target=['Positive','Positive','Negative','Neutral','Neutral']
fsOBJ=TextFeatureSelection(target=target,input_doc_list=input_doc_list)
result_df=fsOBJ.getScore()
print(result_df)

#Binary classification
input_doc_list=['i am content with this location','i am having the time of my life','you cannot learn machine learning without linear algebra','i want to go to mars']
target=[1,1,0,1]
fsOBJ=TextFeatureSelection(target=target,input_doc_list=input_doc_list)
result_df=fsOBJ.getScore()
print(result_df)

检查项目以获取详细信息:https://pypi.org/project/TextFeatureSelection/