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

Java 自然语言处理-将文本特征转换为特征向量,java,nlp,svm,text-classification,Java,Nlp,Svm,Text Classification,所以我一直在做一个自然语言处理项目,我需要对不同的写作风格进行分类。假设我已经从文本中提取了语义特征,我计划使用Java中的Weka来训练SVM分类器,使用这些特征可以对其他不同的文本进行分类 我遇到的问题是,要训练支持向量机,必须将特征转换为特征向量。我不确定如何将诸如词汇丰富性、n-gram、标点符号、段落数量和段落长度等特征表示为向量中的数字。如果有人能指出正确的方向,我们将不胜感激。我不确定您的属性可以具有什么价值,但这个示例可能会帮助您: 假设我们正在进行一个有监督的学习实验,试图确定

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


我遇到的问题是,要训练支持向量机,必须将特征转换为特征向量。我不确定如何将诸如词汇丰富性、n-gram、标点符号、段落数量和段落长度等特征表示为向量中的数字。如果有人能指出正确的方向,我们将不胜感激。

我不确定您的属性可以具有什么价值,但这个示例可能会帮助您:

假设我们正在进行一个有监督的学习实验,试图确定句点是否标志着一个句子的结束,
EOS
NEOS
。训练数据来自段落格式的正常句子,但被转换为以下向量模型:

  • 第1栏:类别:句末或非句末
  • 第2-8列:围绕所述期间的+/-3个单词
  • 第9、10列:下一个可靠的句子定界符(例如?、!或段落标记)之前的句点的左/右字数
  • 第11列:句点后的空格数
当然,这不是一个非常复杂的问题,但这是一个很好的介绍Weka。我们不能仅仅使用单词作为特征(真正的高维空间),但我们可以使用它们的词性标签。我们还可以提取单词的长度,不管单词是否大写,等等

因此,您可以将任何内容作为测试数据提供,只要您能够将其转换为上面的向量模型并提取.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
    表示实数
  • 我用
    LC
    UC
    分别表示大写和小写
  • 大多数其他值是
    POS
    标记
你需要弄清楚你的特征是什么,以及你将使用什么值来表示/分类它们。然后,需要将数据转换为.arff定义的格式

关于标点符号问题,假设我们的句子都以
结尾。您可以有一个名为punc的属性,该属性具有两个值:

@attribute punc {'p','q'}
我没有使用
,因为当数据点丢失时,这是(传统上)分配的。我们的you可以具有布尔属性,指示是否存在字符或您拥有的内容(0、1或false、true)。另一个例子,但质量:

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

您如何确定所述分类取决于您,但以上内容应该让您开始。祝你好运

我试图尽可能详细地描述,但我正在使用平板电脑--这很难。不确定你到底在寻找什么,但希望我的小例子能帮助你。祝你好运