天天看點

python自然語言處理_Python 自然語言處理:輕松上手文本分類

喜歡程式設計,熱愛分享,希望能結交更多志同道合的朋友,一起在學習Python的道路上走得更遠!

背景介紹

文本分類是NLP中的常見的重要任務之一,它的主要功能就是将輸入的文本以及文本的類别訓練出一個模型,使之具有一定的泛化能力,能夠對新文本進行較好地預測。它的應用很廣泛,在很多領域發揮着重要作用,例如垃圾郵件過濾、輿情分析以及新聞分類等。

現階段的文本分類模型頻出,既有機器學習中的樸素貝葉斯模型、SVM等,也有深度學習中的各種模型,比如經典的CNN, RNN,以及它們的變形,如CNN-LSTM,還有各種高大上的Attention模型。

本文以kashgari-tf為例,它能夠支援各種文本分類模型,比如BiLSTM,CNN_LSTM,AVCNN等,且對預訓練模型,比如BERT的支援較好,它能讓我們輕松地完成文本分類任務。

python自然語言處理_Python 自然語言處理:輕松上手文本分類

項目

首先,我們需要找一份資料作為例子。我們選擇THUCNews,THUCNews是根據新浪新聞RSS訂閱頻道2005~2011年間的曆史資料篩選過濾生成,包含74萬篇新聞文檔(2.19 GB),均為UTF-8純文字格式。我們在原始新浪新聞分類體系的基礎上,從中選擇10個候選分類類别:體育、娛樂、家居、房産、教育、時尚、時政、遊戲、科技、财經。

資料總量一共為6.5萬條,其中訓練集資料5萬條,每個類别5000條,驗證集資料0.5萬條,每個類别500條,測試集資料1萬條,每個類别1000條。筆者已将資料放在Github上,讀者可以在最後的總結中找到。

項目結構,如下圖:

文本分類項目結構

接着,我們嘗試着利用kashgari-tf來訓練一個文本分類模型,其中模型我們采用CNN-LSTM,完整的Python代碼(text_classification_model_train.py)如下:

# -*- coding: utf-8 -*-# time: 2019-08-13 11:16# place: Pudong Shanghaifrom kashgari.tasks.classification import CNN_LSTM_Model# 擷取資料集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# 擷取資料train_x, train_y = load_data('train')valid_x, valid_y = load_data('val')test_x, test_y = load_data('test')# 訓練模型model = CNN_LSTM_Model()model.fit(train_x, train_y, valid_x, valid_y, batch_size=16, epochs=5)# 評估模型model.evaluate(test_x, test_y)# 儲存模型model.save('text_classification_model')
           

輸出的模型結果如下:

_________________________________________________________________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,442Trainable params: 617,442Non-trainable params: 0
           

設定模型訓練次數為5個epoch,batch_size為16。模型訓練完後,在訓練集、驗證集上的結果如下:

資料集accuracyloss訓練集0.96610.1184驗證集0.92040.2567

在測試集上的結果如下:

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 房産 0.9490 0.9680 0.9584 1000 教育 0.9650 0.8820 0.9216 1000 時尚 0.9418 0.9710 0.9562 1000 時政 0.9732 0.9450 0.9589 1000 遊戲 0.9454 0.9700 0.9576 1000 科技 0.8910 0.9560 0.9223 1000 财經 0.9566 0.9920 0.9740 1000 accuracy 0.9533 10000 macro avg 0.9539 0.9533 0.9531 10000weighted avg 0.9539 0.9533 0.9531 10000
           

總的來說,上述模型訓練的效果還是很不錯的。接下來,是考驗模型的預測能力的時刻了,看看它是否具體文本分類的泛化能力。

測試

我們已經有了訓練好的模型text_classification_model,接着讓我們利用該模型來對新的資料進行預測,預測的代碼(model_predict.py)如下:

# -*- coding: utf-8 -*-# time: 2019-08-14 00:21# place: Pudong Shanghaiimport kashgari# 加載模型loaded_model = kashgari.utils.load_model('text_classification_model')text = '華夏幸福成立于 1998 年,前身為廊坊市華夏房地産開發有限公司,初始注冊資本 200 萬元,其中王文學出資 160 萬元,廊坊市融通物資貿易有限公司出資 40 萬元,後經多次股權轉讓和增資,公司于 2007 年整體改制為股份制公司,2011 年完成借殼上市。'x = [[_ for _ in text]]label = loaded_model.predict(x)print('預測分類:%s' % label)
           

以下是測試結果:

原文1: 華夏幸福成立于 1998 年,前身為廊坊市華夏房地産開發有限公司,初始注冊資本 200 萬元,其中王文學出資 160 萬元,廊坊市融通物資貿易有限公司出資 40 萬元,後經多次股權轉讓和增資,公司于 2007 年整體改制為股份制公司,2011 年完成借殼上市。分類結果:預測分類:['财經']原文2: 現今常見的短袖襯衫大緻上可以分為:夏威夷襯衫、古巴襯衫、保齡球衫,三者之間雖有些微分别,但其實有些時候,一件襯衫也可能包含了多種款式的特色。而‘古巴(領)襯衫’最顯而易見的特點在于‘領口’,通常會設計為V領,且呈現微微的外翻,也是以缺少襯衫領口常見的‘第一顆鈕扣’,衣服到領子的剪裁為一體成形,整體較寬松舒适。分類結果:預測分類:['時尚']原文3:周琦2014年加盟新疆廣彙籃球俱樂部,當年就代表俱樂部青年隊接連拿下全國籃球青年聯賽冠軍和全國俱樂部青年聯賽冠軍。升入一隊後,周琦2016年随隊出戰第25屆亞冠杯,獲得冠軍。2016-2017賽季,周琦為新疆廣彙隊奪得隊史首座總冠軍獎杯立下汗馬功勞,他在總決賽中帶傷出戰,更是傳為佳話。分類結果:預測分類:['體育']原文4: 周傑倫[微網誌]監制賽車電影《叱咤風雲》13日釋出花絮導演篇,不僅真實賽車競速畫面大量曝光,幾十輛百萬賽車在國際專業賽道、山路飙速,場面浩大震撼,更揭開不少現場拍攝的幕後畫面。監制周傑倫在現場與導演讨論劇本、範逸臣[微網誌]與高英軒大打出手、甚至有眼尖網友發現在花絮中閃過“男神”李玉玺[微網誌]的畫面。分類結果:預測分類:['娛樂']原文5: 中原標準時間8月13日上午消息,據《南韓先驅報》網站報道,近日美國知識産權所有者協會( Intellectual Property Owners Association)釋出的一份報告顯示,在獲得的美國專利數量方面,IBM、微軟和通用電氣等美國企業名列前茅,排在後面的南韓科技巨頭三星、LG與之競争激烈。分類結果:預測分類:['科技']

總結

雖然我們上述測試的文本分類效果還不錯,但也存在着一些分類錯誤的情況。

本文講述了如何利用kashgari-tf子產品來快速地搭建文本分類任務,其實,也沒那麼難!