1 from sklearn.datasets importfetch_20newsgroups2 from sklearn.cross_validation importtrain_test_split3 from sklearn.feature_extraction.text importCountVectorizer, TfidfVectorizer4 from sklearn.naive_bayes importMultinomialNB5 from sklearn.metrics importclassification_report6
7 '''
8 文本特征提取:9 将文本数据转化成特征向量的过程10 比较常用的文本特征表示法为词袋法11 词袋法:12 不考虑词语出现的顺序,每个出现过的词汇单独作为一列特征13 这些不重复的特征词汇集合为词表14 每一个文本都可以在很长的词表上统计出一个很多列的特征向量15 如果每个文本都出现的词汇,一般被标记为 停用词 不计入特征向量16
17 主要有两个api来实现 CountVectorizer 和 TfidfVectorizer18 CountVectorizer:19 只考虑词汇在文本中出现的频率20 TfidfVectorizer:21 除了考量某词汇在文本出现的频率,还关注包含这个词汇的所有文本的数量22 能够削减高频没有意义的词汇出现带来的影响, 挖掘更有意义的特征23
24 相比之下,文本条目越多,Tfid的效果会越显著25
26
27 下面对两种提取特征的方法,分别设置停用词和不停用,28 使用朴素贝叶斯进行分类预测,比较评估效果29
30 '''
31
32
33 #1 下载新闻数据
34 news = fetch_20newsgroups(subset="all")35
36
37 #2 分割训练数据和测试数据
38 x_train, x_test, y_train, y_test =train_test_split(news.data,39 news.target,40 test_size=0.25,41 random_state=33)42
43
44 #3.1 采用普通统计CountVectorizer提取特征向量
45 #默认配置不去除停用词
46 count_vec =CountVectorizer()47 x_count_train =count_vec.fit_transform(x_train)48 x_count_test =count_vec.transform(x_test)49 #去除停用词
50 count_stop_vec = CountVectorizer(analyzer='word', stop_words='english')51 x_count_stop_train =count_stop_vec.fit_transform(x_train)52 x_count_stop_test =count_stop_vec.transform(x_test)53
54 #3.2 采用TfidfVectorizer提取文本特征向量
55 #默认配置不去除停用词
56 tfid_vec =TfidfVectorizer()57 x_tfid_train =tfid_vec.fit_transform(x_train)58 x_tfid_test =tfid_vec.transform(x_test)59 #去除停用词
60 tfid_stop_vec = TfidfVectorizer(analyzer='word', stop_words='english')61 x_tfid_stop_train =tfid_stop_vec.fit_transform(x_train)62 x_tfid_stop_test =tfid_stop_vec.transform(x_test)63
64
65 #4 使用朴素贝叶斯分类器 分别对两种提取出来的特征值进行学习和预测
66 #对普通通统计CountVectorizer提取特征向量 学习和预测
67 mnb_count =MultinomialNB()68 mnb_count.fit(x_count_train, y_train) #学习
69 mnb_count_y_predict = mnb_count.predict(x_count_test) #预测
70 #去除停用词
71 mnb_count_stop =MultinomialNB()72 mnb_count_stop.fit(x_count_stop_train, y_train) #学习
73 mnb_count_stop_y_predict = mnb_count_stop.predict(x_count_stop_test) #预测
74
75 #对TfidfVectorizer提取文本特征向量 学习和预测
76 mnb_tfid =MultinomialNB()77 mnb_tfid.fit(x_tfid_train, y_train)78 mnb_tfid_y_predict =mnb_tfid.predict(x_tfid_test)79 #去除停用词
80 mnb_tfid_stop =MultinomialNB()81 mnb_tfid_stop.fit(x_tfid_stop_train, y_train) #学习
82 mnb_tfid_stop_y_predict = mnb_tfid_stop.predict(x_tfid_stop_test) #预测
83
84 #5 模型评估
85 #对普通统计CountVectorizer提取的特征学习模型进行评估
86 print("未去除停用词的CountVectorizer提取的特征学习模型准确率:", mnb_count.score(x_count_test, y_test))87 print("更加详细的评估指标:\n", classification_report(mnb_count_y_predict, y_test))88 print("去除停用词的CountVectorizer提取的特征学习模型准确率:", mnb_count_stop.score(x_count_stop_test, y_test))89 print("更加详细的评估指标:\n", classification_report(mnb_count_stop_y_predict, y_test))90
91 #对TfidVectorizer提取的特征学习模型进行评估
92 print("TfidVectorizer提取的特征学习模型准确率:", mnb_tfid.score(x_tfid_test, y_test))93 print("更加详细的评估指标:\n", classification_report(mnb_tfid_y_predict, y_test))94 print("去除停用词的TfidVectorizer提取的特征学习模型准确率:", mnb_tfid_stop.score(x_tfid_stop_test, y_test))95 print("更加详细的评估指标:\n", classification_report(mnb_tfid_stop_y_predict, y_test))96
97 '''
98 未去除停用词的CountVectorizer提取的特征学习模型准确率: 0.839770797962648599 更加详细的评估指标:100 precision recall f1-score support101
102 0 0.86 0.86 0.86 201103 1 0.86 0.59 0.70 365104 2 0.10 0.89 0.17 27105 3 0.88 0.60 0.72 350106 4 0.78 0.93 0.85 204107 5 0.84 0.82 0.83 271108 6 0.70 0.91 0.79 197109 7 0.89 0.89 0.89 239110 8 0.92 0.98 0.95 257111 9 0.91 0.98 0.95 233112 10 0.99 0.93 0.96 248113 11 0.98 0.86 0.91 272114 12 0.88 0.85 0.86 259115 13 0.94 0.92 0.93 252116 14 0.96 0.89 0.92 239117 15 0.96 0.78 0.86 285118 16 0.96 0.88 0.92 272119 17 0.98 0.90 0.94 252120 18 0.89 0.79 0.84 214121 19 0.44 0.93 0.60 75122
123 avg / total 0.89 0.84 0.86 4712124
125 去除停用词的CountVectorizer提取的特征学习模型准确率: 0.8637521222410866126 更加详细的评估指标:127 precision recall f1-score support128
129 0 0.89 0.85 0.87 210130 1 0.88 0.62 0.73 352131 2 0.22 0.93 0.36 59132 3 0.88 0.62 0.73 341133 4 0.85 0.93 0.89 222134 5 0.85 0.82 0.84 273135 6 0.79 0.90 0.84 226136 7 0.91 0.91 0.91 239137 8 0.94 0.98 0.96 264138 9 0.92 0.98 0.95 236139 10 0.99 0.92 0.95 251140 11 0.97 0.91 0.93 254141 12 0.89 0.87 0.88 254142 13 0.95 0.94 0.95 248143 14 0.96 0.91 0.93 233144 15 0.94 0.87 0.90 250145 16 0.96 0.89 0.93 271146 17 0.98 0.95 0.97 238147 18 0.90 0.84 0.87 200148 19 0.53 0.91 0.67 91149
150 avg / total 0.90 0.86 0.87 4712151
152 TfidVectorizer提取的特征学习模型准确率: 0.8463497453310697153 更加详细的评估指标:154 precision recall f1-score support155
156 0 0.67 0.84 0.75 160157 1 0.74 0.85 0.79 218158 2 0.85 0.82 0.83 256159 3 0.88 0.76 0.82 275160 4 0.84 0.94 0.89 217161 5 0.84 0.96 0.89 229162 6 0.69 0.93 0.79 192163 7 0.92 0.84 0.88 259164 8 0.92 0.98 0.95 259165 9 0.91 0.96 0.94 238166 10 0.99 0.88 0.93 264167 11 0.98 0.73 0.83 321168 12 0.83 0.91 0.87 226169 13 0.92 0.97 0.95 231170 14 0.96 0.89 0.93 239171 15 0.97 0.51 0.67 443172 16 0.96 0.83 0.89 293173 17 0.97 0.92 0.95 245174 18 0.62 0.98 0.76 119175 19 0.16 0.93 0.28 28176
177 avg / total 0.88 0.85 0.85 4712178
179 去除停用词的TfidVectorizer提取的特征学习模型准确率: 0.8826400679117148180 更加详细的评估指标:181 precision recall f1-score support182
183 0 0.81 0.86 0.83 190184 1 0.81 0.85 0.83 238185 2 0.87 0.84 0.86 257186 3 0.88 0.78 0.83 269187 4 0.90 0.92 0.91 235188 5 0.88 0.95 0.91 243189 6 0.80 0.90 0.85 230190 7 0.92 0.89 0.90 244191 8 0.94 0.98 0.96 265192 9 0.93 0.97 0.95 242193 10 0.99 0.88 0.93 264194 11 0.98 0.85 0.91 273195 12 0.86 0.93 0.89 231196 13 0.93 0.96 0.95 237197 14 0.97 0.90 0.93 239198 15 0.96 0.70 0.81 320199 16 0.98 0.84 0.90 294200 17 0.99 0.92 0.95 248201 18 0.74 0.97 0.84 145202 19 0.29 0.96 0.45 48203
204 avg / total 0.90 0.88 0.89 4712205 '''