NLP(三十)利用ALBERT和機器學習來做文本分類

  本文的靈感來自於A Visual Guide to Using BERT for the First Time,其作者爲Jay Alammar,訪問網址爲:http://jalammar.github.io/a-visual-guide-to-using-bert-for-the-first-time
  在文本分類中,有兩個大的思路,一個是機器學習,主要是利用n-gram等特徵將文本轉化爲特徵向量,這種方法便於操作和理解,但是忽略了文本本身的語義信息;另一個是深度學習,主要是利用word2vec作爲特徵提取,加之CNN或RNN等深度學習模型來進行分類,尤其是BERT等預訓練模型出來了,在小樣本上做fine tune即可取得不錯的效果,能在很大程度上提取出文本的語義信息,但這種方法不便於操作和理解。
  一個簡單的想法便是,我們可以利用預訓練模型對文本做特徵提取,然後在調用機器學習中的分類模型來進行分類,這樣做思路是清晰的,操作較爲複雜,便於理解,同時又不會丟失訓練模型中的語義信息。
  本文以ALBERT作爲文本的特徵提取,用機器學習中的邏輯迴歸(LR)、樸素貝葉斯(NB)、支持向量機(SVM)等模型來進行文本。注意,本文僅作爲文本分類方面的嘗試,具體在實際的文本分類任務中還需要具體分析。
  本文的數據來源可以參考文章:NLP(二十二)利用ALBERT實現文本二分類, 一共是300條訓練數據和80條測試數據,用於區分文本是否是屬於政治上的出訪類事件。
  在這裏我們使用ALBERT已經訓練好的文件albert_tiny,借鑑BERT的調用方法,我們在這裏給出albert_zh模塊,能夠讓ALBERT提取文本的特徵,具體代碼不在這裏給出,有興趣的讀者可以訪問該項目的Github地址:https://github.com/percent4/ALBERT_text_classification
  注意,本文中並沒有給出文本預處理的代碼,有興趣的讀者可以參考該項目的Github地址。在特徵提取過程中,Albert_tiny模型給出的向量維度爲312,我們的模型訓練代碼(ml_model_train.py)如下:

# -*- coding: utf-8 -*-
# author: Jclian91
# place: Pudong Shanghai
# time: 2020/5/15 3:44 下午

import numpy as np
from sklearn.linear_model import LogisticRegression as LR
from sklearn.metrics import confusion_matrix, accuracy_score, classification_report
from sklearn.externals import joblib
from sklearn.svm import SVC
from sklearn.naive_bayes import GaussianNB

from load_data import train_df, test_df
from albert_zh.extract_feature import BertVector

# 讀取文件並進行轉換
bert_model = BertVector(pooling_strategy="REDUCE_MEAN", max_seq_len=200)
print('begin encoding')
f = lambda text: bert_model.encode([text])["encodes"][0]
train_df['x'] = train_df['text'].apply(f)
test_df['x'] = test_df['text'].apply(f)
print('end encoding')

x_train = np.array([vec for vec in train_df['x']])
x_test = np.array([vec for vec in test_df['x']])
y_train = np.array([vec for vec in train_df['label']])
y_test = np.array([vec for vec in test_df['label']])
print('x_train: ', x_train.shape)

# Logistic Regression
lr = LR(random_state=123)
lr.fit(x_train, y_train)

y_pred = lr.predict(x_test)
print("Logistic Regression Model")
print("混淆矩陣", confusion_matrix(y_true=y_test, y_pred=y_pred))
print("正確率:", accuracy_score(y_test, y_pred))
print(classification_report(y_true=y_test, y_pred=y_pred, digits=4))

# 保存模型
joblib.dump(lr, "lr.model")

# Naive Bayes Model
gnb = GaussianNB()
gnb.fit(x_train, y_train)
y_pred = gnb.predict(x_test)
print("\nNaive Bayes Model")
print("混淆矩陣", confusion_matrix(y_true=y_test, y_pred=y_pred))
print("正確率:", accuracy_score(y_test, y_pred))
print(classification_report(y_true=y_test, y_pred=y_pred, digits=4))

# SVM model
svc = SVC(kernel="rbf")
svc.fit(x_train, y_train)
y_pred = svc.predict(x_test)
print("\nSVM Model")
print("混淆矩陣", confusion_matrix(y_true=y_test, y_pred=y_pred))
print("正確率:", accuracy_score(y_test, y_pred))
print(classification_report(y_true=y_test, y_pred=y_pred, digits=4))

joblib.dump(svc, "svc.model")

讓我們來簡單的理一下思路,我們的訓練集合測試集數據集爲train_dftest_df,包含文本內容和標籤等,然後用ALBERT提取文本特徵,再嘗試用邏輯迴歸、樸素貝葉斯、支持向量機等機器學習模型來進行分類。分類後的輸出結果如下:

Logistic Regression Model
混淆矩陣 [[33  5]
 [ 2 40]]
正確率: 0.9125
              precision    recall  f1-score   support

           0     0.9429    0.8684    0.9041        38
           1     0.8889    0.9524    0.9195        42

   micro avg     0.9125    0.9125    0.9125        80
   macro avg     0.9159    0.9104    0.9118        80
weighted avg     0.9145    0.9125    0.9122        80


Naive Bayes Model
混淆矩陣 [[37  1]
 [ 1 41]]
正確率: 0.975
              precision    recall  f1-score   support

           0     0.9737    0.9737    0.9737        38
           1     0.9762    0.9762    0.9762        42

   micro avg     0.9750    0.9750    0.9750        80
   macro avg     0.9749    0.9749    0.9749        80
weighted avg     0.9750    0.9750    0.9750        80

SVM Model
混淆矩陣 [[35  3]
 [ 1 41]]
正確率: 0.95
              precision    recall  f1-score   support

           0     0.9722    0.9211    0.9459        38
           1     0.9318    0.9762    0.9535        42

   micro avg     0.9500    0.9500    0.9500        80
   macro avg     0.9520    0.9486    0.9497        80
weighted avg     0.9510    0.9500    0.9499        80

可以看到,上述三種模型在這個文本分類的任務上都取得了不錯的效果,比在之前的文章 NLP(二十二)利用ALBERT實現文本二分類 中的ALBERT作爲特徵提取,DNN作爲分類模型的效果要更好些。
  最後,讓我們用保存的支持向量機模型對新文本進行預測,代碼如下:

# -*- coding: utf-8 -*-
# author: Jclian91
# place: Pudong Shanghai
# time: 2020/5/15 4:23 下午

import numpy as np
from sklearn.externals import joblib
from albert_zh.extract_feature import BertVector

# 讀取文件並進行轉換
bert_model = BertVector(pooling_strategy="REDUCE_MEAN", max_seq_len=200)
f = lambda text: bert_model.encode([text])["encodes"][0]

# predict
# 預測語句
texts = ['在訪問限制中,用戶可以選擇禁用iPhone的功能,包括Siri、iTunes購買功能、安裝/刪除應用等,甚至還可以讓iPhone變成一臺功能手機。以下是訪問限制具體可以實現的一些功能',
         'IT之家4月23日消息 近日,谷歌在其官方論壇發佈消息表示,他們爲Android Auto添加了一項新功能:可以訪問完整聯繫人列表。用戶現在可以通過在Auto的電話撥號界面中打開左上角的菜單訪問完整的聯繫人列表。值得注意的是,這一功能僅支持在車輛停止時使用。',
         '要通過telnet 訪問路由器,需要先通過console 口對路由器進行基本配置,例如:IP地址、密碼等。',
         'IT之家3月26日消息 近日反盜版的國際諮詢公司MUSO發佈了2017年的年度報告,其中的數據顯示,去年盜版資源網站訪問量達到了3000億次,比前一年(2016年)提高了1.6%。美國是訪問盜版站點次數最多的國家,共有279億次訪問;其後分別是俄羅斯、印度和巴西,中國位列第18。',
         '應葡萄牙議會邀請,全國人大常委會副委員長吉炳軒率團於12月14日至16日訪問葡萄牙,會見副議長費利佩、社會黨副總書記卡內羅。',
         '2月26日至3月2日,應香港特區政府“內地貴賓訪港計劃”邀請,省委常委、常務副省長陳向羣赴港考察訪問,重點圍繞“香港所長、湖南所需”,與特區政府相關部門和機構深入交流,推動湖南與香港交流合作取得新進展。',
         '目前A站已經恢復了訪問,可以直接登錄,網頁加載正常,視頻已經可以正常播放。',
         '難民署特使安吉麗娜·朱莉6月8日結束了對哥倫比亞和委內瑞拉邊境地區的難民營地爲期兩天的訪問,她對哥倫比亞人民展現的人道主義和勇氣表示讚揚。',
         '據《南德意志報》報道,德國總理默克爾計劃明年1月就前往安卡拉,和土耳其總統埃爾多安進行會談。',
         '自9月14日至18日,由越共中央政治局委員、中央書記處書記、中央經濟部部長阮文平率領工作代表團對希臘進行工作訪問。',
         'Win7電腦提示無線適配器或訪問點有問題怎麼辦?很多用戶在使用無線網連接上網時,發現無線網顯示已連接,但旁邊卻出現了一個黃色感嘆號,無法進行網絡操作,通過診斷提示電腦無線適配器或訪問點有問題,且處於未修復狀態,這該怎麼辦呢?下面小編就和大家分享下Win7電腦提示無線適配器或訪問點有問題的解決方法。',
         '2019年10月13日至14日,外交部副部長馬朝旭訪問智利,會見智利外長裏韋拉,同智利總統外事顧問薩拉斯舉行會談,就智利舉辦亞太經合組織(APEC)第二十七次領導人非正式會議等深入交換意見。',
         '未開發所有安全組之前訪問,FTP可以鏈接上,但是打開會很慢,需要1-2分鐘才能鏈接上',
         'win7系統電腦的用戶,在連接WIFI網絡網上時,有時候會遇到突然上不了網,查看連接的WIFI出現“有限的訪問權限”的文字提示。',
         '聯合國祕書長潘基文8日訪問了日本福島縣,與當地災民交流並訪問了一所高中。',
         '國務院總理溫家寶當地時間23日下午乘專機抵達布宜諾斯艾利斯,開始對阿根廷進行正式訪問。',
         '正在中國訪問的巴巴多斯總理斯圖爾特15日在陝西西安參觀訪問。',
         '據外媒報道,當地時間10日,美國白宮發聲明稱,美國總統特朗普將於2月底訪問印度,與印度總理莫迪進行戰略對話。',
         '2月28日,唐山曹妃甸藍色海洋科技有限公司董事長趙力軍等一行5人到黃海水產研究所交流訪問。黃海水產研究所副所長辛福言及相關部門負責人、專家等參加了會議。',
         '2018年7月2日,莫斯科孔子文化促進會會長姜彥彬,常務副會長陳國建,在中國著名留俄油畫大師牟克教授的陪同下,訪問了莫斯科國立蘇里科夫美術學院,受到第一副校長伊戈爾·戈爾巴秋克先生接待。'
         '據外媒報道,當地時間26日晚,阿爾及利亞總統特本抵達沙特阿拉伯,進行爲期三天的訪問。兩國領導人預計將就國家間合作和地區發展進行磋商。',
         '與標準Mozy一樣,Stash文件夾爲用戶提供了對其備份文件的基於雲的訪問,但是它們還使他們可以隨時,跨多個設備(包括所有計算機,智能手機和平板電腦)訪問它們。換句話說,使用瀏覽器的任何人都可以同時查看文件(如果需要)。操作系統和設備品牌無關。',
         '研究表明,每個網頁的平均預期壽命爲44至100天。當用戶通過瀏覽器訪問已消失的網頁時,就會看到「Page Not Found」的錯誤信息。對於這種情況,相信大多數人也只能不了了之。不過有責任心的組織——互聯網檔案館爲了提供更可靠的Web服務,它聯手Brave瀏覽器專門針對此類網頁提供了一鍵加載存檔頁面的功能。',
         '據外媒報道,土耳其總統府於當地時間2日表示,土耳其總統埃爾多安計劃於5日對俄羅斯進行爲期一天的訪問。',
         '3日,根據三星電子的消息,李在鎔副會長這天訪問了位於韓國慶尚北道龜尾市的三星電子工廠。',
         "通過你本機ip 和 2375端口訪問測試是否成功。",
         "方濟各弗朗西斯教皇訪問泰國,在泰國曼谷朱拉隆功大學舉行會議,並與泰國佛教宗教領袖談話。"]

for text in texts:
    vec = np.array([f(text)])
    svc = joblib.load("svc.model")
    y_predict = svc.predict(vec)
    print("句子: %s \n 預測類別: %s" % (text, y_predict))

輸出結果如下:

句子: 在訪問限制中,用戶可以選擇禁用iPhone的功能,包括Siri、iTunes購買功能、安裝/刪除應用等,甚至還可以讓iPhone變成一臺功能手機。以下是訪問限制具體可以實現的一些功能 
 預測類別: ['0']
句子: IT之家4月23日消息 近日,谷歌在其官方論壇發佈消息表示,他們爲Android Auto添加了一項新功能:可以訪問完整聯繫人列表。用戶現在可以通過在Auto的電話撥號界面中打開左上角的菜單訪問完整的聯繫人列表。值得注意的是,這一功能僅支持在車輛停止時使用。 
 預測類別: ['0']
句子: 要通過telnet 訪問路由器,需要先通過console 口對路由器進行基本配置,例如:IP地址、密碼等。 
 預測類別: ['0']
句子: IT之家3月26日消息 近日反盜版的國際諮詢公司MUSO發佈了2017年的年度報告,其中的數據顯示,去年盜版資源網站訪問量達到了3000億次,比前一年(2016年)提高了1.6%。美國是訪問盜版站點次數最多的國家,共有279億次訪問;其後分別是俄羅斯、印度和巴西,中國位列第18。 
 預測類別: ['0']
句子: 應葡萄牙議會邀請,全國人大常委會副委員長吉炳軒率團於12月14日至16日訪問葡萄牙,會見副議長費利佩、社會黨副總書記卡內羅。 
 預測類別: ['1']
句子: 2月26日至3月2日,應香港特區政府“內地貴賓訪港計劃”邀請,省委常委、常務副省長陳向羣赴港考察訪問,重點圍繞“香港所長、湖南所需”,與特區政府相關部門和機構深入交流,推動湖南與香港交流合作取得新進展。 
 預測類別: ['1']
句子: 目前A站已經恢復了訪問,可以直接登錄,網頁加載正常,視頻已經可以正常播放。 
 預測類別: ['0']
句子: 難民署特使安吉麗娜·朱莉6月8日結束了對哥倫比亞和委內瑞拉邊境地區的難民營地爲期兩天的訪問,她對哥倫比亞人民展現的人道主義和勇氣表示讚揚。 
 預測類別: ['1']
句子: 據《南德意志報》報道,德國總理默克爾計劃明年1月就前往安卡拉,和土耳其總統埃爾多安進行會談。 
 預測類別: ['1']
句子: 自9月14日至18日,由越共中央政治局委員、中央書記處書記、中央經濟部部長阮文平率領工作代表團對希臘進行工作訪問。 
 預測類別: ['1']
句子: Win7電腦提示無線適配器或訪問點有問題怎麼辦?很多用戶在使用無線網連接上網時,發現無線網顯示已連接,但旁邊卻出現了一個黃色感嘆號,無法進行網絡操作,通過診斷提示電腦無線適配器或訪問點有問題,且處於未修復狀態,這該怎麼辦呢?下面小編就和大家分享下Win7電腦提示無線適配器或訪問點有問題的解決方法。 
 預測類別: ['0']
句子: 2019年10月13日至14日,外交部副部長馬朝旭訪問智利,會見智利外長裏韋拉,同智利總統外事顧問薩拉斯舉行會談,就智利舉辦亞太經合組織(APEC)第二十七次領導人非正式會議等深入交換意見。 
 預測類別: ['1']
句子: 未開發所有安全組之前訪問,FTP可以鏈接上,但是打開會很慢,需要1-2分鐘才能鏈接上 
 預測類別: ['0']
句子: win7系統電腦的用戶,在連接WIFI網絡網上時,有時候會遇到突然上不了網,查看連接的WIFI出現“有限的訪問權限”的文字提示。 
 預測類別: ['0']
句子: 聯合國祕書長潘基文8日訪問了日本福島縣,與當地災民交流並訪問了一所高中。 
 預測類別: ['1']
句子: 國務院總理溫家寶當地時間23日下午乘專機抵達布宜諾斯艾利斯,開始對阿根廷進行正式訪問。 
 預測類別: ['1']
句子: 正在中國訪問的巴巴多斯總理斯圖爾特15日在陝西西安參觀訪問。 
 預測類別: ['1']
句子: 據外媒報道,當地時間10日,美國白宮發聲明稱,美國總統特朗普將於2月底訪問印度,與印度總理莫迪進行戰略對話。 
 預測類別: ['1']
句子: 2月28日,唐山曹妃甸藍色海洋科技有限公司董事長趙力軍等一行5人到黃海水產研究所交流訪問。黃海水產研究所副所長辛福言及相關部門負責人、專家等參加了會議。 
 預測類別: ['1']
句子: 2018年7月2日,莫斯科孔子文化促進會會長姜彥彬,常務副會長陳國建,在中國著名留俄油畫大師牟克教授的陪同下,訪問了莫斯科國立蘇里科夫美術學院,受到第一副校長伊戈爾·戈爾巴秋克先生接待。據外媒報道,當地時間26日晚,阿爾及利亞總統特本抵達沙特阿拉伯,進行爲期三天的訪問。兩國領導人預計將就國家間合作和地區發展進行磋商。 
 預測類別: ['1']
句子: 與標準Mozy一樣,Stash文件夾爲用戶提供了對其備份文件的基於雲的訪問,但是它們還使他們可以隨時,跨多個設備(包括所有計算機,智能手機和平板電腦)訪問它們。換句話說,使用瀏覽器的任何人都可以同時查看文件(如果需要)。操作系統和設備品牌無關。 
 預測類別: ['0']
句子: 研究表明,每個網頁的平均預期壽命爲44至100天。當用戶通過瀏覽器訪問已消失的網頁時,就會看到「Page Not Found」的錯誤信息。對於這種情況,相信大多數人也只能不了了之。不過有責任心的組織——互聯網檔案館爲了提供更可靠的Web服務,它聯手Brave瀏覽器專門針對此類網頁提供了一鍵加載存檔頁面的功能。 
 預測類別: ['0']
句子: 據外媒報道,土耳其總統府於當地時間2日表示,土耳其總統埃爾多安計劃於5日對俄羅斯進行爲期一天的訪問。 
 預測類別: ['1']
句子: 3日,根據三星電子的消息,李在鎔副會長這天訪問了位於韓國慶尚北道龜尾市的三星電子工廠。 
 預測類別: ['1']
句子: 通過你本機ip 和 2375端口訪問測試是否成功。 
 預測類別: ['0']
句子: 方濟各弗朗西斯教皇訪問泰國,在泰國曼谷朱拉隆功大學舉行會議,並與泰國佛教宗教領袖談話。 
 預測類別: ['1']

0表示不是政治意義上的出訪,1代表是。所有的新文本(新文本中都含有訪問這個詞語)都分類正確。
  本文作爲筆者的一次嘗試,因此寫得比較簡單,有興趣的讀者可以移步本項目的Github地址:https://github.com/percent4/ALBERT_text_classification
  感謝大家的閱讀,如有問題,敬請批評指正~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章