機器學(xué)習(xí):python 文本特征提取 CountVectorizer, TfidfVectorizer

本特征提取:
將文本數(shù)據(jù)轉(zhuǎn)化成特征向量的過程
比較常用的文本特征表示法為詞袋法

詞袋法:
不考慮詞語出現(xiàn)的順序卒蘸,每個出現(xiàn)過的詞匯單獨作為一列特征
這些不重復(fù)的特征詞匯集合為詞表
每一個文本都可以在很長的詞表上統(tǒng)計出一個很多列的特征向量
如果每個文本都出現(xiàn)的詞匯呼渣,一般被標記為 停用詞 不計入特征向量

主要有兩個api來實現(xiàn) CountVectorizer 和 TfidfVectorizer
CountVectorizer:考慮詞匯在文本中出現(xiàn)的頻率
TfidfVetorizer:除了考量某詞匯在文本出現(xiàn)的頻率,還關(guān)注包含這個詞匯的所有文本的數(shù)量霜医,能夠削減高頻沒有意義的詞匯出現(xiàn)帶來的影響, 挖掘更有意義的特征坤次,文本條目越多,Tfid的效果會越顯著

'''
from sklearn.datasets import fetch_20newsgroups
from sklearn.cross_validation import train_test_split
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report

1 下載新聞數(shù)據(jù)

news = fetch_20newsgroups(subset="all")

2 分割訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)

x_train, x_test, y_train, y_test = train_test_split(news.data,
news.target,
test_size=0.25,
random_state=33)

3.1 采用普通統(tǒng)計CountVectorizer提取特征向量

默認配置不去除停用詞

count_vec = CountVectorizer()
x_count_train = count_vec.fit_transform(x_train)
x_count_test = count_vec.transform(x_test)

去除停用詞

count_stop_vec = CountVectorizer(analyzer='word', stop_words='english')
x_count_stop_train = count_stop_vec.fit_transform(x_train)
x_count_stop_test = count_stop_vec.transform(x_test)

3.2 采用TfidfVectorizer提取文本特征向量

默認配置不去除停用詞

tfid_vec = TfidfVectorizer()
x_tfid_train = tfid_vec.fit_transform(x_train)
x_tfid_test = tfid_vec.transform(x_test)

去除停用詞

tfid_stop_vec = TfidfVectorizer(analyzer='word', stop_words='english')
x_tfid_stop_train = tfid_stop_vec.fit_transform(x_train)
x_tfid_stop_test = tfid_stop_vec.transform(x_test)

4 使用樸素貝葉斯分類器 分別對兩種提取出來的特征值進行學(xué)習(xí)和預(yù)測

對普通通統(tǒng)計CountVectorizer提取特征向量 學(xué)習(xí)和預(yù)測

mnb_count = MultinomialNB()
mnb_count.fit(x_count_train, y_train) # 學(xué)習(xí)
mnb_count_y_predict = mnb_count.predict(x_count_test) # 預(yù)測

去除停用詞

mnb_count_stop = MultinomialNB()
mnb_count_stop.fit(x_count_stop_train, y_train) # 學(xué)習(xí)
mnb_count_stop_y_predict = mnb_count_stop.predict(x_count_stop_test) # 預(yù)測

對TfidfVectorizer提取文本特征向量 學(xué)習(xí)和預(yù)測

mnb_tfid = MultinomialNB()
mnb_tfid.fit(x_tfid_train, y_train)
mnb_tfid_y_predict = mnb_tfid.predict(x_tfid_test)

去除停用詞

mnb_tfid_stop = MultinomialNB()
mnb_tfid_stop.fit(x_tfid_stop_train, y_train) # 學(xué)習(xí)
mnb_tfid_stop_y_predict = mnb_tfid_stop.predict(x_tfid_stop_test) # 預(yù)測

5 模型評估

對普通統(tǒng)計CountVectorizer提取的特征學(xué)習(xí)模型進行評估

print("未去除停用詞的CountVectorizer提取的特征學(xué)習(xí)模型準確率:", mnb_count.score(x_count_test, y_test))
print("更加詳細的評估指標:\n", classification_report(mnb_count_y_predict, y_test))
print("去除停用詞的CountVectorizer提取的特征學(xué)習(xí)模型準確率:", mnb_count_stop.score(x_count_stop_test, y_test))
print("更加詳細的評估指標:\n", classification_report(mnb_count_stop_y_predict, y_test))

對TfidVectorizer提取的特征學(xué)習(xí)模型進行評估

print("TfidVectorizer提取的特征學(xué)習(xí)模型準確率:", mnb_tfid.score(x_tfid_test, y_test))
print("更加詳細的評估指標:\n", classification_report(mnb_tfid_y_predict, y_test))
print("去除停用詞的TfidVectorizer提取的特征學(xué)習(xí)模型準確率:", mnb_tfid_stop.score(x_tfid_stop_test, y_test))
print("更加詳細的評估指標:\n", classification_report(mnb_tfid_stop_y_predict, y_test))

'''
未去除停用詞的CountVectorizer提取的特征學(xué)習(xí)模型準確率: 0.8397707979626485
更加詳細的評估指標:
precision recall f1-score support

      0       0.86      0.86      0.86       201
      1       0.86      0.59      0.70       365
      2       0.10      0.89      0.17        27
      3       0.88      0.60      0.72       350
      4       0.78      0.93      0.85       204
      5       0.84      0.82      0.83       271
      6       0.70      0.91      0.79       197
      7       0.89      0.89      0.89       239
      8       0.92      0.98      0.95       257
      9       0.91      0.98      0.95       233
     10       0.99      0.93      0.96       248
     11       0.98      0.86      0.91       272
     12       0.88      0.85      0.86       259
     13       0.94      0.92      0.93       252
     14       0.96      0.89      0.92       239
     15       0.96      0.78      0.86       285
     16       0.96      0.88      0.92       272
     17       0.98      0.90      0.94       252
     18       0.89      0.79      0.84       214
     19       0.44      0.93      0.60        75

avg / total 0.89 0.84 0.86 4712

去除停用詞的CountVectorizer提取的特征學(xué)習(xí)模型準確率: 0.8637521222410866
更加詳細的評估指標:
precision recall f1-score support

      0       0.89      0.85      0.87       210
      1       0.88      0.62      0.73       352
      2       0.22      0.93      0.36        59
      3       0.88      0.62      0.73       341
      4       0.85      0.93      0.89       222
      5       0.85      0.82      0.84       273
      6       0.79      0.90      0.84       226
      7       0.91      0.91      0.91       239
      8       0.94      0.98      0.96       264
      9       0.92      0.98      0.95       236
     10       0.99      0.92      0.95       251
     11       0.97      0.91      0.93       254
     12       0.89      0.87      0.88       254
     13       0.95      0.94      0.95       248
     14       0.96      0.91      0.93       233
     15       0.94      0.87      0.90       250
     16       0.96      0.89      0.93       271
     17       0.98      0.95      0.97       238
     18       0.90      0.84      0.87       200
     19       0.53      0.91      0.67        91

avg / total 0.90 0.86 0.87 4712

TfidVectorizer提取的特征學(xué)習(xí)模型準確率: 0.8463497453310697
更加詳細的評估指標:
precision recall f1-score support

      0       0.67      0.84      0.75       160
      1       0.74      0.85      0.79       218
      2       0.85      0.82      0.83       256
      3       0.88      0.76      0.82       275
      4       0.84      0.94      0.89       217
      5       0.84      0.96      0.89       229
      6       0.69      0.93      0.79       192
      7       0.92      0.84      0.88       259
      8       0.92      0.98      0.95       259
      9       0.91      0.96      0.94       238
     10       0.99      0.88      0.93       264
     11       0.98      0.73      0.83       321
     12       0.83      0.91      0.87       226
     13       0.92      0.97      0.95       231
     14       0.96      0.89      0.93       239
     15       0.97      0.51      0.67       443
     16       0.96      0.83      0.89       293
     17       0.97      0.92      0.95       245
     18       0.62      0.98      0.76       119
     19       0.16      0.93      0.28        28

avg / total 0.88 0.85 0.85 4712

去除停用詞的TfidVectorizer提取的特征學(xué)習(xí)模型準確率: 0.8826400679117148
更加詳細的評估指標:
precision recall f1-score support

      0       0.81      0.86      0.83       190
      1       0.81      0.85      0.83       238
      2       0.87      0.84      0.86       257
      3       0.88      0.78      0.83       269
      4       0.90      0.92      0.91       235
      5       0.88      0.95      0.91       243
      6       0.80      0.90      0.85       230
      7       0.92      0.89      0.90       244
      8       0.94      0.98      0.96       265
      9       0.93      0.97      0.95       242
     10       0.99      0.88      0.93       264
     11       0.98      0.85      0.91       273
     12       0.86      0.93      0.89       231
     13       0.93      0.96      0.95       237
     14       0.97      0.90      0.93       239
     15       0.96      0.70      0.81       320
     16       0.98      0.84      0.90       294
     17       0.99      0.92      0.95       248
     18       0.74      0.97      0.84       145
     19       0.29      0.96      0.45        48

avg / total 0.90 0.88 0.89 4712
'''

重要參考鏈接:
https://www.cnblogs.com/Lin-Yi/p/8974108.html
https://blog.csdn.net/weixin_43026262/article/details/95045331
https://blog.csdn.net/weixin_38278334/article/details/82320307

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末揪胃,一起剝皮案震驚了整個濱河市璃哟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喊递,老刑警劉巖随闪,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骚勘,居然都是意外死亡蕴掏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門调鲸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挽荡,你說我怎么就攤上這事藐石。” “怎么了定拟?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵于微,是天一觀的道長。 經(jīng)常有香客問我青自,道長株依,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任延窜,我火速辦了婚禮恋腕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逆瑞。我一直安慰自己荠藤,他們只是感情好伙单,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哈肖,像睡著了一般吻育。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淤井,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天布疼,我揣著相機與錄音,去河邊找鬼币狠。 笑死游两,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的总寻。 我是一名探鬼主播器罐,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼渐行!你這毒婦竟也來了轰坊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤祟印,失蹤者是張志新(化名)和其女友劉穎肴沫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕴忆,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡颤芬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了套鹅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片站蝠。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖卓鹿,靈堂內(nèi)的尸體忽然破棺而出菱魔,到底是詐尸還是另有隱情,我是刑警寧澤吟孙,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布澜倦,位于F島的核電站,受9級特大地震影響杰妓,放射性物質(zhì)發(fā)生泄漏藻治。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一巷挥、第九天 我趴在偏房一處隱蔽的房頂上張望桩卵。 院中可真熱鬧,春花似錦、人聲如沸吸占。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矾屯。三九已至兼蕊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間件蚕,已是汗流浹背孙技。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留排作,地道東北人牵啦。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像妄痪,于是被迫代替她去往敵國和親哈雏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361