307c tdjh bh71 f9f9 99jp uucg z5jd bv7t hv31 6e4w
tceic.com
学霸学习网 这下你爽了
相关标签
当前位置:首页 >> 计算机软件及应用 >>

应用scikit-learn做文本分类

标签:云罗天网 jlh7 希尔顿资讯端下载地址


应用 scikit-learn 做文本分类
分类: Data Mining Machine Learning Python2018-08-17 20:53 12438 人阅读 评论(16) 收藏 举报

20newsgroups 文本挖掘 Pythonscikitscipy
文本挖掘的 paper 没找到统一的 benchmark,只好自己跑程序,走过路过的前辈如果知道 20newsgroups 或者其它好用的公共数据集的分类(最好要所有类分类结果,全部或取部 分特征无所谓)麻烦留言告知下现在的 benchmark,万谢! 嗯,说正文。20newsgroups 官网上给出了 3 个数据集,这里我们用最原始的 20news-19997.tar.gz。

分为以下几个过程:

? ? ?

加载数据集 提 feature 分类
o o o

Naive Bayes KNN SVM

?

聚类

说明: scipy 官网上有参考,但是看着有点乱,而且有 bug。本文中我们分块来看。

Environment:Python 2.7 + Scipy (scikit-learn)

1.加载数据集
从 20news-19997.tar.gz 下载数据集,解压到 scikit_learn_data 文件夹下,加载数据,详 见 code 注释。
[python] view plaincopy

1. #first extract the 20 news_group dataset to /scikit_learn_data 2. from sklearn.datasets import fetch_20newsgroups 3. #all categories 4. #newsgroup_train = fetch_20newsgroups(subset='train') 5. #part categories 6. categories = ['comp.graphics', 7. 8. 9. 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware',

10. 'comp.windows.x']; 11. newsgroup_train = fetch_20newsgroups(subset = 'train',categories = categorie s);

可以检验是否 load 好了:
[python] view plaincopy

1. #print category names 2. from pprint import pprint 3. pprint(list(newsgroup_train.target_names))

结果: ['comp.graphics', 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware', 'comp.windows.x']

2. 提 feature:
刚才 load 进来的 newsgroup_train 就是一篇篇 document,我们要从中提取 feature,即 词频啊神马的,用 fit_transform

Method 1. HashingVectorizer,规定 feature 个数

[python] view plaincopy

1. #newsgroup_train.data is the original documents, but we need to extract the 2. #feature vectors inorder to model the text data 3. from sklearn.feature_extraction.text import HashingVectorizer 4. vectorizer = HashingVectorizer(stop_words = 'english',non_negative = True, 5. n_features = 10000) 6. fea_train = vectorizer.fit_transform(newsgroup_train.data) 7. fea_test = vectorizer.fit_transform(newsgroups_test.data); 8. 9. 10. #return feature vector 'fea_train' [n_samples,n_features] 11. print 'Size of fea_train:' + repr(fea_train.shape) 12. print 'Size of fea_train:' + repr(fea_test.shape) 13. #11314 documents, 130107 vectors for all categories 14. print 'The average feature sparsity is {0:.3f}%'.format( 15. fea_train.nnz/float(fea_train.shape[0]*fea_train.shape[1])*100);

结果:

Size of fea_train:(2936, 10000) Size of fea_train:(1955, 10000) The average feature sparsity is 1.002% 因为我们只取了 10000 个词,即 10000 维 feature,稀疏度还不算低。而实际上用 TfidfVectorizer 统计可得到上万维的 feature,我统计的全部样本是 13w 多维,就是一个 相当稀疏的矩阵了。

***************************************************************************************************** ********************* 上面代码注释说 TF-IDF 在 train 和 test 上提取的 feature 维度不同,那么怎么让它们相同 呢?有两种方法:

Method 2. CountVectorizer+TfidfTransformer

让两个 CountVectorizer 共享 vocabulary:
[python] view plaincopy

1. #---------------------------------------------------2. #method 1:CountVectorizer+TfidfTransformer 3. print '*************************\nCountVectorizer+TfidfTransformer\n******** *****************' 4. from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer 5. count_v1= CountVectorizer(stop_words = 'english', max_df = 0.5); 6. counts_train = count_v1.fit_transform(newsgroup_train.data); 7. print "the shape of train is "+repr(counts_train.shape) 8. 9. count_v2 = CountVectorizer(vocabulary=count_v1.vocabulary_); 10. counts_test = count_v2.fit_transform(newsgroups_test.data); 11. print "the shape of test is "+repr(counts_test.shape) 12.

13. tfidftransformer = TfidfTransformer(); 14. 15. tfidf_train = tfidftransformer.fit(counts_train).transform(counts_train); 16. tfidf_test = tfidftransformer.fit(counts_test).transform(counts_test);

结果: ************************* CountVectorizer+TfidfTransformer ************************* the shape of train is (2936, 66433) the shape of test is (1955, 66433)

Method 3. TfidfVectorizer

让两个 TfidfVectorizer 共享 vocabulary:
[python] view plaincopy

1. #method 2:TfidfVectorizer 2. print '*************************\nTfidfVectorizer\n************************* ' 3. from sklearn.feature_extraction.text import TfidfVectorizer 4. tv = TfidfVectorizer(sublinear_tf = True, 5. 6. max_df = 0.5, stop_words = 'english');

7. tfidf_train_2 = tv.fit_transform(newsgroup_train.data); 8. tv2 = TfidfVectorizer(vocabulary = tv.vocabulary_); 9. tfidf_test_2 = tv2.fit_transform(newsgroups_test.data); 10. print "the shape of train is "+repr(tfidf_train_2.shape) 11. print "the shape of test is "+repr(tfidf_test_2.shape) 12. analyze = tv.build_analyzer()

13. tv.get_feature_names()#statistical features/terms

结果:
************************* TfidfVectorizer ************************* the shape of train is (2936, 66433) the shape of test is (1955, 66433)

此外,还有 sklearn 里封装好的抓 feature 函数,fetch_20newsgroups_vectorized

Method 4. fetch_20newsgroups_vectorized

但是这种方法不能挑出几个类的 feature,只能全部 20 个类的 feature 全部弄出来:

[python] view plaincopy

1. print '*************************\nfetch_20newsgroups_vectorized\n*********** **************' 2. from sklearn.datasets import fetch_20newsgroups_vectorized 3. tfidf_train_3 = fetch_20newsgroups_vectorized(subset = 'train'); 4. tfidf_test_3 = fetch_20newsgroups_vectorized(subset = 'test'); 5. print "the shape of train is "+repr(tfidf_train_3.data.shape) 6. print "the shape of test is "+repr(tfidf_test_3.data.shape)

结果:

************************* fetch_20newsgroups_vectorized ************************* the shape of train is (11314, 130107) the shape of test is (7532, 130107)

3. 分类 3.1 Multinomial Naive Bayes Classifier
见代码&comment,不解释
[python] view plaincopy

1. ###################################################### 2. #Multinomial Naive Bayes Classifier 3. print '*************************\nNaive Bayes\n*************************' 4. from sklearn.naive_bayes import MultinomialNB 5. from sklearn import metrics 6. newsgroups_test = fetch_20newsgroups(subset = 'test', 7. categories = categories); 8. fea_test = vectorizer.fit_transform(newsgroups_test.data); 9. #create the Multinomial Naive Bayesian Classifier 10. clf = MultinomialNB(alpha = 0.01) 11. clf.fit(fea_train,newsgroup_train.target); 12. pred = clf.predict(fea_test); 13. calculate_result(newsgroups_test.target,pred); 14. #notice here we can see that f1_score is not equal to 2*precision*recall/(pr ecision+recall) 15. #because the m_precision and m_recall we get is averaged, however, metrics.f 1_score() calculates 16. #weithed average, i.e., takes into the number of each class into considerati on.

注意我最后的 3 行注释,为什么 f1≠2*(准确率*召回率)/(准确率+召回率)

其中,函数 calculate_result 计算 f1:
[python] view plaincopy

1. def calculate_result(actual,pred): 2. 3. 4. 5. 6. 7. 8. m_precision = metrics.precision_score(actual,pred); m_recall = metrics.recall_score(actual,pred); print 'predict info:' print 'precision:{0:.3f}'.format(m_precision) print 'recall:{0:0.3f}'.format(m_recall); print 'f1-score:{0:.3f}'.format(metrics.f1_score(actual,pred));

3.2 KNN:
[python] view plaincopy

1. ###################################################### 2. #KNN Classifier 3. from sklearn.neighbors import KNeighborsClassifier 4. print '*************************\nKNN\n*************************' 5. knnclf = KNeighborsClassifier()#default with k=5 6. knnclf.fit(fea_train,newsgroup_train.target) 7. pred = knnclf.predict(fea_test); 8. calculate_result(newsgroups_test.target,pred);

3.3 SVM:
[cpp] view plaincopy

1. ###################################################### 2. #SVM Classifier 3. from sklearn.svm import SVC 4. print '*************************\nSVM\n*************************' 5. svclf = SVC(kernel = 'linear')#default with 'rbf' 6. svclf.fit(fea_train,newsgroup_train.target) 7. pred = svclf.predict(fea_test); 8. calculate_result(newsgroups_test.target,pred);

结果:

************************* Naive Bayes ************************* predict info: precision:0.764 recall:0.759 f1-score:0.760 ************************* KNN ************************* predict info: precision:0.642 recall:0.635 f1-score:0.636 ************************* SVM ************************* predict info: precision:0.777 recall:0.774 f1-score:0.774

4. 聚类
[cpp] view plaincopy

1. ###################################################### 2. #KMeans Cluster 3. from sklearn.cluster import KMeans 4. print '*************************\nKMeans\n*************************' 5. pred = KMeans(n_clusters=5) 6. pred.fit(fea_test) 7. calculate_result(newsgroups_test.target,pred.labels_);

结果:
************************* KMeans ************************* predict info: precision:0.264 recall:0.226 f1-score:0.213

本文全部代码下载:在此

貌似准确率好低……那我们用全部特征吧……结果如下:
************************* Naive Bayes ************************* predict info: precision:0.771

recall:0.770 f1-score:0.769 ************************* KNN ************************* predict info: precision:0.652 recall:0.645 f1-score:0.645 ************************* SVM ************************* predict info: precision:0.819 recall:0.816 f1-score:0.816 ************************* KMeans ************************* predict info: precision:0.289 recall:0.313 f1-score:0.266

关于 Python 更多的学习资料将继续更新,敬请关注本博客和新浪微博 Rachel Zhang。


推荐相关:

scikit-learn学习笔记

scikit-learn学习笔记_计算机软件及应用_IT/计算机_专业资料。机器学习python库...适合做文本分类 解决小样本、非线性、高维 是用于分类、回归、孤立点检测的监督...


文本分类的常见方法

文本分类的常见方法_计算机软件及应用_IT/计算机_专业资料。有常见的特征项评估(...N=A+B+C+D 这里进行测试的类别和特征项将整个文档集合划分为四个部分:ABCD...


一个基于概念的中文文本分类模型

这种方法有了很多的应用, 但是其不足之处也是显而易见的: 1.正确率一般只能...对文本分类有用的概念, 它抽取短语周围的文本和潜在的语义概念进行文本类别的 ...


Python贝叶斯文本分类模型从原理到实现

Python贝叶斯文本分类模型从原理到实现_计算机软件及应用_IT/计算机_专业资料。...在 sklearn 中, MultinomialNB()类的 partial_fit()方法可以进行这种 训练。...


scikit-learn决策树算法类库使用小结

scikit-learn决策树算法类库使用小结_计算机软件及应用...了调优过的 CART 树算法,既可以做分类,又可以做...文档贡献者 thedust910 贡献于2018-08-17 ...


中文文本分类算法设计及其实现

文本,本质上只懂 得 0,1,因此若要对文本进行分类...文本分类应用领域 ......Learning(ICML~97),l997 [7]苏金树,张博锋:基于机器学习的文本分类技术研究进展...


文本分类python代码

文本分类python代码_计算机软件及应用_IT/计算机_专业资料。python文本分类源代码 #!/usr/bin/env python # -*-coding:utf8-*importos import codecs fromsklearn...


分享-文本分类实验报告

分享-文本分类实验报告_计算机软件及应用_IT/计算机_专业资料。数据挖掘 文本分类...(3) 基于上面对训练集经过处理得到的 5 个文件,对测试集文 件进行迭代,得到...


文本分类方法研究

随着信息技术的发展与应用,互联网上的数据错综复杂,面对如此 纷繁复杂的数据,...分类主要过程 2.1 文本分类的定义过程及评价文本分类的过程,可以将其看做为...


Web信息抽取中的文本分类

讨论了 SVM 在文本分类中的应用,并详细的分析了...has an important position in Machine learning theory...对文本集按照一定 的分类体系或标准进行自动分类标记...

网站首页 | 网站地图
All rights reserved Powered by 学霸学习网 www.tceic.com
copyright ©right 2010-2021。
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@126.com