我已经检查了各种svm分类工具,主要是svmlight,pysvmlight,libsvm,scikit学习svm分类器。
每个输入测试文件采用不同的格式,如
pysvmlight:
[(0, [(13.0, 1.0), (14.0, 1.0), (173.0, 1.0), (174.0, 1.0)]),
(0,
[(9.0, 1.0),
(10.0, 1.0),
(11.0, 1.0),
(12.0, 1.0),
(16.0, 1.0),
(19.0, 1.0),
(20.0, 1.0),
(21.0, 1.0),
(22.0, 1.0),
(56.0, 1.0)]
svmlight
+1 6:0.0342598670723747 26:0.148286149621374 27:0.0570037235976456 31:0.0373086482671729 33:0.0270832794680822 63:0.0317368459004657 67:0.138424991237843 75:0.0297571881179897 96:0.0303237495966756 142:0.0241139382095992 144:0.0581948804675796 185:0.0285004985793364 199:0.0228776475252599 208:0.0366675566391316 274:0.0528930062061687 308:0.0361623318128513 337:0.0374174808347037 351:0.0347329937800643 387:0.0690970538458777 408:0.0288195477724883 423:0.0741629177979597 480:0.0719961218888683 565:0.0520577748209694 580:0.0442849093862884 593:0.329982711875242 598:0.0517245325094578 613:0.0452655621746453 641:0.0387269206869957 643:0.0398205809532254 644:0.0466353065571088 657:0.0508331832990127 717:0.0495981406619795 727:0.104798994968809 764:0.0452655621746453 827:0.0418050310923008 1027:0.05114477444793 1281:0.0633241153685135 1340:0.0657101916402099 1395:0.0522617631894159 1433:0.0471872599750513 1502:0.840963375098259 1506:0.0686138465829187 1558:0.0589627036028818 1598:0.0512079697459134 1726:0.0660884976719923 1836:0.0521934221969394 1943:0.0587388821544177 2433:0.0666767220421155 2646:0.0729483627336339 2731:0.071437898589286 2771:0.0706069752753547 3553:0.0783933439550538 3589:0.0774668403369963
http://svm.chibi.ubc.ca//sample.test.matrix.txt
corner feature_1 feature_2 feature_3 feature_4
example_11 -0.18 0.14 -0.06 0.54
example_12 0.16 -0.25 0.26 0.33
example_13 0.06 0.0 -0.2 -0.22
example_14 -0.12 -0.22 0.29 -0.01
example_15 -0.20 -0.23 -0.1 -0.71
是否有任何svm分类器采用普通输入文本并为其提供分类结果?
答案 0 :(得分:5)
我的回答是两次
有一些SVM实现可直接处理文本数据,例如https://github.com/timshenkao/StringKernelSVM。 LIBSVM也适用于http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/#libsvm_for_string_data。 在文本数据上直接使用SVM的关键是所谓的String Kernel。在SVM中使用内核来测量不同数据点之间的距离,这些数据点是文本文档。 String内核的一个示例是编辑不同文本文档之间的距离,例如,http://www.jmlr.org/papers/volume2/lodhi02a/lodhi02a.pdf
问题在于使用文本内核进行文本分类是否是一个好主意。
简化支持向量机是一个函数
f(x) = sgn( <w,phi(x)> +b)
通常情况下,您会获取输入文档,为这些文档计算单词表示,然后采用线性标准内核。如下所示:
f(x) = sgn( <w,phi(bag-of-words(x))> +b)
你最想要的是一个带有内核的SVM,它结合了一些单词和线性内核。这很容易实现,但有缺点
两个部分的底线:它不是关于内核的SVM。
答案 1 :(得分:1)
是的,您可以在scikit-learn中执行此操作。
首先,使用CountVectorizer将文本文档转换为文档字词矩阵。 (这被称为&#34;词袋&#34;表示,是从文本中提取特征的一种方法。)文档术语矩阵用作支持向量的输入机器或任何其他分类模型。
以下是scikit-learn documentation:
对文档术语矩阵的简要说明在此方案中,功能和样本定义如下:每个单个令牌发生频率(标准化或未标准化)被视为功能。给定文档的所有令牌频率的向量被视为多元样本。
但是,在这种情况下,使用支持向量机(SVM)可能不是最佳选择。来自scikit-learn documentation:
如果特征数量远大于样本数量,则该方法可能会导致性能不佳。
通常,文档术语矩阵具有比样本(文档)更多的特征(唯一术语),因此SVM通常不是此类问题的最佳选择。
这是lesson notebook解释和演示scikit-learn中的整个过程,尽管它使用了不同的分类模型(朴素贝叶斯)。