自然语言处理——用于文本分类的特征

5
我正在尝试使用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统计信息存储在向量的每个元素中(例如,文档一的特征向量的第一个元素将对应于相对于文档一的字典中的第一个单词的TF-IDF)
  5. 将类别标签附加到每个特征向量上,以区分哪些文本属于哪个作者
  6. 使用这些特征向量训练SVM
  7. 测试文本的特征向量与训练文本相同构造,然后通过SVM进行分类
此外,是否需要使用更多的特征来训练SVM?如果是这样,哪些特征在这种情况下最有效?任何帮助都将不胜感激,谢谢。
2个回答

8

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

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

  • 去除停用词 -- 用于作者分类,这些通常是短小常见的单词,例如istheatwhich等。
  • 词干提取 -- 流行的词干提取器(如波特词干提取器)使用一组规则来标准化单词的屈折形式。例如,walkwalkingwalks都映射到词干walk
  • 相关性/显著性阈值 -- 计算每个特征与类别标签的皮尔逊相关系数或p值。然后设置一个阈值,并删除所有得分低于该阈值的特征。
  • 覆盖率阈值 -- 类似于上述阈值,删除在至少t个文档中不出现的所有特征,其中t非常小(<0.05%),相对于整个语料库的大小而言。
  • 基于词性的过滤 -- 例如,仅考虑动词或删除名词。
  • 基于系统类型的过滤 -- 例如,针对临床文本的自然语言处理系统可能仅考虑医学字典中的单词。
对于词干提取、去除停用词、对语料库进行索引以及计算tf_idf或文档相似度,我建议使用Lucene。请搜索“Lucene in 5 minutes”获取有关使用Lucene的快速简易教程。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接