前言

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

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

NLP自然语言处理—文本分类入门相关推荐

  1. NLP自然语言处理——文本分类(CNN卷积神经网络)

    文本分类是NLP自然语言处理中一项基本功能,它在新闻分类.主题分类.问答匹配.意图识别.情感分类.推断等领域都有涉及. 学习应用文本分类任务的难点有被识别语言的复杂性和评测函数的设计等,本篇将介绍一个 ...

  2. NLP自然语言处理——文本分类之数据集汇总

    文本分类数据集汇总 名词解释 一."达观杯"文本智能处理挑战赛数据集 二.东方财富网上市公司公告数据集 2.1 获取手段:python网络爬虫.具体方法和代码见我的另一篇博客. 2 ...

  3. 零基础入门NLP - 天池新闻文本分类Task3笔记

    零基础入门NLP - 天池新闻文本分类 以下以Datawhale与天池举办的新闻文本分类这个NLP赛题做的NLP入门Task2笔记 赛题链接:https://tianchi.aliyun.com/co ...

  4. 文本分类入门(一)文本分类问题的定义

    原博客地址:http://www.blogjava.net/zhenandaci/category/31868.html?Show=All 文本分类入门(一)文本分类问题的定义 文本分类系列文章,从文 ...

  5. 文本分类入门(四)训练Part 1

    文本分类入门(四)训练Part 1 训练,顾名思义,就是training(汗,这解释),简单的说就是让计算机从给定的一堆文档中自己学习分类的规则(如果学不对的话,还要,打屁屁?). 开始训练之前,再多 ...

  6. 文本分类入门(三)统计学习方法

    文本分类入门(三)统计学习方法 前文说到使用统计学习方法进行文本分类就是让计算机自己来观察由人提供的训练文档集,自己总结出用于判别文档类别的规则和依据.理想的结果当然是让计算机在理解文章内容的基础上进 ...

  7. 文本分类入门(二)文本分类的方法

    文本分类入门(二)文本分类的方法 文本分类问题与其它分类问题没有本质上的区别,其方法可以归结为根据待分类数据的某些特征来进行匹配,当然完全的匹配是不太可能的,因此必须(根据某种评价标准)选择最优的匹配 ...

  8. 文本分类入门(番外篇)特征选择与特征权重计算的区别

    文本分类入门(番外篇)特征选择与特征权重计算的区别 在文本分类的过程中,特征(也可以简单的理解为"词")从人类能够理解的形式转换为计算机能够理解的形式时,实际上经过了两步骤的量化- ...

  9. 自然语言处理——文本分类概述

    内容提要 分类概述 分类流程 数据采集 爬虫技术 页面处理 文本预处理 英文处理 中文处理 去停用词 文本表示 特征选择 分类模型 分类概述   分类(Classification)是指自动对数据进行 ...

最新文章

  1. swoole单台并发php,php swoole 并发多少?
  2. store下拉框同步_ExtJS下拉列表使用方法(异步传输数据)
  3. 记录一下Junit测试MongoDB,获取MongoTemplate
  4. 争议?MySQL存储过程与函数,封装,体,完整详细可收藏
  5. すぬけ君の塗り絵 / Snuke's Coloring(AtCoder-2068)
  6. Python 中的 None 与真假
  7. Windows的隐藏分区
  8. Lattice diamond 编程时工具报出 ID错误问题的解决
  9. linux系统安装pidgin,linux下QQ的安装(pidgin的安装)
  10. AXI_lite 总线学习
  11. 三角形黑盒测试-Java Swing
  12. shiro基本使用和完成登录
  13. 2018-5-18 笔记
  14. Windows系统在任务管理器中结束任务后电脑黑屏恢复
  15. (数学建模)2013年国赛B题-碎纸片复原python代码
  16. C-------------使用scanf输入字符串的故事;
  17. oracle添加分区语句_oracle表分区增加分区
  18. vs2019中如何创建qt项目_一、用于VS2019的QT配置
  19. 帝吧出征FB:这李毅吧的“爆吧”文化是如何形成的
  20. 币氪研报|OMG(OmiseGo)

热门文章

  1. POJ 2027 No Brainer(水~)
  2. Java元注解及代码示例
  3. malloc函数理解
  4. 谷歌量子计算机_谁能先造出世界最好量子计算机?IBM与谷歌展开量子大战
  5. 【附源码】计算机毕业设计Python安卓考研院校择选app27hhn(源码+程序+LW+调试部署)
  6. 《蚂蚁塔防》Antbuster
  7. Android学习笔记 56. TabLayout 选项卡布局
  8. 姓氏头像框一键制作小程序源码+附微语模块
  9. OpenCV中的RANSAC详解
  10. android 上下平滑翻页