文本挖掘的paper没找到统一的benchmark,只好自己跑程序,走过路过的前辈如果知道20newsgroups或者其它好用的公共数据集的分类(最好要所有类分类结果,全部或取部分特征无所谓)麻烦留言告知下现在的benchmark,万谢!

嗯,说正文。20newsgroups官网上给出了3个数据集,这里我们用最原始的20news-19997.tar.gz

分为以下几个过程:

  • 加载数据集
  • 提feature
  • 分类
    • Naive Bayes
    • KNN
    • SVM
  • 聚类
说明: scipy官网上有参考,但是看着有点乱,而且有bug。本文中我们分块来看。
 
Environment:Python 2.7 + Scipy (scikit-learn)
 
1.加载数据集
20news-19997.tar.gz下载数据集,解压到scikit_learn_data文件夹下,加载数据,详见code注释。
  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. 'comp.os.ms-windows.misc',
  8. 'comp.sys.ibm.pc.hardware',
  9. 'comp.sys.mac.hardware',
  10. 'comp.windows.x'];
  11. newsgroup_train = fetch_20newsgroups(subset = 'train',categories = categories);
可以检验是否load好了:
  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个数
 
  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. #return feature vector 'fea_train' [n_samples,n_features]
  9. print 'Size of fea_train:' + repr(fea_train.shape)
  10. print 'Size of fea_train:' + repr(fea_test.shape)
  11. #11314 documents, 130107 vectors for all categories
  12. print 'The average feature sparsity is {0:.3f}%'.format(
  13. 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:
  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. count_v2 = CountVectorizer(vocabulary=count_v1.vocabulary_);
  9. counts_test = count_v2.fit_transform(newsgroups_test.data);
  10. print "the shape of test is "+repr(counts_test.shape)
  11. tfidftransformer = TfidfTransformer();
  12. tfidf_train = tfidftransformer.fit(counts_train).transform(counts_train);
  13. 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:
  1. #method 2:TfidfVectorizer
  2. print '*************************\nTfidfVectorizer\n*************************'
  3. from sklearn.feature_extraction.text import TfidfVectorizer
  4. tv = TfidfVectorizer(sublinear_tf = True,
  5. max_df = 0.5,
  6. 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全部弄出来:

 
  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,不解释
  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/(precision+recall)
  15. #because the m_precision and m_recall we get is averaged, however, metrics.f1_score() calculates
  16. #weithed average, i.e., takes into the number of each class into consideration.

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

其中,函数calculate_result计算f1:

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

3.2 KNN:

  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:

  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. 聚类

  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

from: http://blog.csdn.net/abcjennifer/article/details/23615947

应用scikit-learn做文本分类的更多相关文章

  1. 《机器学习系统设计》之应用scikit-learn做文本分类(上)

    前言: 本系列是在作者学习<机器学习系统设计>([美] WilliRichert)过程中的思考与实践,全书通过Python从数据处理.到特征project,再到模型选择,把机器学习解决这个 ...

  2. 使用CNN做文本分类——将图像2维卷积换成1维

    使用CNN做文本分类 from __future__ import division, print_function, absolute_import import tensorflow as tf ...

  3. 应用scikit-learn做文本分类(转)

    文本挖掘的paper没找到统一的benchmark,只好自己跑程序,走过路过的前辈如果知道20newsgroups或者其它好用的公共数据集的分类(最好要所有类分类结果,全部或取部分特征无所谓)麻烦留言 ...

  4. 如何使用scikit—learn处理文本数据

    答案在这里:http://www.tuicool.com/articles/U3uiiu http://scikit-learn.org/stable/modules/feature_extracti ...

  5. 文本分类实战(十)—— BERT 预训练模型

    1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...

  6. Tensorflor实现文本分类

    Tensorflor实现文本分类 下面我们使用CNN做文本分类 cnn实现文本分类的原理 下图展示了如何使用cnn进行句子分类.输入是一个句子,为了使其可以进行卷积,首先需要将其转化为向量表示,通常使 ...

  7. scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类 (python代码)

    scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类数据集 fetch_20newsgroups #-*- coding: UTF-8 -*- import ...

  8. R语言做文本挖掘 Part4文本分类

    Part4文本分类 Part3文本聚类提到过.与聚类分类的简单差异. 那么,我们需要理清训练集的分类,有明白分类的文本:測试集,能够就用训练集来替代.预測集,就是未分类的文本.是分类方法最后的应用实现 ...

  9. 基于Naive Bayes算法的文本分类

    理论 什么是朴素贝叶斯算法? 朴素贝叶斯分类器是一种基于贝叶斯定理的弱分类器,所有朴素贝叶斯分类器都假定样本每个特征与其他特征都不相关.举个例子,如果一种水果其具有红,圆,直径大概3英寸等特征,该水果 ...

随机推荐

  1. kibana 修改Ico图标

    修改此路径下的E:\happy\kinbana\kibana-4.2.2-windows\kibana-4.2.2-windows\optimize\bundles的commons.bundle.js ...

  2. Ombrophobic Bovines - POJ 2391

    Description FJ's cows really hate getting wet so much that the mere thought of getting caught in the ...

  3. PowerDesigner中创建Oracle表全过程记录

    本文记录如何在PowerDesigner中创建一个Oracle结构的表. 在进行本文阅读之前,需要在PowerDesigner进行 DBMS修改,DataBase创建,用户创建,表空间创建.   1. ...

  4. 【转载】Oracle实例和Oracle数据库(Oracle体系结构)

    免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:Leshami      原文地址:http://blog.csdn.net/ ...

  5. Hdu 1009 FatMouse' Trade 分类: Translation Mode 2014-08-04 14:07 74人阅读 评论(0) 收藏

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  6. Fiddler 过滤 css,图片等请求url 正则表达式

    设置步骤: 1.勾选 Request Headers 中的 Hide if url contains 过滤项 2.贴入下方正则表达式 REGEX:(?insx)/[^?/]*.(css|ico|jpg ...

  7. [百度空间] [原] 全局operator delete重载到DLL

    由于很久没有搞内存管理了,很多细节都忘记了今天项目要用到operator delete重载到DLL,发现了问题,网上搜索以后,再对比以前写的代码,发现了问题:原来MSVC默认的operator new ...

  8. 2013年优秀jQuery插件

    今天为大家推荐的是2013年的第一期,在这期里面十个jQuery插件涵盖了响应式的网格布局插件.图片放大插件.表单元素中自定义select插件,google 地图插件.文件拖放上传插件.tooltip ...

  9. ASP.NET页面优化性能提升方法记录

    今天与大家分享:一种优化页面执行速度的方法.采用这个方法,可以使用页面的执行速度获得[8倍]的提升效果. 为了让您对优化的效果有个直观的了解,我准备了下面的测试结果截图: 测试环境:1. Window ...

  10. unity3d中dllimport方法的使用,以接入腾讯平台为例!!!

    说到有关dllimport方法可能还有很多人比较陌生,其实我自己也说不太清楚,大概说说什么时候要用它. 事实上功能类似于调用android的第三包,我们想要使用苹果上特定的api或者第三方平台的一些东 ...