NLP(十六)輕松上手文本分類

背景介紹

??文本分類是NLP中的常見的重要任務(wù)之一项棠,它的主要功能就是將輸入的文本以及文本的類別訓(xùn)練出一個(gè)模型,使之具有一定的泛化能力,能夠?qū)π挛谋具M(jìn)行較好地預(yù)測(cè)般妙。它的應(yīng)用很廣泛,在很多領(lǐng)域發(fā)揮著重要作用歪架,例如垃圾郵件過濾股冗、輿情分析以及新聞分類等。
??現(xiàn)階段的文本分類模型頻出和蚪,種類繁多止状,花樣百變,既有機(jī)器學(xué)習(xí)中的樸素貝葉斯模型攒霹、SVM等怯疤,也有深度學(xué)習(xí)中的各種模型,比如經(jīng)典的CNN, RNN催束,以及它們的變形集峦,如CNN-LSTM,還有各種高大上的Attention模型。
??無疑塔淤,文本分類是一個(gè)相對(duì)比較成熟的任務(wù)摘昌,我們盡可以選擇自己喜歡的模型來完成該任務(wù)。本文以kashgari-tf為例高蜂,它能夠支持各種文本分類模型聪黎,比如BiLSTM,CNN_LSTM备恤,AVCNN等稿饰,且對(duì)預(yù)訓(xùn)練模型,比如BERT的支持較好露泊,它能讓我們輕松地完成文本分類任務(wù)喉镰。
??下面,讓我們一起走進(jìn)文本分類的世界惭笑,分分鐘搞定text classification侣姆!

項(xiàng)目

??首先,我們需要找一份數(shù)據(jù)作為例子脖咐。我們選擇THUCNews铺敌,THUCNews是根據(jù)新浪新聞RSS訂閱頻道2005~2011年間的歷史數(shù)據(jù)篩選過濾生成,包含74萬篇新聞文檔(2.19 GB)屁擅,均為UTF-8純文本格式偿凭。我們?cè)谠夹吕诵侣劮诸愺w系的基礎(chǔ)上,從中選擇10個(gè)候選分類類別:體育派歌、娛樂弯囊、家居、房產(chǎn)胶果、教育匾嘱、時(shí)尚、時(shí)政早抠、游戲霎烙、科技、財(cái)經(jīng)蕊连。
??數(shù)據(jù)總量一共為6.5萬條悬垃,其中訓(xùn)練集數(shù)據(jù)5萬條,每個(gè)類別5000條甘苍,驗(yàn)證集數(shù)據(jù)0.5萬條尝蠕,每個(gè)類別500條,測(cè)試集數(shù)據(jù)1萬條载庭,每個(gè)類別1000條看彼。筆者已將數(shù)據(jù)放在Github上廊佩,讀者可以在最后的總結(jié)中找到。
??項(xiàng)目結(jié)構(gòu)靖榕,如下圖:

文本分類項(xiàng)目結(jié)構(gòu)

??接著标锄,我們嘗試著利用kashgari-tf來訓(xùn)練一個(gè)文本分類模型,其中模型我們采用CNN-LSTM序矩,完整的Python代碼(text_classification_model_train.py)如下:

# -*- coding: utf-8 -*-
# time: 2019-08-13 11:16
# place: Pudong Shanghai

from kashgari.tasks.classification import CNN_LSTM_Model

# 獲取數(shù)據(jù)集
def load_data(data_type):
    with open('./data/cnews.%s.txt' % data_type, 'r', encoding='utf-8') as f:
        content = [_.strip() for _ in f.readlines() if _.strip()]

    x, y = [], []
    for line in content:
        label, text = line.split(maxsplit=1)
        y.append(label)
        x.append([_ for _ in text])

    return x, y

# 獲取數(shù)據(jù)
train_x, train_y = load_data('train')
valid_x, valid_y = load_data('val')
test_x, test_y = load_data('test')

# 訓(xùn)練模型
model = CNN_LSTM_Model()
model.fit(train_x, train_y, valid_x, valid_y, batch_size=16, epochs=5)

# 評(píng)估模型
model.evaluate(test_x, test_y)

# 保存模型
model.save('text_classification_model')

輸出的模型結(jié)果如下:

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input (InputLayer)           (None, 2544)              0
_________________________________________________________________
layer_embedding (Embedding)  (None, 2544, 100)         553200
_________________________________________________________________
conv1d (Conv1D)              (None, 2544, 32)          9632
_________________________________________________________________
max_pooling1d (MaxPooling1D) (None, 1272, 32)          0
_________________________________________________________________
cu_dnnlstm (CuDNNLSTM)       (None, 100)               53600
_________________________________________________________________
dense (Dense)                (None, 10)                1010
=================================================================
Total params: 617,442
Trainable params: 617,442
Non-trainable params: 0

??設(shè)定模型訓(xùn)練次數(shù)為5個(gè)epoch鸯绿,batch_size為16跋破。模型訓(xùn)練完后簸淀,在訓(xùn)練集、驗(yàn)證集上的結(jié)果如下:

數(shù)據(jù)集 accuracy loss
訓(xùn)練集 0.9661 0.1184
驗(yàn)證集 0.9204 0.2567

在測(cè)試集上的結(jié)果如下:

             precision    recall  f1-score   support

          體育     0.9852    0.9970    0.9911      1000
          娛樂     0.9938    0.9690    0.9813      1000
          家居     0.9384    0.8830    0.9098      1000
          房產(chǎn)     0.9490    0.9680    0.9584      1000
          教育     0.9650    0.8820    0.9216      1000
          時(shí)尚     0.9418    0.9710    0.9562      1000
          時(shí)政     0.9732    0.9450    0.9589      1000
          游戲     0.9454    0.9700    0.9576      1000
          科技     0.8910    0.9560    0.9223      1000
          財(cái)經(jīng)     0.9566    0.9920    0.9740      1000

    accuracy                         0.9533     10000
   macro avg     0.9539    0.9533    0.9531     10000
weighted avg     0.9539    0.9533    0.9531     10000

??總的來說毒返,上述模型訓(xùn)練的效果還是很不錯(cuò)的租幕。接下來,是考驗(yàn)?zāi)P偷念A(yù)測(cè)能力的時(shí)刻了拧簸,看看它是否具體文本分類的泛化能力劲绪。

測(cè)試

??我們已經(jīng)有了訓(xùn)練好的模型text_classification_model,接著讓我們利用該模型來對(duì)新的數(shù)據(jù)進(jìn)行預(yù)測(cè)盆赤,預(yù)測(cè)的代碼(model_predict.py)如下:

# -*- coding: utf-8 -*-
# time: 2019-08-14 00:21
# place: Pudong Shanghai

import kashgari

# 加載模型
loaded_model = kashgari.utils.load_model('text_classification_model')

text = '華夏幸福成立于 1998 年贾富,前身為廊坊市華夏房地產(chǎn)開發(fā)有限公司,初始注冊(cè)資本 200 萬元牺六,其中王文學(xué)出資 160 萬元颤枪,廊坊市融通物資貿(mào)易有限公司出資 40 萬元,后經(jīng)多次股權(quán)轉(zhuǎn)讓和增資淑际,公司于 2007 年整體改制為股份制公司畏纲,2011 年完成借殼上市。'

x = [[_ for _ in text]]

label = loaded_model.predict(x)
print('預(yù)測(cè)分類:%s' % label)

以下是測(cè)試結(jié)果:

原文1: 華夏幸福成立于 1998 年春缕,前身為廊坊市華夏房地產(chǎn)開發(fā)有限公司盗胀,初始注冊(cè)資本 200 萬元,其中王文學(xué)出資 160 萬元锄贼,廊坊市融通物資貿(mào)易有限公司出資 40 萬元票灰,后經(jīng)多次股權(quán)轉(zhuǎn)讓和增資,公司于 2007 年整體改制為股份制公司宅荤,2011 年完成借殼上市屑迂。
分類結(jié)果:預(yù)測(cè)分類:['財(cái)經(jīng)']

原文2: 現(xiàn)今常見的短袖襯衫大致上可以分為:夏威夷襯衫、古巴襯衫膘侮、保齡球衫屈糊,三者之間雖有些微分別,但其實(shí)有些時(shí)候琼了,一件襯衫也可能包含了多種款式的特色逻锐。而‘古巴(領(lǐng))襯衫’最顯而易見的特點(diǎn)在于‘領(lǐng)口’夫晌,通常會(huì)設(shè)計(jì)為V領(lǐng),且呈現(xiàn)微微的外翻昧诱,也因此缺少襯衫領(lǐng)口常見的‘第一顆鈕扣’晓淀,衣服到領(lǐng)子的剪裁為一體成形,整體較寬松舒適盏档。
分類結(jié)果:預(yù)測(cè)分類:['時(shí)尚']

原文3:周琦2014年加盟新疆廣匯籃球俱樂部凶掰,當(dāng)年就代表俱樂部青年隊(duì)接連拿下全國(guó)籃球青年聯(lián)賽冠軍和全國(guó)俱樂部青年聯(lián)賽冠軍。升入一隊(duì)后蜈亩,周琦2016年隨隊(duì)出戰(zhàn)第25屆亞冠杯懦窘,獲得冠軍。2016-2017賽季稚配,周琦為新疆廣匯隊(duì)奪得隊(duì)史首座總冠軍獎(jiǎng)杯立下汗馬功勞畅涂,他在總決賽中帶傷出戰(zhàn),更是傳為佳話道川。
分類結(jié)果:預(yù)測(cè)分類:['體育']

原文4: 周杰倫[微博]監(jiān)制賽車電影《叱咤風(fēng)云》13日釋出花絮導(dǎo)演篇午衰,不僅真實(shí)賽車競(jìng)速畫面大量曝光,幾十輛百萬賽車在國(guó)際專業(yè)賽道冒萄、山路飆速臊岸,場(chǎng)面浩大震撼,更揭開不少
現(xiàn)場(chǎng)拍攝的幕后畫面尊流。監(jiān)制周杰倫在現(xiàn)場(chǎng)與導(dǎo)演討論劇本帅戒、范逸臣[微博]與高英軒大打出手、甚至有眼尖網(wǎng)友發(fā)現(xiàn)在花絮中閃過“男神”李玉璽[微博]的畫面奠旺。
分類結(jié)果:預(yù)測(cè)分類:['娛樂']

原文5: 北京時(shí)間8月13日上午消息蜘澜,據(jù)《韓國(guó)先驅(qū)報(bào)》網(wǎng)站報(bào)道,近日美國(guó)知識(shí)產(chǎn)權(quán)所有者協(xié)會(huì)( Intellectual Property Owners Association)發(fā)布的一份報(bào)告顯示响疚,在獲得的
美國(guó)專利數(shù)量方面鄙信,IBM、微軟和通用電氣等美國(guó)企業(yè)名列前茅忿晕,排在后面的韓國(guó)科技巨頭三星装诡、LG與之競(jìng)爭(zhēng)激烈。
分類結(jié)果:預(yù)測(cè)分類:['科技']

總結(jié)

??雖然我們上述測(cè)試的文本分類效果還不錯(cuò)践盼,但也存在著一些分類錯(cuò)誤的情況鸦采。
??本文講述了如何利用kashgari-tf模塊來快速地搭建文本分類任務(wù),其實(shí)咕幻,也沒那么難渔伯!
??本文代碼和數(shù)據(jù)及已上傳至Github, 網(wǎng)址為:
https://github.com/percent4/cnews_text_classification

注意:不妨了解下筆者的微信公眾號(hào): Python爬蟲與算法(微信號(hào)為:easy_web_scrape), 歡迎大家關(guān)注~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肄程,一起剝皮案震驚了整個(gè)濱河市锣吼,隨后出現(xiàn)的幾起案子选浑,更是在濱河造成了極大的恐慌,老刑警劉巖玄叠,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件古徒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡读恃,警方通過查閱死者的電腦和手機(jī)隧膘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寺惫,“玉大人疹吃,你說我怎么就攤上這事〖◎撸” “怎么了互墓?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蒋搜。 經(jīng)常有香客問我,道長(zhǎng)判莉,這世上最難降的妖魔是什么豆挽? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮券盅,結(jié)果婚禮上帮哈,老公的妹妹穿的比我還像新娘。我一直安慰自己锰镀,他們只是感情好娘侍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泳炉,像睡著了一般憾筏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上花鹅,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天氧腰,我揣著相機(jī)與錄音,去河邊找鬼刨肃。 笑死古拴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的真友。 我是一名探鬼主播黄痪,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼盔然!你這毒婦竟也來了桅打?” 一聲冷哼從身側(cè)響起焕参,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎油额,沒想到半個(gè)月后叠纷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潦嘶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年涩嚣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掂僵。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡航厚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锰蓬,到底是詐尸還是另有隱情幔睬,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布芹扭,位于F島的核電站麻顶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舱卡。R本人自食惡果不足惜辅肾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轮锥。 院中可真熱鬧矫钓,春花似錦、人聲如沸舍杜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)既绩。三九已至概龄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間熬词,已是汗流浹背旁钧。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留互拾,地道東北人歪今。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像颜矿,于是被迫代替她去往敵國(guó)和親寄猩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容