5

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

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

另外,我是否需要用更多功能训练 SVM?如果是这样,在这种情况下哪些功能最有效?任何帮助将不胜感激,谢谢。

4

2 回答 2

8

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

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

  • 去除停用词 - 对于作者分类,这些通常是简短且常见的词,例如istheatwhich等。
  • 词干分析——流行的词干分析器(例如 Porter 词干分析器)使用一组规则来规范单词的变化。例如,walkwalkingwalks都映射到 stem walk
  • 相关/显着性阈值——计算皮尔逊相关系数或每个特征相对于类标签的 p 值。然后设置一个阈值,并删除所有得分低于该阈值的特征。
  • Coverage Threshold——与上面的阈值类似,去掉至少 t 个文档中没有出现的所有特征,其中 t 相对于整个语料库大小非常小(< 0.05%)。
  • 基于词性的过滤——例如,只考虑动词,或者去除名词。
  • 基于系统类型的过滤——例如,临床文本的 NLP 系统可能只考虑在医学词典中找到的单词。

对于词干提取、去除停用词、索引语料库以及计算 tf_idf 或文档相似度,我建议使用Lucene。谷歌“Lucene in 5 minutes”,获取一些关于使用 lucene 的快速简单的教程。

于 2013-06-08T23:45:02.407 回答
2

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

于 2013-06-07T22:00:28.460 回答