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日,根据三星电子的消息,李在镕副会长这天访问了位于韩国庆尚北道龟尾市的三星电子工厂。',
         "为深入贯彻落实习近平新时代中国特色社会主义外交思想和党中央决策部署,全面深化与日韩地方交流合作,扩大对外开放,寻求合作新机遇。12月1日至8日,山东省代表团将赴韩国、日本访问。",
         "通过你本机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']
句子: 为深入贯彻落实习近平新时代中国特色社会主义外交思想和党中央决策部署,全面深化与日韩地方交流合作,扩大对外开放,寻求合作新机遇。12月1日至8日,山东省代表团将赴韩国、日本访问。 
 预测类别: ['1']
句子: 通过你本机ip 和 2375端口访问测试是否成功。 
 预测类别: ['0']
句子: 方济各弗朗西斯教皇访问泰国,在泰国曼谷朱拉隆功大学举行会议,并与泰国佛教宗教领袖谈话。 
 预测类别: ['1']

0表示不是政治意义上的出访,1代表是。所有的新文本(新文本中都含有访问这个词语)都分类正确。
  本文作为笔者的一次尝试,因此写得比较简单,有兴趣的读者可以移步本项目的Github地址:https://github.com/percent4/ALBERT_text_classification 。
  感谢大家的阅读,如有问题,敬请批评指正~

你可能感兴趣的:(NLP(三十)利用ALBERT和机器学习来做文本分类)