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

6

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

我遇到的问题是,在训练SVM时,特征必须转换为特征向量。我不确定如何将诸如词汇丰富度、N元组、标点符号、段落数和段落长度等特征表示为向量中的数字。如果有人能指点我方向,那将不胜感激。


不确定您确切需要什么,但希望我的小例子能对您有所帮助。祝您好运。 - Steve P.
1个回答

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、true)。另一个例子,但是针对质量:

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

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

我尽可能详细地描述了,但是我在平板电脑上,有些困难。 - Steve P.

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