本特征提取:
將文本數據轉化成特征向量的過程
比較常用的文本特征表示法為詞袋法
詞袋法:
不考慮詞語出現的順序,每個出現過的詞匯單獨作為一列特征
這些不重復的特征詞匯集合為詞表
每一個文本都可以在很長的詞表上統計出一個很多列的特征向量
如果每個文本都出現的詞匯,一般被標記為 停用詞 不計入特征向量
主要有兩個api來實現 CountVectorizer 和 TfidfVectorizer
CountVectorizer:
只考慮詞匯在文本中出現的頻率
TfidfVectorizer:
除了考量某詞匯在文本出現的頻率,還關注包含這個詞匯的所有文本的數量
能夠削減高頻沒有意義的詞匯出現帶來的影響, 挖掘更有意義的特征
相比之下,文本條目越多,Tfid的效果會越顯著
下面對兩種提取特征的方法,分別設置停用詞和不停用,
使用朴素貝葉斯進行分類預測,比較評估效果
python3 學習api的使用
源代碼git: https://github.com/linyi0604/MachineLearning
代碼:
1 from sklearn.datasets import fetch_20newsgroups 2 from sklearn.cross_validation import train_test_split 3 from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer 4 from sklearn.naive_bayes import MultinomialNB 5 from sklearn.metrics import classification_report 6 7 ''' 8 文本特征提取: 9 將文本數據轉化成特征向量的過程 10 比較常用的文本特征表示法為詞袋法 11 詞袋法: 12 不考慮詞語出現的順序,每個出現過的詞匯單獨作為一列特征 13 這些不重復的特征詞匯集合為詞表 14 每一個文本都可以在很長的詞表上統計出一個很多列的特征向量 15 如果每個文本都出現的詞匯,一般被標記為 停用詞 不計入特征向量 16 17 主要有兩個api來實現 CountVectorizer 和 TfidfVectorizer 18 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.8397707979626485 99 更加詳細的評估指標: 100 precision recall f1-score support 101 102 0 0.86 0.86 0.86 201 103 1 0.86 0.59 0.70 365 104 2 0.10 0.89 0.17 27 105 3 0.88 0.60 0.72 350 106 4 0.78 0.93 0.85 204 107 5 0.84 0.82 0.83 271 108 6 0.70 0.91 0.79 197 109 7 0.89 0.89 0.89 239 110 8 0.92 0.98 0.95 257 111 9 0.91 0.98 0.95 233 112 10 0.99 0.93 0.96 248 113 11 0.98 0.86 0.91 272 114 12 0.88 0.85 0.86 259 115 13 0.94 0.92 0.93 252 116 14 0.96 0.89 0.92 239 117 15 0.96 0.78 0.86 285 118 16 0.96 0.88 0.92 272 119 17 0.98 0.90 0.94 252 120 18 0.89 0.79 0.84 214 121 19 0.44 0.93 0.60 75 122 123 avg / total 0.89 0.84 0.86 4712 124 125 去除停用詞的CountVectorizer提取的特征學習模型准確率: 0.8637521222410866 126 更加詳細的評估指標: 127 precision recall f1-score support 128 129 0 0.89 0.85 0.87 210 130 1 0.88 0.62 0.73 352 131 2 0.22 0.93 0.36 59 132 3 0.88 0.62 0.73 341 133 4 0.85 0.93 0.89 222 134 5 0.85 0.82 0.84 273 135 6 0.79 0.90 0.84 226 136 7 0.91 0.91 0.91 239 137 8 0.94 0.98 0.96 264 138 9 0.92 0.98 0.95 236 139 10 0.99 0.92 0.95 251 140 11 0.97 0.91 0.93 254 141 12 0.89 0.87 0.88 254 142 13 0.95 0.94 0.95 248 143 14 0.96 0.91 0.93 233 144 15 0.94 0.87 0.90 250 145 16 0.96 0.89 0.93 271 146 17 0.98 0.95 0.97 238 147 18 0.90 0.84 0.87 200 148 19 0.53 0.91 0.67 91 149 150 avg / total 0.90 0.86 0.87 4712 151 152 TfidVectorizer提取的特征學習模型准確率: 0.8463497453310697 153 更加詳細的評估指標: 154 precision recall f1-score support 155 156 0 0.67 0.84 0.75 160 157 1 0.74 0.85 0.79 218 158 2 0.85 0.82 0.83 256 159 3 0.88 0.76 0.82 275 160 4 0.84 0.94 0.89 217 161 5 0.84 0.96 0.89 229 162 6 0.69 0.93 0.79 192 163 7 0.92 0.84 0.88 259 164 8 0.92 0.98 0.95 259 165 9 0.91 0.96 0.94 238 166 10 0.99 0.88 0.93 264 167 11 0.98 0.73 0.83 321 168 12 0.83 0.91 0.87 226 169 13 0.92 0.97 0.95 231 170 14 0.96 0.89 0.93 239 171 15 0.97 0.51 0.67 443 172 16 0.96 0.83 0.89 293 173 17 0.97 0.92 0.95 245 174 18 0.62 0.98 0.76 119 175 19 0.16 0.93 0.28 28 176 177 avg / total 0.88 0.85 0.85 4712 178 179 去除停用詞的TfidVectorizer提取的特征學習模型准確率: 0.8826400679117148 180 更加詳細的評估指標: 181 precision recall f1-score support 182 183 0 0.81 0.86 0.83 190 184 1 0.81 0.85 0.83 238 185 2 0.87 0.84 0.86 257 186 3 0.88 0.78 0.83 269 187 4 0.90 0.92 0.91 235 188 5 0.88 0.95 0.91 243 189 6 0.80 0.90 0.85 230 190 7 0.92 0.89 0.90 244 191 8 0.94 0.98 0.96 265 192 9 0.93 0.97 0.95 242 193 10 0.99 0.88 0.93 264 194 11 0.98 0.85 0.91 273 195 12 0.86 0.93 0.89 231 196 13 0.93 0.96 0.95 237 197 14 0.97 0.90 0.93 239 198 15 0.96 0.70 0.81 320 199 16 0.98 0.84 0.90 294 200 17 0.99 0.92 0.95 248 201 18 0.74 0.97 0.84 145 202 19 0.29 0.96 0.45 48 203 204 avg / total 0.90 0.88 0.89 4712 205 '''