python - 文本分类的特征选择和约简

标签 python nlp svm sentiment-analysis feature-extraction

我目前正在做一个项目,一个 简单的情感分析器 这样就会有 2、3类单独的案例 .我正在使用 语料库真漂亮独特的词 (大约 200.000)。我用过 词袋 的方法特征选择并减少的数量独特功能 ,消除是由于 阈值 发生频率 . 最终功能集 包括大约 20.000 个特征,这实际上是一个 减少 90% ,但是 不够适用于 精度的测试预测。我正在使用 LibSVM SVM-light 依次用于训练和预测( 线性 RBF 核 )以及 python 重击 一般来说。

最高精度 到目前为止观察到 大约是 75% 和我 至少需要 90% . 就是这种情况二元分类 .对于 多类培训 ,准确率下降到 ~60% .我至少需要 90% 在这两种情况下,无法弄清楚如何增加它:通过 优化训练参数 通过优化特征选择 ?

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

  • 的频率接近词袋 (弓)
  • 信息增益 (IG)
  • X^2 统计 (气)

  • 第一种方法已经是我使用的方法,但我使用它非常简单,需要指导才能更好地使用它以获得足够高的准确性。我也缺乏关于 的实际实现的知识IG 并寻求任何帮助以这种方式指导我。

    非常感谢,如果您需要任何其他信息寻求帮助,请告诉我。

  • @larsmans:频率阈值 :我正在寻找示例中唯一单词的出现次数,这样如果一个单词在不同示例中出现的频率足够高,它就会作为唯一特征包含在特征集中。
  • @TheManWithNoName:首先感谢您努力解释文档分类的一般问题。我检查并试验了您提出的所有方法和其他方法。我找到了 比例差 (PD) 方法最适合特征选择,其中特征是 uni-grams 和 术语存在 (TP) 用于加权(我不明白你为什么标记 Term-Frequency-Inverse-Document-Frequency (TF-IDF) 作为索引方法,我宁愿将其视为 功能加权 方法)。 预处理 正如你提到的,这也是这项任务的一个重要方面。我使用了某些类型的字符串消除来优化数据以及 形态解析词干 .另请注意,我正在处理 土耳其语 ,其中有 不同的特性与英语相比。最后,我设法联系到了 ~88% 准确率 (f-measure) for 二进制 分类和 ~84% 多类 .这些值是我使用的模型成功的有力证明。这是我迄今为止所做的。现在正在研究聚类和归约模型,尝试过 LDA LSI 然后转到 moVMF 也许 球形模型 (LDA + moVMF),这似乎在具有客观性质的语料库上效果更好,例如新闻语料库。如果您有关于这些问题的任何信息和指导,我将不胜感激。我特别需要信息来设置 之间的接口(interface)(面向 python,开源)特征空间降维方法(LDA、LSI、moVMF 等)和 聚类方法 (k 均值、分层等)。
  • 最佳答案

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

    正如 Bee 指出的并且您已经意识到,如果您在分类之前的各个阶段已经丢失了信息,那么使用 SVM 作为分类器就是浪费。然而,文本分类的过程需要的不仅仅是几个阶段,每个阶段都会对结果产生重大影响。因此,在研究更复杂的特征选择措施之前,有许多更简单的可能性,通常需要低得多的资源消耗。

    在将标记化/表示成词袋格式之前,您是否对文档进行了预处理?简单地删除停用词或标点符号可能会大大提高准确性。

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

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

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

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

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

    附加

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

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

    Paper with Outlier Count information

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

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

    关于python - 文本分类的特征选择和约简,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13603882/

    相关文章:

    python - 如果该 RGB 值属于列表,如何替换图像中的所有 RGB 值

    python - 检查矩阵的每一行是否在另一个矩阵中 [Python]

    python - 如何提高 TensorFlow 中分类、非二元、外语情感分析模型的准确性?

    python - 如何知道有多少个是0级,有多少个是1级?

    java - Encog SVM 无法训练

    python - 计算从头到尾有障碍物的路径数

    python - 为 Python 程序创建配置文件

    machine-learning - 作者唯一的 "literary style"可以用来识别他/她是文本的作者吗?

    python - 在python中替换撇号/短词

    python - 如何在 sklearn 中使用 SVC 运行 RFECV