基于libsvm的中文文本分类原型(2)

2020-02-21 00:20

lable2 index1:featureValue1 index2:featureValue2 index3:featureValue3 ...

对应到文本分类上就是:类别ID 特征序号(第3步计算的特征序号):特征值(TFIDF值)...... 如,我摘了一行,这是一篇文章的例子,8就是类别ID,189是特征“189 指导\的序号,0.171153是特征值:

8 189:0.171153 253:0.081381 298:0.630345 504:0.135512 562:79.423503 578:0.072219 698:0.078896 710:0.036074 740:0.215368 868:0.263524 1336:0.114355 1365:0.076494 1372:0.085780 1555:0.572497 1563:3.932806 1598:0.114717 1685:0.129870 1972:0.193693 2282:0.061828 2865:0.026699 2897:0.099020 3040:0.039621 3041:0.258073 3191:0.091276 3377:0.125544 3454:0.062189 3623:0.139698 3653:0.128304 3932:2.990233 4353:0.202133 4394:0.312992 4420:0.356354 4424:0.482424 4522:0.447795 4675:3.618182 4767:0.065334 4848:0.270417 4875:0.213588 4941:0.407453 5004:0.070447 5125:0.717893 5214:3.222299 5250:0.052897 5251:0.281352 5310:2.010101 5357:0.203956 5474:0.034037 5504:0.193900 5861:0.859426 6120:1.320504 6129:0.107941 6364:0.184225 6373:0.287843 6379:0.080727 6385:0.712241 6847:0.209023 7007:0.147802 7121:1.320504 7547:0.248161 7636:0.108981

采用TFIDF的算法,数据处理和特征选择类似,计算每个类,每篇文档,每个词的次数,以包含这个词的文档数。每篇文章的每个特征项,用TF/DF的值作为特征值。(后记:用TF * IDF,然后用svm-scale缩放到0,1之间,效果比TF/DF要好,准确率能达到82%。,计算方式如下: tf = float(times) / total

idf = math.log( N / float(term_count[term]) ) term_times[term] = tf * idf )

[python] view plain copy

1. #doc_term: class doc term times 2. #term_doc: term doccount 3. def tfidf(doc_term,term_doc): 4. print 'begin compute tf * idf'

5. for cls,docdi in doc_term.iteritems(): 6. for doc,termdi in docdi.iteritems(): 7. total = 0

8. for term,times in termdi.iteritems(): 9. total += times

10. for term,times in termdi.iteritems(): 11. tf = float(times) / total 12. df = float(term_doc[term]) / N 13. termdi[term] = tf / df

注意:用CHI是提取类别的特征词,而这里用TFIDF是计算文档的特征向量,前者是要体现类别的区分度,后者要体现文档的区分度,两者概念和所做的事情不一样,所以采用的方法也不一样。

5.用libsvm训练

你看,忙活了半天,还没有到libsvm呢,其实前面几步很麻烦的,libsvm的资料不少,但是都是一个几行数据的简单例子,这不具有实际应用的价值,只有把样本,分词,特征提取/特征计算搞定了,分类才能做好。 下载libsvm:

http://www.csie.ntu.edu.tw/~cjlin/cgi-bin/libsvm.cgi?+http://www.csie.ntu.edu.tw/~cjlin/libsvm+zip 解压,make

svm-scale:特征缩放的工具 svm-train:训练工具 svm-predict:测试工具 toos/grid.py:寻找参数的工具 用默认参数试试: ./svm-train train.s model.s

./svm-predict test.s model.s result.s

结果

Accuracy = 74.3889% (1339/1800) (classification)

不算太理想,也不算太差。如果只是2个类,结果能到95%。我想可以从如下几个方面改进:

? ? ?

增加分词的样本数,训练更好的分词模型。

特征提取后,用人工进行调整,因为很多词对于类别区分度不高。 用grid.py寻找合适的参数。

参考资料:

jasper的博客,SVM理论的学习资料:

http://www.blogjava.net/zhenandaci/category/31868.html 通俗易懂,要好好读读。

libsvm的官方网站:http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 看了理论性的东西,最好实践以下,libsvm就是很好的实践工具。


基于libsvm的中文文本分类原型(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2009年PS认证试题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: