目录

自然语言处理

NLP(Natural Language Processing)是一门融合了计算机科学、人工智能以及语言学的交叉学科

NLP研究如何通过机器学习(ML)等技术,让计算机学会处理人类语言,乃至实现最终目标——理解人类语言或者人工智能。

自然语言是人类社会发展过程中自然产生的语言,是最能体现人类智慧和文明的产物。

它高度灵活,充满不确定性,因此对于执行几种基本逻辑操作的计算机来说,读懂和理解就变得极其困难。

例如:我想静静。这句话充满歧义性,在语言的发展过程中:

  • 歧义词汇:苹果、粉丝
  • 巨量词汇:现代汉语常用词表、牛津英语不断增加
  • 隐喻表达:打铁还要自身硬、在微信群里潜水
  • 非结构化容错:研表究明,汉字的序顺不定一能影阅响读
  • 复杂或歧义结构:喜欢上一个人
  • 易变性未知词汇:耗子尾汁、干饭人

都使自然语言理解的困难程度不断增加。

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 ② 词法分析:

  • 中文分词:将文本分割为有意义的词语;
  • 词性标注:确定每个词语的类别和浅层的歧义消除;
  • 实体识别:识别出专有名词。

③ 信息抽取: 抽取句子中的关键字,识别意图。 ④ 文本分类和聚类

  • 分类:对于文本段进行不同维度的分类预测。
  • 聚类:相似文本归类聚合或排除重复文本。

⑤ 句法分析: 分析句子语法,得到句子的主谓宾结构等。 ⑥ 语义分析和篇章分析

  • 语义分析:词义消岐、语义角色标注、语义依存分析
  • 篇章分析:解析和提取整篇文章的中心思想等

⑦ 应用层任务:自动问答、自动摘要、机器翻译……

中文分词是指将一段中文文本拆分为一系列单词的过程,其中词典分词是最简单、最常见的分词算法,包含一部词典(收录单词的列表)和一套查词典的算法规则即可。

虽然词典不可能收录所有的单词,不过最常用的词可能占据了整个文本80%以上的比例,因此只要收录了大部分的头部常用单词,就能解决绝大部分问题。

其中,我们在工程角度,认为词典中有的就是单词,没有的就不是单词。在做文本拆分时,会根据词典,选择不同的拆分算法,

拆分算法 例句 结果
完全切分 商品和服务 商, 商品, 品, 和, 和服, 服, 服务, 务
正向最长匹配 研究生命起源 研究生, 命, 起源
就读北京模型 就读, 北京大学
逆向最长匹配 研究生命起源 研究, 生命, 起源
项目的研究 项, 目的, 研究

在实际的使用中,会结合正向和逆向最长匹配,称为双向最长匹配,规则如下:

1)同时执行正向和逆向最长匹配,若两者的词数不同,返回词数较小的那个 2)如果词数相同,返回单字更少的那个 3)如果单字数也相同,优先返回逆向匹配结果

这是属于早期的、基于规则系统的NLP方法,能解决部分问题,但基本上是不可商用的

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 元语法模型,需要经历训练和预测,并对数据进行插值和平滑操作。常用的有线性插值、拉普拉斯平滑算法等,来规避数据稀疏和数据陡峭的情况方便实际的运算 。

上述的 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 最大可能的隐性序列了。这些概率数据,则需要依靠机器学习,自动统计计算来获取了。

词性(Part of Speech,POS)指单词的语法分类,也称词类(名词、动词、形容词),词性标注是为句子中每个单词预测一个词性标签。它能支撑很多高级应用,如下游遇到 OOV 时,则能通过 OOV 的词性来决定用法。如:

  • 句子"我喜欢张晚霞"中,不认识"张晚霞",但可以通过词性推测他为人名
  • 信息抽取中,能抽取特定词性标签的词语,对文章进行分类等

进行词性标注也可以使用 HMM,利用 BMES 标注法来统计某个字或词对应的词性概率,构建属于词性的三项矩阵。

如人名、地名、各类专业术语等,描述实体的词汇可以成为命名实体,它们往往是信息抽取的焦点。命令实体识别(Named Entity Recognition,NER)是需要识别出句子中命名实体的边界和类别的任务。

对于规则性较强的实体,如条形码、Email、网址、版本号等可以通过规则进行处理,如(正则表达式或其他规则系统):BOM编码:(([01245679]\d{3}|3[023456789]\d{2})[\dA-Z]{4}|S\d{7})

而一些如人名、机构名等非规则性专业名词,可能会涉及类别模糊、构词灵活(全程/缩写、嵌套),数量无穷(新词)等难点,则需要通过机器学习的方式获取。

这是一种从非结构化文本中提取结构化信息的任务,主要用于新词提取、关键字提取等。下面根据这两种应用做简单介绍:

  1. 新词提取

    使用监督学习进行语料标注的成本太高,如何在不进行标注(无监督学习)的情况下,正确的识别和拆分出词语?即给定一段文本,随机取其中的片段,能正确判断出是词语还是单个汉字?

    判断条件 举例 数学表达 公式
    常以固定组合形式出现 蝴蝶 互信息 I(X;Y)=x,yp(x,y)logp(x,y)p(x)p(y) I(X; Y) = \sum_{x, y} p(x, y) \log \frac{p(x, y)}{p(x) p(y)}
    该片段以独立形式自由出现,而左右搭配丰富 蝴蝶[飞/蜕变]、[漂亮的/喜欢]蝴蝶 信息熵 H(X)=xp(x)logp(x)H(X) = -\sum_{x} p(x) \log p(x)
    出现频率 词频
  2. 关键字提取

    用于提取文章中重要的核心词汇,通常单文档词频统计法,多文档词频-倒排文档频次TF-IDF (Term Frequency – Inverse Document Frequency)统计法。

    多个文档中,一个词语对于当前文档的重要程度还反比与有多少文档包含它。(包含它的文档越多,越不能体现文档的特色)

所谓聚类是把多个对象按照不同的特征划分到不同的子集的过程。文本聚类则是对文本聚类分析,广泛用于文本挖掘和信息检索(IR)领域,比如改善搜索结果,生成同义词等。

文本聚类中的特征是怎么样进行特征表示的?

有一种应用非常广泛的特征模型,词袋模型(Bag of Words ),将文本想象成一个装有单词的袋子,然后统计这个袋子里每个单词的特征值,这样就可以将文本表示成一个特征向量。 词袋模型并不考虑词序和语义,所以“人吃鱼”和“鱼吃人”的词袋向量是完全一样的,但实际工程中词袋模型还是一个非常高效的模型。

词袋中的特征值统计方法: 词频统计、布尔词频统计、TF-IDF统计、词向量统计等统计方法。

当文本都转化为向量后,就可以用纯数学上的算法模型对其进行处理,对于数据聚类,常用的有k均值算法(k-means)。

其他聚类算法:均值漂移、DBSCAN、GMM-EM、凝聚层次、图团体检测

文本分类是将一个文本归类到一个或多个类别的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)}

当我们无法准确获知事物的本质时,可以依靠与该事物关联的事件出现的多少,来判断其本质属性的概率

深度学习就是采用多层神经网络算法模型的一种机器学习方法。

一个感知机加上一个激活函数(传递函数)构成一个神经元,多层/多个神经元全连接,构成神经网络。

回顾感知机:

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 方法的优势在于:

  • 用稠密向量解决数据稀疏问题
  • 用多层网络自动提取特征表示
  • 端到端完成完整的应用

该模型于 2013 年由 Google 提出,它的核心概念是词向量(Word Vector),用来对词语特征(维度或属性)进行形式化表达得数学向量形式。

  1. 独热码

    前面提到的词袋模型转换文本为向量的过程,这个向量就是独热码,即将每一个不同的单词都独立表示为一个维度,例如词袋中有 1 万个单词,则每个单词就是一个 1万维的向量。

    上述表示方法最大的问题就是所有维度之间是完全独立的,因此不同的单词是没有任何语义上的关联性的,如西红柿和番茄,现实生活中我们认为是同一种物品。

    且一个几万维的向量中,可能只有几个维度是有值的,而其他绝大部分维度都是0,对数据存储是灾难性的。

  2. 词向量

    对词语的特征进行数学化的表达,在此向量中每一个单词还是表示为一个向量,但是这个向量的维度不再是每个单词本身,而是指这个单词的某个属性值,或者说特征值。

    维度 唱歌 跳舞 篮球 男人
    蔡徐坤 0.63 0.47 0.84 0.98

    如表格中所述,“蔡徐坤"这个单词可能有很多其他维度的含义,在词向量中,“西红柿"和"番茄”,它们大部分维度上的特征值可能是相同的,则可以根据这些推论出它们是近义词,这样便解决了数据稀疏的问题。

神经网络利用词向量这种稠密向量,往往更能得到更好的性能,在此基础上,基于深度学习的NLP模型不断涌现,如 GPT、BERT、ELMo …

1)智能搜索:Item内容理解、Query理解、检索召回相似文档、text2sql 等

2)智能问答:用户Query分词、意图识别、实体识别、答案召回

3)翻译智能:通过文本语言分析,精准翻译语句内容,从而帮助用户跨语言沟通

4)舆情分析:信息抽取、文本聚类,挖掘突发事件、舆论导向。多维度分析情绪、热点、趋势、传播途径等

5)内容推荐:信息抽取、句法分析、语义分析,精准匹配出语义相似的内容,从而快速构建内容推荐场景

6)内容风控:聊天室广告屏蔽,黄赌毒内容审核,脏话过滤

7)信息抽取整理:各种UGC内容tag提取,主题分布按主题归档,政策惩罚抽取,法律判决抽取,公司主权结构抽取等

8)推理预测:法律罪行推断,疾病并发症推断,商业事理推断;购买预测,点击预测,热点预测,爆款预测,疾病预测

9)语音&图像文字识别:对于单纯的语音和图像转文字,则利用NLP可以实现对于识别结果的文本纠错等

10)自动内容写作:辅助新闻写作,广告文案生成