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

Usi*_*Usi 8 python dictionary libsvm scikit-learn

我已经抓了很多像这样的ebay游戏:

Apple iPhone 5 White 16GB Dual-Core
Run Code Online (Sandbox Code Playgroud)

我用这种方式手动标记了所有这些内容

B M C S NA
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  1. 当前单词的身份

我想我可以用这种方式解释它

0 --> Brand
1 --> Model
2 --> Color
3 --> Size 
4 --> NA
Run Code Online (Sandbox Code Playgroud)

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

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

没有想法,这意味着什么?

  1. 当前单词前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
Run Code Online (Sandbox Code Playgroud)

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

4. Membership to the 4 dictionaries of attributes
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果这个问题缺少一些信息,请在此地址阅读我之前的问题:使用libsvm功能示例在Python中支持向量机

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

在测试数据集中,iPhone和5将是2个单独的单词...那么更好的做法是什么?

ome*_*rbp 8

在上一个问题中向您提出的解决方案的结果不充分(我假设)的原因是这个问题的特征很差.

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

鉴于这句话 -

Apple iPhone 5白色16GB双核

你得到 -

BMCS NA

您在此处描述的问题等同于自然语言处理中的词性标注(POS).

请考虑以下英文句子:

我们看到了那条黄狗

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

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

不要花时间在这里理解英文标签,因为我在这里只是为了告诉你你的问题和POS是平等的.

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

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

`W-2,W-1,W0,W1,W2`
Run Code Online (Sandbox Code Playgroud)

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

`START-2,START-1,W0,W1,W2`
Run Code Online (Sandbox Code Playgroud)

为了模拟这是第一个字的事实.对于我们的第二个字:

`START-1,W-1,W0,W1,W2`
Run Code Online (Sandbox Code Playgroud)

同样的句子末尾的单词.这种标签START-2,START-1,STOP1,STOP2必须添加到模型中的两个.

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

Features(W-2),Features(W-1),Features(W0),Features(W1),Features(W2)
Run Code Online (Sandbox Code Playgroud)

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

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

第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
Run Code Online (Sandbox Code Playgroud)

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

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

n['B'] = 7 
n['M'] = 8
n['C'] = 9 
n['S'] = 10 
n['NA'] = 11
n['START-1'] = 12
n['STOP1'] = 13
Run Code Online (Sandbox Code Playgroud)

让我们为以下内容构建一个特征向量START-1,Apple,iPhone 5:第一个标记是一个带有已知标记的单词(START-1将始终具有标记START-1).所以这个令牌的功能是:

(0,0,0,0,0,0,1,0,0,0,0,0,1,0)
Run Code Online (Sandbox Code Playgroud)

(1的功能:包含单词START-1和标签START-1)

对于令牌Apple:

(1,0,0,0,0,0,0)
Run Code Online (Sandbox Code Playgroud)

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

(0,1,0,0,0,0,0)
Run Code Online (Sandbox Code Playgroud)

第3步连接所有功能:

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

word(W-1),tag(W-1),word(W0),word(W1)
Run Code Online (Sandbox Code Playgroud)

关于你的问题-我会用一个多标签- number-所以,当你标记的话5(因为你分割称号空间),该功能W0将在对一些数字特征的1和1 W-1model标签-万一以前的标记被正确标记为模型.

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

  1. 给数据中的每个单词一个数字
  2. 构建列车数据的特征表示(使用您已手动计算的标签)
  3. 训练一个模型
  4. 标记测试数据

最后的注释 - 现有代码的温馨提示:

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

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

Apple_B iPhone_M 5_NUMBER White_C 16GB_S Dual-Core_NA
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

对于上面的例子:

context = ["Apple","iPhone","5","White","16GB","Dual-Core"]
prev = "B"
i = 1
word = "iPhone"
Run Code Online (Sandbox Code Playgroud)

通常,word是当前单词的str,context是分割成列表的标题,prev是您为前一个单词收到的标记.

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