【问题标题】:How to use labels to classify text with scikit-learn?scikit-learn 如何使用标签对文本进行分类?
【发布时间】:2015-02-05 21:47:27
【问题描述】:

我有一个 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']]

【问题讨论】:

    标签: python python-2.7 machine-learning nlp artificial-intelligence


    【解决方案1】:

    在上面的代码中,假设我们有一个名为doc的特征向量,如果你这样写:

    result = s.predict (doc)
    

    result 应该是“0”或“1”。所以预测结果是数字的。因此,最好相应地分配标签。但是,如果您仍想分配一个字符串标签,那么您可以假设例如标签“a”等价于“1”,“b”等价于“0”。我知道与nltk 中的scikit 不同,默认情况下标签是字符串,但有什么区别吗?

    编辑 1:我可以从您的第一次编辑中看出,您可能对特征向量及其标签有误解。首先,您分配的标签类型不会影响结果,这意味着如果您将一个类别标签分配为垃圾邮件和一个非垃圾邮件,分类器不会自动检测垃圾邮件和非垃圾邮件;分类取决于您的特征向量,然后为了比较而使用类标签。因此,如果您说,我会假设在我的代码中,0 代表垃圾邮件,1 代表 HAM,并且您会相应地标记您的数据,它可以工作并且足够了。第二个问题是我不确定你是否知道二元特征向量应该是什么样子,因为你通过编写下面的代码来表示你的数据:

    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 数组而不是列表。但我的例子很清楚。阅读这个关于二元组的问题here 以及我的回答可能会对您有所帮助。如果您还有其他问题,请告诉我,但请尝试考虑上面的示例。

    编辑 2: 以防万一您想知道如何在代码中的变量 labels 中编写标签:对于每个文档(转换为特征向量表示),您必须有相应的标签。在您的代码数组中X 包含特征向量,因此在labels 中,您必须在数组中具有与X 相同位置的标签,对应于每个特征向量。因此,假设您有 100 个文档(50 个垃圾邮件或 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() 中,您可以使用后者,但是,请确保您的特征向量也是交错的并对应于正确的标签。

    【讨论】:

    • 我编辑了这个问题,如何使用字符串标签而不是数字或布尔标签?
    • @ml_guy 我对标签的外观进行了第二次编辑。现在解决了吗?
    • 感谢您的反馈。使用数字字符串标签(例如“POS”、“NEG”、“NEU”)怎么样?对于 svm 的特定情况,我可以使用字符串标签吗?。
    • 不!我向您解释过,您可以记录字符串标签并将它们与代码中的数字标签链接。这里也有人问过这个问题:stackoverflow.com/questions/13300160/…
    猜你喜欢
    • 2017-04-07
    • 2015-07-05
    • 2017-08-08
    • 2016-05-16
    • 2018-07-27
    • 2019-10-08
    • 2016-10-17
    • 2014-10-02
    • 1970-01-01
    相关资源
    最近更新 更多