自然语言处理
NLP(Natural Language Processing)是一门融合了计算机科学、人工智能以及语言学的交叉学科。
1 NLP 基本概念
NLP研究如何通过机器学习(ML)等技术,让计算机学会处理人类语言,乃至实现最终目标——理解人类语言或者人工智能。
1.1 NLP 特点
自然语言是人类社会发展过程中自然产生的语言,是最能体现人类智慧和文明的产物。
它高度灵活,充满不确定性,因此对于执行几种基本逻辑操作的计算机来说,读懂和理解就变得极其困难。
例如:我想静静。这句话充满歧义性,在语言的发展过程中:
- 歧义词汇:苹果、粉丝
- 巨量词汇:现代汉语常用词表、牛津英语不断增加
- 隐喻表达:打铁还要自身硬、在微信群里潜水
- 非结构化容错:研表究明,汉字的序顺不定一能影阅响读
- 复杂或歧义结构:喜欢上一个人
- 易变性未知词汇:耗子尾汁、干饭人
都使自然语言理解的困难程度不断增加。
1.2 NLP 处理步骤
graph LR
A1(语音) --> B1[语音识别]
A2(图像) --> B2[光学字符识别]
B1 --> C(文本)
B2 --> C(文本)
C --> D1["中文分词|词性标注|命名实体识别
词法分析"]
D1 --> E1[信息抽取]
D1 --> E2[句法分析]
D1 --> E3["文本分类|文本聚类"]
E2 --> F[语义分析]
F --> G[篇章分析]
① 输入识别: Speech Recognition & Optical Character Recognition ② 词法分析:
- 中文分词:将文本分割为有意义的词语;
- 词性标注:确定每个词语的类别和浅层的歧义消除;
- 实体识别:识别出专有名词。
③ 信息抽取: 抽取句子中的关键字,识别意图。 ④ 文本分类和聚类
- 分类:对于文本段进行不同维度的分类预测。
- 聚类:相似文本归类聚合或排除重复文本。
⑤ 句法分析: 分析句子语法,得到句子的主谓宾结构等。 ⑥ 语义分析和篇章分析
- 语义分析:词义消岐、语义角色标注、语义依存分析
- 篇章分析:解析和提取整篇文章的中心思想等
⑦ 应用层任务:自动问答、自动摘要、机器翻译……
2 NLP 技术原理
2.1 词典分词
中文分词是指将一段中文文本拆分为一系列单词的过程,其中词典分词是最简单、最常见的分词算法,包含一部词典(收录单词的列表)和一套查词典的算法规则即可。
虽然词典不可能收录所有的单词,不过最常用的词可能占据了整个文本80%以上的比例,因此只要收录了大部分的头部常用单词,就能解决绝大部分问题。
其中,我们在工程角度,认为词典中有的就是单词,没有的就不是单词。在做文本拆分时,会根据词典,选择不同的拆分算法,
| 拆分算法 | 例句 | 结果 |
|---|---|---|
| 完全切分 | 商品和服务 | 商, 商品, 品, 和, 和服, 服, 服务, 务 |
| 正向最长匹配 | 研究生命起源 | 研究生, 命, 起源 |
| 就读北京模型 | 就读, 北京大学 | |
| 逆向最长匹配 | 研究生命起源 | 研究, 生命, 起源 |
| 项目的研究 | 项, 目的, 研究 |
在实际的使用中,会结合正向和逆向最长匹配,称为双向最长匹配,规则如下:
1)同时执行正向和逆向最长匹配,若两者的词数不同,返回词数较小的那个 2)如果词数相同,返回单字更少的那个 3)如果单字数也相同,优先返回逆向匹配结果
这是属于早期的、基于规则系统的NLP方法,能解决部分问题,但基本上是不可商用的。
2.2 N 元语法
N元语法是一种语言模型(Language model ),语言模型在计算概率时,需要依赖大量训练样本数据,也就是语料库,否则它没法进行概率计算。
对于中文分词来说,语料库里是一个个已经做了正确拆分的句子样例,给定一个句子 w,语言模型则是计算该句子出现的概率 p(w) 的模型。例如:
句子:
\mathbf{w} = \mathbf{w}_1 \mathbf{w}_2 \ldots \mathbf{w}_k
公式:
p(\mathbf{w}) = p(\mathbf{w}_1 | \mathbf{w}_0) \times p(\mathbf{w}_2 | \mathbf{w}_0 \mathbf{w}_1) \ldots p(\mathbf{w}_{k+1} | \mathbf{w}_0 \mathbf{w}_1 \ldots \mathbf{w}_k) \\
= \prod_{t=1}^{k+1} p(\mathbf{w}_t | \mathbf{w}_0 \mathbf{w}_1 \ldots \mathbf{w}_{t-1})
但现实中语料无法穷举,长整句的的计算量巨大,因此对上述模型进行简化得到 N 元语法,他有个基本的理论假设,称为马尔科夫链假设,假设每个事件发生的概率只取决于前一个事件。
即在刚才的全量单词顺序概率计算中,计算某一个单词的概率时,是需要关联到它的所有前序单词;而简化后,在计算某个单词的概率,只考虑它的前一个单词,每次只计算两个单词之间的二元接续,这样的模型就被称为二元语法。
n=1时,称为一元语法(unigram)。即只看单个单词出现的概率,不管它的前续单词概率。
n=3时,称为三元语法(trigram)。看当前单词的前两个单词之后出现当前单词的概率来进行计算。
n≥4时,数据稀疏和计算代价问题又变得显著起来,在普通机器学习中,几乎已经不可实用。
因为整句都严格符合完整顺序的情况很少,但是只需要满足两个单词先后关系的情况则很多。这样简化后,整体的计算量就会急剧减少,而且数据稀疏的问题也能很好的得到缓解。
句子:
\mathbf{w} = \mathbf{w}_1 \mathbf{w}_2 \ldots \mathbf{w}_k
公式:
p(\mathbf{w}) = \prod_{t=1}^{k+n-1} p(\mathbf{w}_t | \mathbf{w}_{t-n+1} \ldots \mathbf{w}_{t-1})
然而在实际的工程角度,运用 N 元语法模型,需要经历训练和预测,并对数据进行插值和平滑操作。常用的有线性插值、拉普拉斯平滑算法等,来规避数据稀疏和数据陡峭的情况方便实际的运算 。
2.3 HMM 分词
上述的 N 元语法是较为古老的算法,他对于 OOV(Out of vocabulary,未登录词)几乎无能为力。我们希望模型具有根据单字进行动态组词的能力,以解决OA的问题,则需要一个更细粒度的语言模型,字符集的语言模型。
字符集语言模型中最基础的模型,隐马尔科夫模型(hidden Markov model,HMM),描述隐含未知参数的统计模型。在中文分词中,实际上是以文本字符串作为显性序列(每个汉字作为一个元素),求解它所对应的最有可能的词切分隐性序列的过程。
进行表示词的切分标注序列,可以使用 SP(Split、Pass)标注法,BMES(Begin、Middle、End、Single)标注法来表示词的切分顺序,下面以 BMES 法为例:
| 参 | 观 | 了 | 北 | 京 | 天 | 安 | 门 |
|---|---|---|---|---|---|---|---|
| B | E | S | B | E | B | M | E |
同时能得到初始向量矩阵,如:
graph TD
A((初始)) --0.7--> B((B))
A --0--> E((E))
A --0--> M((M))
A --0.3--> S((S))
该矩阵表示句子的第一个字符,它为 BMES 的概率各是多少(显然只能是BS,而不能是EM)。
状态转移概率矩阵(左),发射概率矩阵(右)等,如:
| b | e | m | s | | | 阿 | 啊 | 哎 | … | |
|---|---|---|---|---|---|---|---|---|---|
| B | 0 | 0.65 | 0.35 | 0 | | | 0.81 | 0.01 | 0.21 | … |
| E | 0.7 | 0 | 0 | 0.3 | | | 0.01 | 0.01 | 0.02 | … |
| M | 0 | 0.8 | 0.2 | 0 | | | 0.18 | 0.03 | 0.11 | … |
| S | 0.7 | 0 | 0 | 0.3 | | | 0 | 0.95 | 0 | … |
状态转移概率矩阵,表示上一个字符的标注状态,转移到当前字符的标注状态的概率,如上一个字符标注为B,则下一个字符不可能是B,因为不可能连续两个字符同时为词头。
发射概率矩阵,它统计了每个汉字分别表示为 BMES 的概率有多大,例如"阿"字,它很少成为词尾,也很少单独使用,因此它为 B|S 的概率极低。
通过上述三个矩阵的数据,就能通过 HMM 算法,针对任意一个文本序列来计算它的 BMES 最大可能的隐性序列了。这些概率数据,则需要依靠机器学习,自动统计计算来获取了。
2.4 词性标注
词性(Part of Speech,POS)指单词的语法分类,也称词类(名词、动词、形容词),词性标注是为句子中每个单词预测一个词性标签。它能支撑很多高级应用,如下游遇到 OOV 时,则能通过 OOV 的词性来决定用法。如:
- 句子"我喜欢张晚霞"中,不认识"张晚霞",但可以通过词性推测他为人名
- 信息抽取中,能抽取特定词性标签的词语,对文章进行分类等
进行词性标注也可以使用 HMM,利用 BMES 标注法来统计某个字或词对应的词性概率,构建属于词性的三项矩阵。
2.5 命名实体
如人名、地名、各类专业术语等,描述实体的词汇可以成为命名实体,它们往往是信息抽取的焦点。命令实体识别(Named Entity Recognition,NER)是需要识别出句子中命名实体的边界和类别的任务。
对于规则性较强的实体,如条形码、Email、网址、版本号等可以通过规则进行处理,如(正则表达式或其他规则系统):BOM编码:(([01245679]\d{3}|3[023456789]\d{2})[\dA-Z]{4}|S\d{7})
而一些如人名、机构名等非规则性专业名词,可能会涉及类别模糊、构词灵活(全程/缩写、嵌套),数量无穷(新词)等难点,则需要通过机器学习的方式获取。
2.6 信息抽取
这是一种从非结构化文本中提取结构化信息的任务,主要用于新词提取、关键字提取等。下面根据这两种应用做简单介绍:
-
新词提取
使用监督学习进行语料标注的成本太高,如何在不进行标注(无监督学习)的情况下,正确的识别和拆分出词语?即给定一段文本,随机取其中的片段,能正确判断出是词语还是单个汉字?
判断条件 举例 数学表达 公式 常以固定组合形式出现 蝴蝶 互信息 该片段以独立形式自由出现,而左右搭配丰富 蝴蝶[飞/蜕变]、[漂亮的/喜欢]蝴蝶 信息熵 出现频率高 词频 -
关键字提取
用于提取文章中重要的核心词汇,通常单文档词频统计法,多文档词频-倒排文档频次TF-IDF (Term Frequency – Inverse Document Frequency)统计法。
多个文档中,一个词语对于当前文档的重要程度还反比与有多少文档包含它。(包含它的文档越多,越不能体现文档的特色)
2.7 文本聚类
所谓聚类是把多个对象按照不同的特征划分到不同的子集的过程。文本聚类则是对文本聚类分析,广泛用于文本挖掘和信息检索(IR)领域,比如改善搜索结果,生成同义词等。
文本聚类中的特征是怎么样进行特征表示的?
有一种应用非常广泛的特征模型,词袋模型(Bag of Words ),将文本想象成一个装有单词的袋子,然后统计这个袋子里每个单词的特征值,这样就可以将文本表示成一个特征向量。 词袋模型并不考虑词序和语义,所以“人吃鱼”和“鱼吃人”的词袋向量是完全一样的,但实际工程中词袋模型还是一个非常高效的模型。
词袋中的特征值统计方法: 词频统计、布尔词频统计、TF-IDF统计、词向量统计等统计方法。
当文本都转化为向量后,就可以用纯数学上的算法模型对其进行处理,对于数据聚类,常用的有k均值算法(k-means)。
其他聚类算法:均值漂移、DBSCAN、GMM-EM、凝聚层次、图团体检测
2.8 文本分类
文本分类是将一个文本归类到一个或多个类别的NLP任务,它的应用场景非常广泛,意图识别、垃圾邮件过滤、垃圾评论过滤、自动标签、情感分析等等。它通常使用监督学习的模式,需要对训练样本做语料标注。
graph LR
A(生语料) --> B[语料标注
人工标注类别]
B --> C["特征提取
1.基于词袋的特征提取
2.停用词过滤
3.卡方校验的非关联词过滤"]
C --> D[分类器训练
1.朴素贝叶斯
2.支持向量机]
D --> E[执行预测
实际文本输入]
E --> F(分类结果)
当文本都转化为向量后,就脱离语言、句子等现实世界的约束,进入机器学习的世界。针对文本分类,最简单实用的分类算法是朴素贝叶斯分类器 NBC(Naïve Bayes Classfier) ,它的核心思想是:
P(B|A) = \frac{P(A|B) \cdot P(B)}{P(A)}
当我们无法准确获知事物的本质时,可以依靠与该事物关联的事件出现的多少,来判断其本质属性的概率
3 深度学习与NLP
深度学习就是采用多层神经网络算法模型的一种机器学习方法。
一个感知机加上一个激活函数(传递函数)构成一个神经元,多层/多个神经元全连接,构成神经网络。
回顾感知机:
1)读入训练样本 $(x^{(i)}, y^{(i)})$,执行预测 $\hat{y} = \text{sign}(\mathbf{w} \cdot \mathbf{x}^{(i)})$
2)如果 $\hat{y} \neq y^{(i)}$,则更新参数 $\mathbf{w} \leftarrow \mathbf{w} + y^{(i)} \mathbf{x}^{(i)}$
激活函数模拟神经元受激时的非线性反应表现(σ函数或tanh函数)。则神经元的输出为:$y = f\left(\sum_{n=1}^{N} w_n x_n + b\right)$,其中,$x_1 \sim x_n$ 为输入向量的各分量;$w_1 \sim w_n$ 为权值系数;$b$ 为偏置系数;$$f$$ 为非线性传递/激活函数。
深度学习相比传统 NLP 方法的优势在于:
- 用稠密向量解决数据稀疏问题
- 用多层网络自动提取特征表示
- 端到端完成完整的应用
3.1 Word2Vec 模型
该模型于 2013 年由 Google 提出,它的核心概念是词向量(Word Vector),用来对词语特征(维度或属性)进行形式化表达得数学向量形式。
-
独热码
前面提到的词袋模型转换文本为向量的过程,这个向量就是独热码,即将每一个不同的单词都独立表示为一个维度,例如词袋中有 1 万个单词,则每个单词就是一个 1万维的向量。
上述表示方法最大的问题就是所有维度之间是完全独立的,因此不同的单词是没有任何语义上的关联性的,如西红柿和番茄,现实生活中我们认为是同一种物品。
且一个几万维的向量中,可能只有几个维度是有值的,而其他绝大部分维度都是0,对数据存储是灾难性的。
-
词向量
对词语的特征进行数学化的表达,在此向量中每一个单词还是表示为一个向量,但是这个向量的维度不再是每个单词本身,而是指这个单词的某个属性值,或者说特征值。
维度 唱歌 跳舞 篮球 男人 蔡徐坤 0.63 0.47 0.84 0.98 如表格中所述,“蔡徐坤"这个单词可能有很多其他维度的含义,在词向量中,“西红柿"和"番茄”,它们大部分维度上的特征值可能是相同的,则可以根据这些推论出它们是近义词,这样便解决了数据稀疏的问题。
神经网络利用词向量这种稠密向量,往往更能得到更好的性能,在此基础上,基于深度学习的NLP模型不断涌现,如 GPT、BERT、ELMo …
4 NLP 的主要应用
1)智能搜索:Item内容理解、Query理解、检索召回相似文档、text2sql 等
2)智能问答:用户Query分词、意图识别、实体识别、答案召回
3)翻译智能:通过文本语言分析,精准翻译语句内容,从而帮助用户跨语言沟通
4)舆情分析:信息抽取、文本聚类,挖掘突发事件、舆论导向。多维度分析情绪、热点、趋势、传播途径等
5)内容推荐:信息抽取、句法分析、语义分析,精准匹配出语义相似的内容,从而快速构建内容推荐场景
6)内容风控:聊天室广告屏蔽,黄赌毒内容审核,脏话过滤
7)信息抽取整理:各种UGC内容tag提取,主题分布按主题归档,政策惩罚抽取,法律判决抽取,公司主权结构抽取等
8)推理预测:法律罪行推断,疾病并发症推断,商业事理推断;购买预测,点击预测,热点预测,爆款预测,疾病预测
9)语音&图像文字识别:对于单纯的语音和图像转文字,则利用NLP可以实现对于识别结果的文本纠错等
10)自动内容写作:辅助新闻写作,广告文案生成