繁体   English   中英

如何使用scikit-learn使用标签对文本进行分类?

[英]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”。 我知道与nltkscikit不同,默认情况下标签是字符串,但是有什么区别吗?

编辑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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM