自然语言处理.文本分类的特征



所以我试图使用Weka SVM对文本进行分类。到目前为止,我用于训练SVM的特征向量是由训练文本中出现的一元和双元的TF-IDF统计数据组成的。但是,我从测试训练的SVM模型得到的结果根本不准确,所以有人能给我反馈我的程序吗?我按照以下步骤对文本进行分类:

  1. 构造一个由从训练文本中提取的一元和双元组成的字典
  2. 计算每个单图/双图在每个训练文本中出现的次数,以及该单图/双图在
  3. 中出现的训练文本的次数
  4. 使用步骤2中的数据计算每个单元/单元的TF-IDF
  5. 对于每个文档,构造一个表示字典长度的特征向量,并在该向量的每个元素中存储相应的TF-IDF统计量(例如,文档1的特征向量中的第一个元素将对应于字典中第一个单词相对于文档1的TF-IDF)
  6. 为每个特征向量附加类标签,以区分哪个文本属于哪个作者
  7. 使用这些特征向量训练SVM
  8. 测试文本的特征向量以与训练文本相同的方式构建,并通过SVM
  9. 进行分类。

另外,我是否需要用更多的特征来训练SVM ?如果是,在这种情况下,什么功能是最有效的?如有任何帮助,不胜感激。

自然语言文档通常包含许多只出现一次的单词,也称为Hapax Legomenon。例如,《白鲸》中44%的不同单词只出现一次,17%出现两次。

因此,包括语料库中的所有单词通常会导致过多的特征。为了减小这个特征空间的大小,NLP系统通常采用以下一种或多种方法:

  • 删除停止词——对于作者分类,这些通常是简短和常见的词,如istheatwhich,等等。
  • 词干——流行的词干器(如波特词干器)使用一套规则来规范单词的屈折变化。例如,walkwalkingwalks都映射到词干walk
  • 相关性/显著性阈值——计算皮尔逊相关系数或每个特征相对于类标签的p值。然后设置一个阈值,并删除得分低于该阈值的所有特征。
  • 覆盖阈值——与上述阈值类似,删除至少t个文档中没有出现的所有特征,其中t非常小(<0.05%)相对于整个语料库大小。
  • 基于词性的过滤——例如,只考虑动词,或去除名词。
  • 基于系统类型的过滤——例如,临床文本的NLP系统可能只考虑在医学词典中找到的单词。
对于词干提取、删除停止词、索引语料库和计算tf_idf或文档相似度,我建议使用Lucene。谷歌一下"Lucene in 5 minutes",你可以找到一些使用Lucene的快速而简单的教程。

在这些类型的分类中,重要的是你的向量不是很大,因为你可以在其中得到很多零,这可能会对结果产生不好的影响,因为这些向量太接近了,很难正确地分离它们。此外,我建议你不要使用每个双元图,选择一些频率最高的(在你的文本中)来减少向量的大小并保留足够的信息。推荐的一些文章:http://en.wikipedia.org/wiki/Curse_of_dimensionality最后但同样重要的是你有多少数据,你的向量越大,你应该有更多的数据

最新更新