自然语言处理 - 将文本特征转换为特征向量

时间:2013-05-29 20:54:41

标签: java nlp svm text-classification

所以我一直致力于一个自然语言处理项目,在这个项目中我需要对不同的写作风格进行分类。假设已经为我提取了文本的语义特征,我计划使用Java中的Weka来训练SVM分类器,使用这些可用于对其他不同文本进行分类的特征。

我遇到麻烦的部分是训练SVM,必须将这些特征转换为特征向量。我不确定你如何能够在向量中表示诸如词汇丰富度,n-gram,标点符号,段落数和段落长度等功能。如果有人能指出正确的方向,那将非常感激。

1 个答案:

答案 0 :(得分:5)

我不确定您的属性可以采用什么值,但也许这个示例可以帮助您:

假设我们正在进行有监督的学习实验,以确定句点是否标记句子的结尾,分别是EOSNEOS。训练数据来自段落样式格式的普通句子,但转换为以下矢量模型:

  • 第1栏:课程:句末或非句末
  • 第2-8列:相关时期周围的+/- 3个字
  • 第9,10列:分别在下一个可靠句子分隔符之前的句点左/右的字数(例如?,!或段落标记)。
  • 第11栏:句号之后的空格数。

当然,这不是一个非常复杂的问题需要解决,但它对Weka来说是一个不错的小介绍。我们不能只使用单词作为特征(真正的高维空间),但我们可以使用他们的POS(词性)标签。我们也可以提取单词的长度,无论单词是否大写等等。

因此,只要您能够将其转换为上面的矢量模型并提取.arff中使用的功能,您就可以将任何内容作为测试数据提供。

以下(非常小的部分).arff文件用于确定句子中的句点是否标记为结束:

@relation period

@attribute minus_three {'CC', 'CD', 'DT', 'FW', 'IN', 'JJ', 'JJR', 'JJS', 'LS', 'MD', 'NN', 'NNPS', 'NNS', 'NP', 'PDT', 'PRP', 'PRP$', 'RB', 'RBR', 'RBS', 'RP', 'UH', 'VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ', 'WDT', 'WP','WRB', 'NUM', 'PUNC', 'NEND', 'RAND'}
@attribute minus_three_length real
@attribute minus_three_case {'UC','LC','NA'}
@attribute minus_two {'CC', 'CD', 'DT', 'FW', 'IN', 'JJ', 'JJR', 'JJS', 'LS', 'MD', 'NN', 'NNPS', 'NNS', 'NP', 'PDT', 'PRP', 'PRP$', 'RB', 'RBR', 'RBS', 'RP', 'UH', 'VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ', 'WDT', 'WP','WRB', 'NUM', 'PUNC', 'NEND', 'RAND'}
@attribute minus_two_length real
@attribute minus_two_case {'UC','LC','NA'}
@attribute minus_one {'CC', 'CD', 'DT', 'FW', 'IN', 'JJ', 'JJR', 'JJS', 'LS', 'MD', 'NN', 'NNPS', 'NNS', 'NP', 'PDT', 'PRP', 'PRP$', 'RB', 'RBR', 'RBS', 'RP', 'UH', 'VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ', 'WDT', 'WP','WRB', 'NUM', 'PUNC', 'NEND', 'RAND'}
@attribute minus_one_length real
@attribute minus_one_case {'UC','LC','NA'}
@attribute plus_one {'CC', 'CD', 'DT', 'FW', 'IN', 'JJ', 'JJR', 'JJS', 'LS', 'MD', 'NN', 'NNPS', 'NNS', 'NP', 'PDT', 'PRP', 'PRP$', 'RB', 'RBR', 'RBS', 'RP', 'UH', 'VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ', 'WDT', 'WP','WRB', 'NUM', 'PUNC', 'NEND', 'RAND'}
@attribute plus_one_length real
@attribute plus_one_case {'UC','LC','NA'}
@attribute plus_two {'CC', 'CD', 'DT', 'FW', 'IN', 'JJ', 'JJR', 'JJS', 'LS', 'MD', 'NN', 'NNPS', 'NNS', 'NP', 'PDT', 'PRP', 'PRP$', 'RB', 'RBR', 'RBS', 'RP', 'UH', 'VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ', 'WDT', 'WP','WRB', 'NUM', 'PUNC', 'NEND', 'RAND'}
@attribute plus_two_length real
@attribute plus_two_case {'UC','LC','NA'}
@attribute plus_three {'CC', 'CD', 'DT', 'FW', 'IN', 'JJ', 'JJR', 'JJS', 'LS', 'MD', 'NN', 'NNPS', 'NNS', 'NP', 'PDT', 'PRP', 'PRP$', 'RB', 'RBR', 'RBS', 'RP', 'UH', 'VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ', 'WDT', 'WP','WRB', 'NUM', 'PUNC', 'NEND', 'RAND'}
@attribute plus_three_length real
@attribute plus_three_case {'UC','LC','NA'}
@attribute left_before_reliable real
@attribute right_before_reliable real
@attribute spaces_follow_period real
@attribute class  {'EOS','NEOS'}

@data

VBP, 2, LC,NP, 4, UC,NN, 1, UC,NP, 6, UC,NEND, 1, NA,NN, 7, LC,31,47,1,NEOS
NNS, 10, LC,RBR, 4, LC,VBN, 5, LC,?, 3, NA,NP, 6, UC,NP, 6, UC,93,0,0,EOS
VBD, 4, LC,RB, 2, LC,RP, 4, LC,CC, 3, UC,UH, 5, LC,VBP, 2, LC,19,17,2,EOS

正如您所看到的,每个属性都可以采用您想要的任何内容:

  • real表示实数
  • 我分别用LCUC来表示大写和小写
  • 其他大多数值均为POS代码

您需要确切了解您的功能是什么,以及您将使用哪些值来表示/分类它们。然后,您需要将数据转换为.arff定义的格式。

要触及您的标点符号问题,我们假设我们的句子都以.?结尾。您可以拥有一个名为punc的属性,该属性有两个值:

@attribute punc {'p','q'}

我没有使用?,因为这是(传统上)在缺少数据点时分配的内容。我们你可以有布尔属性来指示一个角色或你有什么(0,1或false,为真)。另一个例子,但质量:

@attribute quality {'great','good', 'poor'}

您如何确定所述分类取决于您,但上述内容应该可以帮助您入门。祝好运。