失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > NLP自然语言处理—文本分类入门

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

时间:2023-03-28 18:27:02

相关推荐

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

前言

NLP作为机器学习三大热门领域之一,现在的发展也是越来越完备,从神经网络崛起之后,自然语言领域就迎来了春天,特别是当预训练方法横空出世之后,NLP作为最先尝到预训练甜头的先锋,可以说是如虎添翼。虽然我个人做NLP方面的东西比较少(主要是穷,设备有限,跑不动模型),但是在结构化数据挖掘中有时候还是会遇到NLP相关的问题,比如在某些电商问题中,很多数据是文本数据,这些数据还是需要用到NLP的一些处理方法。

以后的发展中会遇到更多关于NLP的问题,所以对于NLP领域一定要有了解,就算达不到精通的程度,但也一定要知道怎么去解决一个NLP问题。本次文章就结合一个相对入门数据集,运用机器学习的方法去解决一个NLP项目最最最基础的流程!

数据集下载地址:/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 CountVectorizerword=['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 pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.metrics import f1_score,accuracy_scorefrom sklearn.metrics import confusion_matriximport 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 pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import f1_score,accuracy_scorefrom sklearn.metrics import confusion_matriximport 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到此可以算一个初步入门,但是这还远远不够,还有很多好的方法还等待我们学习,慢慢加油!

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

如果觉得《NLP自然语言处理—文本分类入门》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。