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.
- 当前单词的身份
我想我可以用这种方式解释它
0 --> Brand
1 --> Model
2 --> Color
3 --> Size
4 --> NA
Run Code Online (Sandbox Code Playgroud)
如果我知道这个单词是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
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个字典之一中有当前单词的匹配时.
- 品牌词典的独家会员资格
我认为像4.功能一样,我必须使用bool变量.你同意吗?
如果这个问题缺少一些信息,请在此地址阅读我之前的问题:使用libsvm功能示例在Python中支持向量机
最后的疑问:如果我有像iPhone 5这样的多令牌价值......我必须像品牌一样标记iPhone,而像品牌一样标记5或者最好将{iPhone 5}全部标记为品牌?
在测试数据集中,iPhone和5将是2个单独的单词...那么更好的做法是什么?
在上一个问题中向您提出的解决方案的结果不充分(我假设)的原因是这个问题的特征很差.
如果我理解正确,你想要的是以下内容:
鉴于这句话 -
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.在对令牌进行分类时,我们使用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)
我们为以下标签创建功能:
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)
通常,1窗口的功能将是:
word(W-1),tag(W-1),word(W0),word(W1)
Run Code Online (Sandbox Code Playgroud)
关于你的问题-我会用一个多标签- number-所以,当你标记的话5(因为你分割称号空间),该功能W0将在对一些数字特征的1和1 W-1的model标签-万一以前的标记被正确标记为模型.
你可以在这里找到在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是您为前一个单词收到的标记.
我过去使用此代码,它运行速度快,效果很好.希望它清楚,有乐趣标记!