背景介紹
??文本分類是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)靖榕,如下圖:
??接著标锄,我們嘗試著利用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)注~