2016年全球瞩目的围棋大战中,人类以失败告终,更是激起了各种“机器超越、控制人类”的讨论,然而机器真的懂人类吗?机器能感受到人类的情绪吗?机器能理解人类的语言吗?如果能,那它又是如何做到呢?带着这样好奇心,本文将带领大家熟悉和回顾一个完整的自然语言处理过程,后续所有章节所有示例开发都将遵从这个处理过程。

首先我们通过一张图(来源:网络)来了解 NLP 所包含的技术知识点,这张图从分析对象和分析内容两个不同的维度来进行表达,个人觉得内容只能作为参考,对于整个 AI 背景下的自然语言处理来说还不够完整。

有机器学习相关经验的人都知道,中文自然语言处理的过程和机器学习过程大体一致,但又存在很多细节上的不同点,下面我们就来看看中文自然语言处理的基本过程有哪些呢?

获取语料

语料,即语言材料。语料是语言学研究的内容。语料是构成语料库的基本单元。所以,人们简单地用文本作为替代,并把文本中的上下文关系作为现实世界中语言的上下文关系的替代品。我们把一个文本集合称为语料库(Corpus),当有几个这样的文本集合的时候,我们称之为语料库集合(Corpora)。(定义来源:百度百科)按语料来源,我们将语料分为以下两种:

1.已有语料

很多业务部门、公司等组织随着业务发展都会积累有大量的纸质或者电子文本资料。那么,对于这些资料,在允许的条件下我们稍加整合,把纸质的文本全部电子化就可以作为我们的语料库。

2.网上下载、抓取语料

如果现在个人手里没有数据怎么办呢?这个时候,我们可以选择获取国内外标准开放数据集,比如国内的中文汉语有搜狗语料人民日报语料。国外的因为大都是英文或者外文,这里暂时用不到。也可以选择通过爬虫自己去抓取一些数据,然后来进行后续内容。

语料预处理

这里重点介绍一下语料的预处理,在一个完整的中文自然语言处理工程应用中,语料预处理大概会占到整个50%-70%的工作量,所以开发人员大部分时间就在进行语料预处理。下面通过数据洗清、分词、词性标注、去停用词四个大的方面来完成语料的预处理工作。

1.语料清洗

数据清洗,顾名思义就是在语料中找到我们感兴趣的东西,把不感兴趣的、视为噪音的内容清洗删除,包括对于原始文本提取标题、摘要、正文等信息,对于爬取的网页内容,去除广告、标签、HTML、JS 等代码和注释等。常见的数据清洗方式有:人工去重、对齐、删除和标注等,或者规则提取内容、正则表达式匹配、根据词性和命名实体提取、编写脚本或者代码批处理等。

2.分词

中文语料数据为一批短文本或者长文本,比如:句子,文章摘要,段落或者整篇文章组成的一个集合。一般句子、段落之间的字、词语是连续的,有一定含义。而进行文本挖掘分析时,我们希望文本处理的最小单位粒度是词或者词语,所以这个时候就需要分词来将文本全部进行分词。

常见的分词算法有:基于字符串匹配的分词方法、基于理解的分词方法、基于统计的分词方法和基于规则的分词方法,每种方法下面对应许多具体的算法。

当前中文分词算法的主要难点有歧义识别和新词识别,比如:“羽毛球拍卖完了”,这个可以切分成“羽毛 球拍 卖 完 了”,也可切分成“羽毛球 拍卖 完 了”,如果不依赖上下文其他的句子,恐怕很难知道如何去理解。

3.词性标注

词性标注,就是给每个词或者词语打词类标签,如形容词、动词、名词等。这样做可以让文本在后面的处理中融入更多有用的语言信息。词性标注是一个经典的序列标注问题,不过对于有些中文自然语言处理来说,词性标注不是非必需的。比如,常见的文本分类就不用关心词性问题,但是类似情感分析、知识推理却是需要的,下图是常见的中文词性整理。

常见的词性标注方法可以分为基于规则和基于统计的方法。其中基于统计的方法,如基于最大熵的词性标注、基于统计最大概率输出词性和基于 HMM 的词性标注。

4.去停用词

停用词一般指对文本特征没有任何贡献作用的字词,比如标点符号、语气、人称等一些词。所以在一般性的文本处理中,分词之后,接下来一步就是去停用词。但是对于中文来说,去停用词操作不是一成不变的,停用词词典是根据具体场景来决定的,比如在情感分析中,语气词、感叹号是应该保留的,因为他们对表示语气程度、感情色彩有一定的贡献和意义。

特征工程

做完语料预处理之后,接下来需要考虑如何把分词之后的字和词语表示成计算机能够计算的类型。显然,如果要计算我们至少需要把中文分词的字符串转换成数字,确切的说应该是数学中的向量。有两种常用的表示模型分别是词袋模型和词向量。

词袋模型(Bag of Word, BOW),即不考虑词语原本在句子中的顺序,直接将每一个词语或者符号统一放置在一个集合(如 list),然后按照计数的方式对出现的次数进行统计。统计词频这只是最基本的方式,TF-IDF 是词袋模型的一个经典用法。

词向量是将字、词语转换成向量矩阵的计算模型。目前为止最常用的词表示方法是 One-hot,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。还有 Google 团队的 Word2Vec,其主要包含两个模型:跳字模型(Skip-Gram)和连续词袋模型(Continuous Bag of Words,简称 CBOW),以及两种高效训练的方法:负采样(Negative Sampling)和层序 Softmax(Hierarchical Softmax)。值得一提的是,Word2Vec 词向量可以较好地表达不同词之间的相似和类比关系。除此之外,还有一些词向量的表示方式,如 Doc2Vec、WordRank 和 FastText 等。

特征选择

同数据挖掘一样,在文本挖掘相关问题中,特征工程也是必不可少的。在一个实际问题中,构造好的特征向量,是要选择合适的、表达能力强的特征。文本特征一般都是词语,具有语义信息,使用特征选择能够找出一个特征子集,其仍然可以保留语义信息;但通过特征提取找到的特征子空间,将会丢失部分语义信息。所以特征选择是一个很有挑战的过程,更多的依赖于经验和专业知识,并且有很多现成的算法来进行特征的选择。目前,常见的特征选择方法主要有 DF、 MI、 IG、 CHI、WLLR、WFO 六种。

模型训练

在特征向量选择好之后,接下来要做的事情当然就是训练模型,对于不同的应用需求,我们使用不同的模型,传统的有监督和无监督等机器学习模型, 如 KNN、SVM、Naive Bayes、决策树、GBDT、K-means 等模型;深度学习模型比如 CNN、RNN、LSTM、 Seq2Seq、FastText、TextCNN 等。这些模型在后续的分类、聚类、神经序列、情感分析等示例中都会用到,这里不再赘述。下面是在模型训练时需要注意的几个点。

1.注意过拟合、欠拟合问题,不断提高模型的泛化能力。

过拟合:模型学习能力太强,以至于把噪声数据的特征也学习到了,导致模型泛化能力下降,在训练集上表现很好,但是在测试集上表现很差。

常见的解决方法有:

  • 增大数据的训练量;
  • 增加正则化项,如 L1 正则和 L2 正则;
  • 特征选取不合理,人工筛选特征和使用特征选择算法;
  • 采用 Dropout 方法等。

欠拟合:就是模型不能够很好地拟合数据,表现在模型过于简单。

常见的解决方法有:

  • 添加其他特征项;
  • 增加模型复杂度,比如神经网络加更多的层、线性模型通过添加多项式使模型泛化能力更强;
  • 减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数。

2.对于神经网络,注意梯度消失和梯度爆炸问题。

评价指标

训练好的模型,上线之前要对模型进行必要的评估,目的让模型对语料具备较好的泛化能力。具体有以下这些指标可以参考。

1.错误率、精度、准确率、精确度、召回率、F1 衡量。

错误率:是分类错误的样本数占样本总数的比例。对样例集 D,分类错误率计算公式如下:

精度:是分类正确的样本数占样本总数的比例。这里的分类正确的样本数指的不仅是正例分类正确的个数还有反例分类正确的个数。对样例集 D,精度计算公式如下:

对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合划分为真正例(True Positive)、假正例(False Positive)、真反例(True Negative)、假反例(False Negative)四种情形,令 TP、FP、TN、FN 分别表示其对应的样例数,则显然有 TP+FP++TN+FN=样例总数。分类结果的“混淆矩阵”(Confusion Matrix)如下:

准确率,缩写表示用 P。准确率是针对我们预测结果而言的,它表示的是预测为正的样例中有多少是真正的正样例。定义公式如下:

精确度,缩写表示用 A。精确度则是分类正确的样本数占样本总数的比例。Accuracy 反应了分类器对整个样本的判定能力(即能将正的判定为正的,负的判定为负的)。定义公式如下:

召回率,缩写表示用 R。召回率是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确。定义公式如下:

F1 衡量,表达出对查准率/查全率的不同偏好。定义公式如下:

2.ROC 曲线、AUC 曲线。

ROC 全称是“受试者工作特征”(Receiver Operating Characteristic)曲线。我们根据模型的预测结果,把阈值从0变到最大,即刚开始是把每个样本作为正例进行预测,随着阈值的增大,学习器预测正样例数越来越少,直到最后没有一个样本是正样例。在这一过程中,每次计算出两个重要量的值,分别以它们为横、纵坐标作图,就得到了 ROC 曲线。

ROC 曲线的纵轴是“真正例率”(True Positive Rate, 简称 TPR),横轴是“假正例率”(False Positive Rate,简称FPR),两者分别定义为:

ROC 曲线的意义有以下几点:

  1. ROC 曲线能很容易的查出任意阈值对模型的泛化性能影响;
  2. 有助于选择最佳的阈值;
  3. 可以对不同的模型比较性能,在同一坐标中,靠近左上角的 ROC 曲所代表的学习器准确性最高。

如果两条 ROC 曲线没有相交,我们可以根据哪条曲线最靠近左上角哪条曲线代表的学习器性能就最好。但是实际任务中,情况很复杂,若两个模型的 ROC 曲线发生交叉,则难以一般性的断言两者孰优孰劣。此时如果一定要进行比较,则比较合理的判断依据是比较 ROC 曲线下的面积,即AUC(Area Under ROC Curve)。

AUC 就是 ROC 曲线下的面积,衡量学习器优劣的一种性能指标。AUC 是衡量二分类模型优劣的一种评价指标,表示预测的正例排在负例前面的概率。

前面我们所讲的都是针对二分类问题,那么如果实际需要在多分类问题中用 ROC 曲线的话,一般性的转化为多个“一对多”的问题。即把其中一个当作正例,其余当作负例来看待,画出多个 ROC 曲线。

模型上线应用

模型线上应用,目前主流的应用方式就是提供服务或者将模型持久化。

第一就是线下训练模型,然后将模型做线上部署,发布成接口服务以供业务系统使用。

第二种就是在线训练,在线训练完成之后把模型 pickle 持久化,然后在线服务接口模板通过读取 pickle 而改变接口服务。

模型重构(非必须)

随着时间和变化,可能需要对模型做一定的重构,包括根据业务不同侧重点对上面提到的一至七步骤也进行调整,重新训练模型进行上线。

参考文献

  1. 周志华《机器学习》
  2. 李航《统计学习方法》
  3. 伊恩·古德费洛《深度学习》

第01课:中文自然语言处理的完整机器处理流程相关推荐

  1. 中文自然语言处理可能是 NLP 中最难的?

    现如今,在更多情况下,我们通过传感器和字节来与机器获得交流,而不是依靠交换情感,那如何让超级智能机器能够和人类正常交流沟通呢? 在人工智能背景技术下,自然语言处理(NLP)技术被越来越多的人看好,并受 ...

  2. 推荐一套开源中文课:自然语言处理(NLP)专题

    没错,百度出NLP开源中文课了! 顶配师资.模型全开源.配V100算力那种 最实用NLP中文课来袭   自然语言处理(下文简称NLP)是人工智能的关键研究领域之一,旨在教会计算机理解和生成语言.    ...

  3. NLP Chinese Corpus:大规模中文自然语言处理语料

    中文的信息无处不在,但如果想要获得大量的中文语料,却是不太容易,有时甚至非常困难.在 2019 年初这个时点上,普通的从业者.研究人员或学生,并没有一个比较好的渠道获得极大量的中文语料. 笔者想要训练 ...

  4. 开篇词:中文自然语言处理——未来数据领域的珠穆朗玛峰

    人工智能或许是人类最美好的梦想之一.追溯到公元前仰望星空的古希腊人,当亚里士多德为了解释人类大脑的运行规律而提出了联想主义心理学的时候,他恐怕不会想到,两千多年后的今天,人们正在利用联想主义心理学衍化 ...

  5. 面向中文自然语言处理的60余类系统开源实践项目与工业探索索引

    项目介绍 面向中文自然语言处理的六十余类实践项目及学习索引,涵盖语言资源构建.社会计算.自然语言处理组件.知识图谱.事理图谱.知识抽取.情感分析.深度学习等几个学习主题.包括作者个人简介.学习心得.语 ...

  6. 对话系统中的中文自然语言理解 (NLU) 任务介绍

    每天给你送来NLP技术干货! 来自:看个通俗理解吧 Chinese Natural Language Understanding, NLU, in Dialogue Systems 1&2 T ...

  7. msra数据集_干货下载 | 中文自然语言处理 语料/数据集

    来源:GitHub 作者:SophonPlus ChineseNlpCorpus 搜集.整理.发布中文自然语言处理 语料/数据集,与有志之士共同促进中文自然语言处理 的 发展. 情感/观点/评论 倾向 ...

  8. 中文自然语言处理测评数据集、基准模型、语料库、排行榜整理分享

    本资源整理了中文语言理解测评基准,包括代表性的数据集.基准(预训练)模型.语料库.排行榜.本文选择一系列有一定代表性的任务对应的数据集,做为测试基准的数据集.这些数据集会覆盖不同的任务.数据量.任务难 ...

  9. Code::Blocks 2023.01 全中文汉化-优化版

    Code::Blocks 是一款开放源码.功能全面的跨平台集成开发环境(IDE),通过集成相应的编译器,可以支持使用广泛的C和C++程序开发.而且通过集成各种插件,可以实现各种扩展功能. 目前在中文网 ...

最新文章

  1. SQL server根据值搜表名和字段
  2. MVCC在MySQL的InnoDB中的实现
  3. #define与enum,你不知道的那些事
  4. 如何在sh的字符串中包含换行符?
  5. [转载] Python pep8编码规范
  6. 诺顿误杀真相之“为什么诺顿会误杀中文windows”
  7. JAVA-时间日期格式转换
  8. hikari yml文件配置
  9. 基因的entrez ID 跟symbol等其它ID的转换程序
  10. 页面ifream固定分辨率展示并适配所有分辨率方法
  11. 内网环路怎么解决_利用生成树协议巧妙解决局域网二层环路
  12. 当咖啡师,开咖啡店,要学哪些东西
  13. 拍拍关闭:C2C模式走向终结?
  14. 使用STM32hal库usart的接收中断分析及出现部分问题的解决
  15. 自动化办公python脚本_Python自动化办公
  16. Python 在程序中定义函数fun(s)
  17. iperf 安卓 灌包命令_iperf灌包
  18. 双十一之于阿里的新内涵:阿里大生态秀场、打造生活方式还有增强用户粘性...
  19. 男人帮之程序员坚持语录
  20. 删除的数据如何恢复?误删了文件怎么恢复

热门文章

  1. 软件测试部分习题答案
  2. 后台服务出现明显“变慢”,谈谈你的诊断思路?
  3. 在Apache上配置防盗链功能和隐藏版本号
  4. java形状_形状等于()
  5. ale插件 vim_Vim之代码异步检测插件 ALE -- 实时检查verilog等代码的正确性
  6. linux系统迁移的重要配置文件,mylinuxbackup
  7. 多核处理器_多核处理器还能走多远?2050年用上1024核CPU
  8. python open 相对路径_第十四篇:Python中文件读写
  9. 学生签到系统c代码_C语言实现简单学生学籍管理系统
  10. linux 7 pxe,CentOS 7.6 PXE方式安装和配置