有人怀疑在python中为libsvm / scikit-learn库建模一些特性

时间:2015-06-28 19:51:31

标签: python dictionary scikit-learn libsvm

我已经删除了很多像这样的易趣游戏:

Apple iPhone 5 White 16GB Dual-Core

我已经用这种方式手动标记了所有这些

B M C S NA

其中B =品牌(Apple)M =型号(iPhone 5)C =颜色(白色)S =尺寸(尺寸)NA =未指定(双核)

现在我需要使用python中的libsvm库训练SVM分类器,以了解ebay标题中出现的序列模式。

我需要通过将问题视为分类来提取该属性(品牌,型号,颜色,尺寸)的新值。通过这种方式,我可以预测新的模型。

我想表示这些功能,以将它们用作libsvm库的输入。我在python工作:D。

  
      
  1. 当前词的身份
  2.   

我认为我可以用这种方式解释它

0 --> Brand
1 --> Model
2 --> Color
3 --> Size 
4 --> NA

如果我知道这个单词是Brand,我会将该变量设置为1(true)。在训练测试中可以这样做(因为我已经标记了所有单词)但是我怎样才能为测试集做到这一点?我不知道单词的类别(这就是我学习它的原因:D)。

  
      
  1. 当前单词的N-gram子串特征(N = 4,5,6)
  2.   

不知道,这意味着什么?

  
      
  1. 当前单词前2个单词的标识。
  2.   

如何为此功能建模?

考虑到我为第一个特征创建的图例,我有5 ^(5)组合

00 10 20 30 40
01 11 21 31 41
02 12 22 32 42
03 13 23 33 43
04 14 24 34 44

如何将其转换为libsvm(或scikit-learn)可以理解的格式?

4. Membership to the 4 dictionaries of attributes

我怎么能这样做?拥有4个字典(颜色,大小,型号和品牌)我必须创建一个bool变量,当我和4个字典中的一个字典中的当前单词匹配时,我将设置为true。

  
      
  1. 品牌词典的独家会员资格
  2.   

我认为像4.功能一样,我必须使用bool变量。你同意吗?

如果此问题缺少某些信息,请通过以下地址阅读我之前的问题:Support vector machine in Python using libsvm example of features

最后的疑问:如果我有像iPhone 5这样的多令牌价值......我必须像品牌一样标记iPhone,而像品牌一样标记5或者最好将{iPhone 5}全部标记为品牌?

在测试数据集中,iPhone和5将是2分隔单词...那么最好做什么?

1 个答案:

答案 0 :(得分:8)

在前一个问题中向您提出的解决方案的结果不足(我假设)的原因是该问题的特征很差。

如果我理解正确,你想要的是以下内容:

给出了句子 -

  

Apple iPhone 5白色16GB双核

你得到 -

  

B M C S NA

您在此处描述的问题等同于自然语言处理中的part of speech tagging(POS)。

请考虑以下英文句子:

  

我们看到了黄狗

POS的任务是为每个单词提供适当的标记。在这种情况下:

  

我们(PRP)看到(VBD)(DT)黄色(JJ)狗(NN)

请不要花时间在这里理解英文标签,因为我在这里只是为了向您展示您的问题和POS是否相同。

在我解释如何使用SVM解决它之前,我想让您了解其他方法:将句子Apple iPhone 5 White 16GB Dual-Core视为测试数据。当您标记单词Apple时,必须将您设置为单词iPhone的标记作为标记器的输入。但是,在将单词标记为单词后,您将不会更改它。因此,进行sequance标记的模型通常会获得更好的结果。最简单的例子是隐马尔可夫模型(HMM)。 Here是POS中HMM的简短介绍。

现在我们将此问题建模为分类问题。让我们定义什么是窗口 -

`W-2,W-1,W0,W1,W2`

这里,我们有一个大小为2的窗口。在对单词W0进行分类时,我们需要窗口中所有单词的特征(连接)。请注意,对于句子的第一个单词,我们将使用:

`START-2,START-1,W0,W1,W2`

为了模拟这是第一个单词的事实。对于我们的第二个词:

`START-1,W-1,W0,W1,W2`

同样句子结尾的单词。必须将标记START-2START-1STOP1STOP2添加到模型2中。

现在,让我们描述用于标记W0的功能:

Features(W-2),Features(W-1),Features(W0),Features(W1),Features(W2)

令牌的功能应该是单词本身和标签(赋予前一个单词)。我们将使用二进制特征。

示例 - 如何构建要素表示:

第1步 - 为每个令牌构建单词表示

让窗口大小为1.在对令牌进行分类时,我们使用W-1,W0,W1。假设您构建了一个字典,并在语料库中为每个单词提供了一个数字:

n['Apple'] = 0
n['iPhone 5'] = 1
n['White'] = 2
n['16GB'] = 3
n['Dual-Core'] = 4
n['START-1'] = 5
n['STOP1'] = 6

第2步 - 每个标记的功能标记

我们为以下标记创建功能:

n['B'] = 7 
n['M'] = 8
n['C'] = 9 
n['S'] = 10 
n['NA'] = 11
n['START-1'] = 12
n['STOP1'] = 13

让我们为START-1,Apple,iPhone 5构建一个特征向量:第一个标记是具有已知标记的单词(START-1将始终具有标记START-1)。因此,此令牌的功能是:

(0,0,0,0,0,0,1,0,0,0,0,0,1,0)

(功能为1:包含START-1字样,标记为START-1

对于令牌Apple

(1,0,0,0,0,0,0)

请注意,我们在W0之前为每个单词使用已经计算的标记功能(因为我们已经计算过它)。同样,令牌iPhone 5的功能:

(0,1,0,0,0,0,0)

第3步连接所有功能

通常,1窗口的功能将是:

word(W-1),tag(W-1),word(W0),word(W1)

关于您的问题 - 我会再使用一个标记 - number - 这样当您标记单词5时(因为您按空格分割标题),功能W0将会如果前一个标记被正确标记为模型,那么在某个数字上有1个特征,在W-1的{​​{1}}标记中有1个。

总结一下,你应该做什么:

  1. 为数据中的每个单词指定一个数字
  2. 构建列车数据的特征表示(使用您已手动计算的标签)
  3. 训练模特
  4. 标记测试数据
  5. 最终注释 - 现有代码的温馨提示:

    您可以找到在python here中实现的POS标记器。它包括问题和代码的解释,它也是我刚刚为您描述的这个功能提取。此外,他们使用model来表示每个单词的特征,因此代码更易于阅读。

    此标记器收到的数据应如下所示:

    set

    特征提取正在以这种方式进行(请参阅上面的链接中的更多内容):

    Apple_B iPhone_M 5_NUMBER White_C 16GB_S Dual-Core_NA
    

    对于上面的示例:

    def get_features(i, word, context, prev):
        '''Map tokens-in-contexts into a feature representation, implemented as a
        set. If the features change, a new model must be trained.'''
        def add(name, *args):
            features.add('+'.join((name,) + tuple(args)))
    
        features = set()
        add('bias') # This acts sort of like a prior
        add('i suffix', word[-3:])
        add('i-1 tag', prev)
        add('i word', context[i])
        add('i-1 word', context[i-1])
        add('i+1 word', context[i+1])
        return features
    

    通常,context = ["Apple","iPhone","5","White","16GB","Dual-Core"] prev = "B" i = 1 word = "iPhone" 是当前单词的str,word是分割为列表的标题,context是您为前一单词收到的标记。

    我过去使用此代码,效果很快,效果很好。 希望它清楚,有乐趣标记!