我正在尝试使用感知器进行监督分类,从而对句子进行词性标注。目前我假设每个单词的标签是相互独立的(即我仅使用单词本身作为特征)。我对机器学习算法还比较陌生,因此无法弄清楚如何为每个单词表示特征函数。
我有一个包含100个句子的训练集,每个单词都被赋予了一个特定的标签(例如N,名词;V,动词;J,形容词等)。例如,
Jack(N) and(&) Jill(N) went(V) to(PRP) Peru(N)
其中标签用括号括起来。假设我总共有10种可能的标签。现在我的问题是,单词Jack的特征向量是什么样的?
我非常希望将其实现为向量,因为这样我的代码会更符合符号表示。一旦我弄清楚特征函数的形式,我就能实现感知器算法!
另外,假设我想添加一些特征,比如(a)首字母是否大写?(b)单词是否有连字符?我该如何将这些特征纳入我的特征向量中呢?
直觉上我能看出向量只需要有二进制值,但我无法进一步推进。
如果可能的话,请尽量用具体的例子来解释!
回答:
使用一个字典,将单词映射到数字ID。如果你的词汇表中有10,000个项目,你的字典将每个单词映射到0-9999之间的一个数字,每个单词被表示为长度为10,000的二进制向量,其中只有一个元素是激活的:对应于字典中单词的ID。
如果你想在单词ID之外添加额外的特征,你可以将这些特征附加到特征向量的末尾:也就是说,你可以将10,000+的特征设置为大写特征,前一个标签特征(需要像上面一样进行二进制编码)等。
最后一点,词性标注是一个结构化预测问题,而不是一系列独立的分类。如果这不仅仅是一个学术练习,你将需要转向结构化感知器,或其他结构化学习方法,如CRF或结构化SVM。
编辑:一个简单的例子
假设我有一个五个单词的词汇表,{the,cat,sat,on,mat},以及一个简化的标签集{DET,N,V,PREP}。我的句子因此是:
(The,DET) (cat,N) (sat,V) (on,PREP) (the,DET) (mat,N)。
现在我想为每个单词创建一个特征向量,从中我希望能够预测标签。我将使用特征0-4作为我的单词ID指示函数,因此特征0对应于’the’,特征1对应于’cat’,依此类推。这给我带来了以下特征向量(后面跟着预期的“类”或标签分配):
[1 0 0 0 0] -> DET[0 1 0 0 0] -> N[0 0 0 0 0] -> V...
我可以将这些视为实例,并将我选择的学习算法应用于这个任务,然而,仅靠单词ID函数并不能给我带来太多帮助。我决定我想将一些类似HMM的直觉纳入我的分类中,所以我还添加了指示前一个标签是什么的特征函数。因此,我使用特征5-8作为这些指示,5对应于DET,6对应于N,依此类推。现在我有了以下内容:
[1 0 0 0 0 0 0 0 0] -> DET (因为这是第一个单词,所以没有前一个标签)[0 1 0 0 0 1 0 0 0] -> N[0 0 0 0 0 0 1 0 0] -> V
现在我可以随心所欲地继续添加特征,例如使用特征9来指示单词是否大写,特征10可能是单词是否与已知专有名词列表匹配,等等。如果你阅读了一些关于结构化预测任务和方法的内容,你应该会明白为什么使用为此任务定制的模型(最简单的就是HMM,但我希望进展到CRF/结构化感知器/结构化SVM以获得最先进的性能)比将其视为一系列独立的决策要优越。