NLP自然语言处理—文本分类入门

前言

NLP作为机器学习三大热门领域之一,现在的发展也是越来越完备,从2012年神经网络崛起之后,自然语言领域就迎来了春天,特别是当预训练方法横空出世之后,NLP作为最先尝到预训练甜头的先锋,可以说是如虎添翼。虽然我个人做NLP方面的东西比较少(主要是穷,设备有限,跑不动模型),但是在结构化数据挖掘中有时候还是会遇到NLP相关的问题,比如在某些电商问题中,很多数据是文本数据,这些数据还是需要用到NLP的一些处理方法。
在这里插入图片描述
以后的发展中会遇到更多关于NLP的问题,所以对于NLP领域一定要有了解,就算达不到精通的程度,但也一定要知道怎么去解决一个NLP问题。本次文章就结合一个相对入门数据集,运用机器学习的方法去解决一个NLP项目最最最基础的流程!

数据集下载地址:https://pan.baidu.com/s/1sQO83_dThPOl4M8pdwmNPQ
提取码:DJNB

文本数据预处理

TF-IDF(词袋模型)
TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF是词频(Term Frequency),IDF是逆文本频率指数(Inverse Document Frequency)。词袋模型是NLP领域最常见的文本预处理方法之一,当前我们处理文本数据的时候最常见的两种方法,一种是TF-IDF,另外一种是Word2Vec(词向量模型),Word2Vec后面的项目我可能也会用。本次数据集相对简单,初步采用TF-IDF方法。下面是TF-IDF的计算方法:
在这里插入图片描述
计算方法相对来说还是比较简单易懂的。

举个例子

一段文本数据
word=[‘I love china’,‘I am chinese’,‘I come from china’,‘so I am chinese’]

from sklearn.feature_extraction.text import CountVectorizer
word=['I love china','I am chinese','I come from china so I am chinese','I love chinese and I love china']
word_count= CountVectorizer()
Word = word_count.fit_transform(word)
print(word_count.get_feature_names())
print(Word.toarray())

我们可以看看词频的统计结果:
在这里插入图片描述
然后再搭配TfidfTransformer计算TF-IDF

transformer = TfidfTransformer()
TFIDF= transformer.fit_transform(word_count.fit_transform(word))
print (TFIDF)  

看看最终TF-IDF的计算结果:
在这里插入图片描述
整个流程和计算方法就是上面这样!

TF-IDF模型处理文本代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import f1_score,accuracy_score
from sklearn.metrics import confusion_matrix
import seaborn as sns
#读取训练数据集
train = pd.read_csv('train.csv',sep='\t')
train['text_split'] = train['text'].apply(lambda x: str(x.split()))
#加载TF-IDF模型,这里我们直接采用TfidfVectorizer模型,就不用像前面那样按照两部来走,直接一步完成,一样的效果
TFIDF = TfidfVectorizer(analyzer='word',
            ngram_range=(1,2),
            min_df=3,  
            max_df=0.9, 
            use_idf=True,
            max_features = 3000,
            smooth_idf=True, 
            sublinear_tf=True)
#用词袋模型构建数据            
train_TFIDF = TFIDF.fit_transform(train['text_split'])

数据集划分及模型训练

本来现在最流行的NLP训练模型都是深度学习模型,特别是像Transformer,bert这样强大的预训练模型,还有LSTM,TextCNN等等这些神经网络模型,它们做出来的效果都非常好,但是由于我的电脑计算能力有限,深度学习模型跑起来太费劲了,我尝试用LGB这种速度已经非常快的集成模型都要跑几个小时,所以我在这里还是选择了用传统的机器学习模型进行演示,模型选用LR线性回归模型,做出来效果也还是非常不错。

代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import f1_score,accuracy_score
from sklearn.metrics import confusion_matrix
import seaborn as sns
#接着上面代码写
X_train = train_TFIDF 
y_train = train['label']
#划分训练集和验证集
x_train, x_valid, y_train, y_valid = train_test_split(X_train, y_train, test_size=0.2)
clf = LogisticRegression(C=4, n_jobs=16)
clf.fit(x_train, y_train)
#对验证集进行预测
y_pred = clf.predict(x_valid)
acc=accuracy_score(y_valid,y_pred)
f1=f1_score(y_valid,y_pred, average='macro')
print("LR验证集ACC:"+str(acc)+"   "+"LR验证集F1-score:"+str(f1))
classes=train['label'].unique()
cm = confusion_matrix(y_pred,y_valid,labels=classes)
df=pd.DataFrame(cm,index=classes,columns=classes)
plt.figure(figsize=(20, 20))
sns.heatmap(df,annot=True,cmap="Set3")
plt.show()

我们看看在验证集上面的准确率ACC和F1-score值,预测的准确率可以达到90%以上,证明模型效果还是不错的:

在这里插入图片描述
混淆矩阵可视化:
在这里插入图片描述
我们可以通过混淆矩阵看到我们对于每一个类别的预测情况,可以看到整体的预测效果还是不错的,对于某些类别预测错误我们可以再深入探究,后续可以深度挖掘文本信息。

模型改进

我们上面用到的只是一个最简单的词袋模型加一个线性回归模型,这样都能达到90%以上的准确率还是很可观的,我们还可以尝试对文本进行更加复杂的预处理,或者有条件的朋友可以运用预训练模型或者神经网络模型进行训练,效果肯定比现在好很多,还可以尝试多模型融合,效果也可以大大提升。

写在最后

NLP到此可以算一个初步入门,但是这还远远不够,还有很多好的方法还等待我们学习,慢慢加油!

本人才疏学浅,如果有错误或者理解不到位的地方请指正!

  • 13
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值