我在使用LibSVM对书面文本进行分类(性别分类)。
我遇到了一些问题,不明白如何创建具有多个特征的LibSVM训练数据。
LibSVM中的训练数据构建如下:
label index1:value1 index2:value2
假设我想使用以下特征:
- Top_k单词:按标签使用最多的k个单词
- Top_k二元组:最常用的k个二元组
例如,计数可能会如下所示:
Word count Bigram count |-----|-----------| |-----|-----------| |word | counts | |bigra| counts | |-----|-----|-----| |-----|-----|-----| index |text | +1 | -1 | index |text | +1 | -1 | |-----|-----|-----| |-----|-----|-----| 1 |this | 3 | 3 | 4 |bi | 6 | 2 | 2 |forum| 1 | 0 | 5 |gr | 10 | 3 | 3 |is | 10 | 12 | 6 |am | 8 | 10 | |... | .. | .. | |.. | .. | .. | |-----|-----|-----| |-----|-----|-----|
假设k = 2,一个训练实例会是这样的吗?(计数与之前无关)
Label Top_kWords1:33 Top_kWords2:27 Top_kBigrams1:30 Top_kBigrams2:25
还是像这样(特征混合时是否有影响)?
Label Top_kWords1:33 Top_kBigrams1:30 Top_kWords2:27 Top_kBigrams2:25
我只想知道多个不同特征的特征向量是什么样的,以及如何构建它。
编辑:
根据上面的更新表格,这样的训练数据正确吗?
示例
1 1:3 2:1 3:10 4:6 5:10 6:8-1 1:3 2:0 3:12 4:2 5:3 6:10
回答:
libSVM的表示是纯粹数字的,因此
label index1:value1 index2:value2
意味着每个“标签”、“索引”和“值”都必须是数字。在你的情况下,你需要为你的特征编号,例如
1 1:23 2:47 3:0 4:1
如果某些特征的值为0,你可以省略它
1 1:23 2:47 4:1
记得要按递增顺序排列特征。
一般来说,libSVM不是为处理文本设计的,我不建议你这样做——而是使用一些已经存在的库,这些库可以轻松处理文本并封装了libsvm(例如NLTK或scikit-learn)