[英]How to use labels to classify text with scikit-learn?
我有一个NLP任务(文本分类)。 我提取了一些像这样的二元组:
training_data = [[('this', 'is'), ('is', 'a'), ('a', 'text')],
[('and', 'one'), ('one', 'more')]]
然后我可以使用一些矢量化器,像这样:
from sklearn.feature_extraction import FeatureHasher
fh = FeatureHasher(input_type='string')
X = fh.transform(((' '.join(x) for x in sample)
for sample in training_data))
print X.toarray()
[[ 0. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]]
这就是svm算法可用于分类的方式:
from sklearn import svm
s = svm.SVC()
lables = [HAM, SPAM]
s.fit(training_data, labels)
我如何在上述Brigam中使用标签(即training_data
)进行分类?例如:
data = [[('this', 'is'), ('is', 'a'), ('a', 'text'), 'SPAM'],
[('and', 'one'), ('one', 'more'), 'HAM']]
在上面的代码中,假设我们有一个名为doc
的特征向量,如果您编写:
result = s.predict (doc)
result
应为“ 0”或“ 1”。 因此,预测结果是数字。 因此,最好相应地分配标签。 但是,如果仍要分配字符串标签,则可以假设标签“ a”等效于“ 1”,而“ b”等效于“ 0”。 我知道与nltk
的scikit
不同,默认情况下标签是字符串,但是有什么区别吗?
编辑1:从您的第一次编辑中可以看出,您可能对特征向量及其标签有误解。 首先,您分配的标签类型不会影响结果,这意味着,如果您将类别标签分配为垃圾邮件,而将一个标签分配为非垃圾邮件,则分类器不会自动检测垃圾邮件和非垃圾邮件。 分类取决于您的特征向量,然后为了比较起见,使用类标签。 因此,如果您说的话,我假设在我的代码中0表示一个SPAM,1表示一个HAM,并且您将相应地标记数据,这样就可以正常工作了。 第二个问题是我不确定您是否知道bigram特征向量的外观,因为您通过编写下面的代码表示数据的方式是:
data = [[('this', 'is'), ('is', 'a'), ('a', 'text'), 'SPAM'],
[('and', 'one'), ('one', 'more'), 'HAM']]
一个二元组特征向量应包含数据集中存在的所有可能特征,然后,要表示每个文档,必须为该文档中存在的所有特征分配1,然后为其余特征分配0。 例如,我将以正确的格式重写您的上述示例:
Features: 'this is' 'is a' 'a text' 'and one' 'one more' Label
doc 1: 1 1 1 0 0 SPAM (or as I explained 0)
doc 2: 0 0 0 1 1 HAM (or as I explained 1)
现在,我们可以按以下形式编写上述文档的特征向量:
data = [([1,1,1,0,0),(0)],[(0,0,0,1,1),(1)]]
请注意,第一个文档的标签为0(或SPAM),第二个文档的标签为1(或HAM)。 我试图举一个非常明确的例子。 使用scikit时,您可能更喜欢使用numpy数组而不是list。 但是我的例子很清楚。 在此处阅读有关二元组的问题以及我的回答可能会对您有所帮助。 让我知道您是否还有其他问题,请尝试考虑上述示例。
编辑2:以防万一您想知道如何在代码的变量labels
中写入标签:对于每个文档(转换为特征向量表示),您都必须有一个对应的标签。 在您的代码数组中, X
包含特征向量,因此在labels
,必须具有与每个特征向量相对应的标签,它们在数组中的位置与X
相同。 因此,假设您有100个文档(50个SPAM或0和50 HAM或1),则标签应如下所示:
labels = [0,0,0,0,0,0,0,0,...,1,1,1,1,1,1,1,...]
但这取决于您如何订购数据。 一些分类器将采用上述标签,而某些分类器将采用0和1插入,例如:
labels = [0,1,0,1,0,1, ...]
在svm.SVC()中,您可以使用后者,但是,请确保特征向量也已插入并与正确的标签相对应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.