如何在scikit-learn中使用非整数字符串标签进行支持向量机(SVM)分类?Python

7
Scikit-learn为机器学习提供了相当用户友好的Python模块。
我正在尝试训练一个SVM标记器,用于自然语言处理(NLP),其中我的标签和输入数据是单词和注释。例如,词性标注,而不是使用双/整数数据作为输入元组[[1,2], [2,0]],我的元组将看起来像这样[['word', 'NOUN'], ['young', 'adjective']]
有人能给出一个如何使用字符串元组的SVM的例子吗?这里给出的教程/文档是针对整数/双精度浮点数输入的。http://scikit-learn.org/stable/modules/svm.html
2个回答

12

大多数机器学习算法处理的输入样本是浮点数向量,因此一对样本之间的小(通常是欧几里得)距离意味着这两个样本在问题方面是相似的

为了进行编码,机器学习从业者需要找到一组好的浮点特征。 由于这种编码是领域特定的,因此没有通用的方法可以通过原始数据构建该表示方式以适用于所有应用领域(各种NLP任务、计算机视觉、事务日志分析等)。这部分机器学习建模工作称为特征提取。当涉及大量手动工作时,通常称为特征工程

现在针对您的具体问题,可以使用scikit-learn的DictVectorizer特征提取助手类来适当地对句子中感兴趣的单词周围的窗口的POS标签进行编码,例如用于序列标记(如命名实体检测)。


请注意,对于POS标记,POS窗口只能向一个方向扩展。单词窗口也可以提供良好的特征(至少对于NER和WSD而言),以及所考虑的单词的固定长度的词缀。 - Fred Foo

4
这不是一个关于scikit或python的问题,而是SVM中的一般问题。在SVM中,数据实例必须表示为某种标量向量,通常是实数。因此,在包含在SVM中之前,必须首先将分类属性映射到某些数值。有些分类属性更自然/逻辑地倾向于映射到某个范围(一些松散的“度量”)。例如,对于具有“无急需”,“标准交付”,“紧急”和“最紧急”值的优先字段,可以使用(1、2、3、5)映射。另一个例子可能是颜色,可以将其映射到三个维度,分别为它们的红色、绿色、蓝色组件等。
其他属性没有语义允许任何近似逻辑映射到一个范围;这些属性的各种值必须在SVM的一个(或可能多个)维度上分配任意数值。如果SVM具有许多这些任意的“非度量”维度,则可以更少有效地对项进行正确分类,因为与SVM的工作隐含的距离计算和聚类逻辑相关性较小。
这一观察结果并不意味着在项目包含非数值或非“度量”维度时SVM就不能被使用,但这确实提醒我们特征选择和特征映射是分类器(尤其是SVM)中非常敏感的参数。
在词性标注的特定情况下...我恐怕目前还没有头绪,无法确定要使用已标记语料库的哪些属性以及如何将它们映射为数值。我知道SVMTool可以使用SVMs生成高效的词性标注器,也有几篇学术论文描述了基于SVM的标注器。然而,我更熟悉其他标注方法(例如HMM或最大熵)。

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