【问题标题】:which is best svm example which classifies plain input text?哪个是分类纯输入文本的最佳 svm 示例?
【发布时间】:2014-12-04 09:33:24
【问题描述】:

查了各种svm分类工具,主要有svmlight、pysvmlight、libsvm、scikit learn 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 分类器可以接受纯输入文本并为其提供分类结果?

【问题讨论】:

  • scikit-learn 不会强制您使用格式,但需要一些特征提取代码。请参阅tutorial。免责声明:我是 sklearn 的开发者之一,我相信其他库也有类似的能力。
  • @larsmans:非常感谢先生,scikit learn 提供了与 svmlight 的集成,我检查了 scikit learn 和 svm,但找不到如何将输入文本转换为特征:值,就像它在第二格式。能否请您对这个问题提出一些建议

标签: machine-learning scikit-learn classification svm


【解决方案1】:

是的,您可以在 scikit-learn 中执行此操作。

首先,使用CountVectorizer 将您的文本文档转换为文档术语矩阵。 (这被称为“词袋”表示,是从文本中提取特征的一种方法。)文档术语矩阵用作支持向量机或任何其他的 输入分类模型。

这里是文档术语矩阵的简要说明,来自scikit-learn documentation

在这个方案中,特征和样本定义如下:每个单个token出现频率(标准化与否)都被视为一个特征。给定文档的所有标记频率的向量被视为多变量样本

但是,在这种情况下,使用支持向量机 (SVM) 可能不是最好的主意。来自scikit-learn documentation

如果特征数量远大于样本数量,则该方法可能会表现不佳。

通常,文档-术语矩阵比样本(文档)具有更多的特征(唯一术语),因此 SVM 通常不是此类问题的最佳选择。

这里有一个lesson notebook 解释和演示 scikit-learn 中的整个过程,尽管它使用了不同的分类模型(朴素贝叶斯)。

【讨论】:

    【解决方案2】:

    我的答案是双重的

    有一些 SVM 实现直接处理文本数据,例如,https://github.com/timshenkao/StringKernelSVM。 LIBSVM 也可以到http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/#libsvm_for_string_data。 直接在文本数据上使用 SVM 的关键是所谓的字符串内核。在 SVM 中使用内核来测量不同数据点(即文本文档)之间的距离。字符串内核的一个例子是不同文本文档之间的编辑距离,c.f., 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,它结合了词袋和线性核。这在实现方面很容易,但也有缺点

    1. 与文本文档相比,词袋非常紧凑
    2. 您不能对文本文档的长度进行规范化,但可以对词袋进行特征规范化
    3. 不分离这些步骤会使您的代码更难重用

    两部分的底线:这与 SVM 无关,而与内核有关。

    【讨论】:

    • 我喜欢“这不是关于 SVM,而是关于内核”这句话 =)
    猜你喜欢
    • 2011-01-18
    • 1970-01-01
    • 2011-03-21
    • 2011-03-05
    • 2017-06-06
    • 1970-01-01
    • 2013-12-02
    • 2014-09-16
    • 1970-01-01
    相关资源
    最近更新 更多