所以我试图使用Weka SVM对文本进行分类。到目前为止,我用于训练SVM的特征向量是由训练文本中出现的一元和双元的TF-IDF统计数据组成的。但是,我从测试训练的SVM模型得到的结果根本不准确,所以有人能给我反馈我的程序吗?我按照以下步骤对文本进行分类:
- 构造一个由从训练文本中提取的一元和双元组成的字典
- 计算每个单图/双图在每个训练文本中出现的次数,以及该单图/双图在 中出现的训练文本的次数
- 使用步骤2中的数据计算每个单元/单元的TF-IDF
- 对于每个文档,构造一个表示字典长度的特征向量,并在该向量的每个元素中存储相应的TF-IDF统计量(例如,文档1的特征向量中的第一个元素将对应于字典中第一个单词相对于文档1的TF-IDF)
- 为每个特征向量附加类标签,以区分哪个文本属于哪个作者
- 使用这些特征向量训练SVM
- 测试文本的特征向量以与训练文本相同的方式构建,并通过SVM 进行分类。
另外,我是否需要用更多的特征来训练SVM ?如果是,在这种情况下,什么功能是最有效的?如有任何帮助,不胜感激。
自然语言文档通常包含许多只出现一次的单词,也称为Hapax Legomenon。例如,《白鲸》中44%的不同单词只出现一次,17%出现两次。
因此,包括语料库中的所有单词通常会导致过多的特征。为了减小这个特征空间的大小,NLP系统通常采用以下一种或多种方法:
- 删除停止词——对于作者分类,这些通常是简短和常见的词,如is, the, at, which,等等。
- 词干——流行的词干器(如波特词干器)使用一套规则来规范单词的屈折变化。例如,walk、walking和walks都映射到词干walk。
- 相关性/显著性阈值——计算皮尔逊相关系数或每个特征相对于类标签的p值。然后设置一个阈值,并删除得分低于该阈值的所有特征。
- 覆盖阈值——与上述阈值类似,删除至少t个文档中没有出现的所有特征,其中t非常小(<0.05%)相对于整个语料库大小。
- 基于词性的过滤——例如,只考虑动词,或去除名词。
- 基于系统类型的过滤——例如,临床文本的NLP系统可能只考虑在医学词典中找到的单词。
在这些类型的分类中,重要的是你的向量不是很大,因为你可以在其中得到很多零,这可能会对结果产生不好的影响,因为这些向量太接近了,很难正确地分离它们。此外,我建议你不要使用每个双元图,选择一些频率最高的(在你的文本中)来减少向量的大小并保留足够的信息。推荐的一些文章:http://en.wikipedia.org/wiki/Curse_of_dimensionality最后但同样重要的是你有多少数据,你的向量越大,你应该有更多的数据