我已经删除了很多像这样的易趣游戏:
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。
- 当前词的身份
醇>
我认为我可以用这种方式解释它
0 --> Brand
1 --> Model
2 --> Color
3 --> Size
4 --> NA
如果我知道这个单词是Brand,我会将该变量设置为1(true)。在训练测试中可以这样做(因为我已经标记了所有单词)但是我怎样才能为测试集做到这一点?我不知道单词的类别(这就是我学习它的原因:D)。
- 当前单词的N-gram子串特征(N = 4,5,6)
醇>
不知道,这意味着什么?
- 当前单词前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。
- 品牌词典的独家会员资格
醇>
我认为像4.功能一样,我必须使用bool变量。你同意吗?
如果此问题缺少某些信息,请通过以下地址阅读我之前的问题:Support vector machine in Python using libsvm example of features
最后的疑问:如果我有像iPhone 5这样的多令牌价值......我必须像品牌一样标记iPhone,而像品牌一样标记5或者最好将{iPhone 5}全部标记为品牌?
在测试数据集中,iPhone和5将是2分隔单词...那么最好做什么?
答案 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-2
,START-1
,STOP1
,STOP2
添加到模型2中。
现在,让我们描述用于标记W0的功能:
Features(W-2),Features(W-1),Features(W0),Features(W1),Features(W2)
令牌的功能应该是单词本身和标签(赋予前一个单词)。我们将使用二进制特征。
让窗口大小为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
我们为以下标记创建功能:
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)
通常,1窗口的功能将是:
word(W-1),tag(W-1),word(W0),word(W1)
关于您的问题 - 我会再使用一个标记 - number
- 这样当您标记单词5
时(因为您按空格分割标题),功能W0
将会如果前一个标记被正确标记为模型,那么在某个数字上有1个特征,在W-1
的{{1}}标记中有1个。
您可以找到在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
是您为前一单词收到的标记。
我过去使用此代码,效果很快,效果很好。 希望它清楚,有乐趣标记!