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

时间:2013-06-07 21:00:55

标签: java nlp weka feature-selection

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

  1. 构建一个由训练文本中提取的unigrams和bigrams组成的字典
  2. 计算每个训练文本中每个unigram / bigram出现的次数,以及unigram / bigram出现的训练文本数量
  3. 使用步骤2中的数据计算每个unigram / bigram的TF-IDF
  4. 对于每个文档,构造一个特征向量,该向量是字典的长度,并将相应的TF-IDF统计信息存储在向量的每个元素中(例如,文档1的特征向量中的第一个元素将对应相对于文档1),字典中第一个单词的TF-IDF
  5. 将类标签附加到每个要素向量,以区分哪个文本属于哪个作者
  6. 使用这些特征向量训练SVM
  7. 测试文本的特征向量以与训练文本相同的方式构建,并由SVM分类
  8. 另外,我是否需要训练具有更多功能的SVM?如果是这样,在这种情况下哪些功能最有效?非常感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:8)

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

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

  • 删除停用词 - 对于作者分类,这些通常很短,常见词如 ,< em>哪个,依此类推。
  • 词干 - 流行的词干分析器(如Porter词干分析器)使用一组规则来规范化词的变形。例如,步行步行步行都映射到词干步行
  • 相关/显着性阈值 - 计算Pearson相关系数或每个要素相对于类别标签的p值。然后设置阈值,并删除所有得分低于该阈值的值的功能。
  • 覆盖阈值 - 类似于上述阈值,移除至少在t个文档中没有出现的所有特征,其中t相对于整个语料库大小非常小(<0.05%)。
  • 根据词性过滤 - 例如,仅考虑动词或删除名词。
  • 根据系统类型进行过滤 - 例如,临床文本的NLP系统可能只考虑在医学词典中找到的单词。

对于词干分析,删除停用词,索引语料库,计算tf_idf或文档相似度,我建议使用Lucene。谷歌“Lucene在5分钟内”提供了一些关于使用lucene的快速简便的教程。

答案 1 :(得分:2)

在这些类型的分类中,重要的是你的矢量不是很大,因为你可以在其中获得大量的零,这可能会对结果产生不良影响,因为这些矢量太近而且很难将它们分开正确。此外,我建议你不要使用每个bigrams,选择频率最高的一些(在你的文字中),以减少矢量的大小,并保持足够的信息。一些技术人员为什么会被推荐:http://en.wikipedia.org/wiki/Curse_of_dimensionality最后也很重要的是你有多少数据,你的矢量越大你应该拥有的数据就越多。