NLP学习笔记(九) 分词(上)

news2024/11/30 18:42:17

大家好,我是半虹,这篇文章来讲分词算法


1  概述

分词是自然语言处理领域中的基础任务,是文本预处理的重要步骤

简单来说,就是将文本段落分解为基本语言单位,亦可称之为词元 ( token \text{token} token )

按照粒度的不同,可以细分为:字、词、子词等


我们知道,自然语言是十分典型的非结构化数据,机器是无法直接识别出来的

通过分词,自然语言可以转化为有限的词元组合,结合词表就可以将其表示为结构化的数据

这样机器才可以接收自然语言为输入,才有后续的各种模型的处理


对于分词的研究目前已经十分地成熟,按照类型的不同可以细分为:词典匹配、统计模型、深度学习等

虽然这些方法都可以达到很好的效果,但是仍然有一些难点要考虑:

  1. 分词粒度:分词没有唯一的标准,不同场景对分词粒度的要求也不同

         例如苹果手机,既可以将其切分为苹果和手机两个词,也可以将其作为一个词

  2. 歧义切分:有些时候不同的切分会导致不同的含义,而且有可能都是合理的

         例如这文章我写不好,既可以是这文章 / 我写不好,也可以是这文章 / 我写 / 不好

  3. 未登录词:在这信息爆炸的时代,互联网上很经常会出现一些新的词

         例如不明觉厉,怎么才能识别出这些新兴词语也是个难点


下面我们将会从不同的类型来讲一些目前常用的分词算法

下篇文章才会从不同的粒度去将另外一些常用的分词算法(由于篇幅原因,不得不分开两篇文章


2  按类型划分

分词算法按照类型可以分为以下三类:

  1. 基于词典匹配的分词算法,例如:最大匹配算法、最短路径算法
  2. 基于统计模型的分词算法,例如: N-gram model \text{N-gram model} N-gram model HMM \text{HMM} HMM CRF \text{CRF} CRF
  3. 基于深度学习的分词算法,例如: LSTM + CRF \text{LSTM + CRF} LSTM + CRF

2.1 基于词典匹配

基于词典匹配的分词算法,其目标为:根据输入的文本和给定的词典,返回对文本分词后的结果

所谓词典实际上就是常用词元的集合,算法通过将输入的文本与词典来匹配从而将其切分为词元

此类方法必须要事先准备好一个词典,至于词典怎么来和词典怎么用,正是需要考虑的关键问题


先说词典怎么来,这对分词算法的最终效果影响很大,因为对输入文本切分得到的词元必定是在词典中的

但是词典怎么来并不是此类方法的研究重点,较常见的做法是用简单的工具从大规模训练语料中提取得到


再说词典怎么用,基于词典匹配的分词算法,顾名思义,就是用特定的规则,将输入文本与词典进行匹配

从而将输入文本切分为词典当中的词元达到分词的目标,目前经过长时间的研究已有很多成熟的匹配方法


基于其基本设计,这类方法有直观的优缺点

  1. 从一方面说,可以很方便通过增删词典内容来调整分词结果

    另一方面说,太过于依赖词典导致其对未登陆词的处理欠佳

  2. 如果词典中的词元有公共子串,可能会出现歧义切分的问题

下面会具体介绍,各种基于词典匹配的算法


2.1.1 最大匹配算法

该算法的核心思想如下:对于输入文本,从左端或右端开始,以贪心的思想,匹配词典中可匹配的最长词元

  1. 若从文本左端开始进行匹配,则称为正向最大匹配算法
  2. 若从文本右端开始进行匹配,则称为逆向最大匹配算法
  3. 若同时从两端开始进行匹配,则称为双向最大匹配算法

大家有没有想过为什么匹配方式是最大匹配,而非最小匹配呢

这是因为一般来说越长的词语所表达的语义是越明确且丰富的


正向最大匹配算法的步骤如下:

  1. 给定一段输入文本,找到以文本左端第一个字为开头的且存在于词典中的最长匹配文本
  2. 将该文本切分出来,并将剩余文本作为新的输入文本,重复上述步骤,直到输入文本被全部切分

逆向最大匹配算法的步骤如下:

  1. 给定一段输入文本,找到以文本右端第一个字为结尾的且存在于词典中的最长匹配文本
  2. 将该文本切分出来,并将剩余文本作为新的输入文本,重复上述步骤,直到输入文本被全部切分

那么怎么找到最长匹配文本呢?最简单的方法就是纯暴力搜索,下面通过一个例子进行说明

假设输入文本如下:南京市长江大桥

假设给定词典如下:南、京、市、长、江、大、桥、南京、市长、长江、大桥、南京市、江大桥(人名)

正向匹配算法如下:

  1. 未匹配文本为 南京市长江大桥 因此要找以南字开头的最长匹配词元

    第一步,判断 南京市长江大桥 是否存在于词典,显然不在

    第二步,判断 南京市长江大  是否存在于词典,显然不在

    第三步,判断 南京市长江   是否存在于词典,显然不在

    第四步,判断 南京市长    是否存在于词典,显然不在

    第五步,判断 南京市     是否存在于词典,此时符合,因此将该文段切分作为词元

  2. 未匹配文本为    长江大桥 因此要找以长字开头的最长匹配词元

    第一步,判断    长江大桥 是否存在于词典,显然不在

    第二步,判断    长江大  是否存在于词典,显然不在

    第三步,判断    长江   是否存在于词典,此时符合,因此将该文段切分作为词元

  3. 未匹配文本为      大桥 因此要找以大字开头的最长匹配词元

    第一步,判断      大桥 是否存在于词典,此时符合,因此将该文段切分作为词元

  4. 故分词结果为 南京市 / 长江 / 大桥

逆向匹配算法如下:

  1. 未匹配文本为 南京市长江大桥 因此要找以桥字结尾的最长匹配词元

    第一步,判断 南京市长江大桥 是否存在于词典,显然不在

    第二步,判断  京市长江大桥 是否存在于词典,显然不在

    第三步,判断   市长江大桥 是否存在于词典,显然不在

    第四步,判断    长江大桥 是否存在于词典,显然不在

    第五步,判断     江大桥 是否存在于词典,此时符合,因此将该文段切分作为词元

  2. 未匹配文本为 南京市长    因此要找以长字结尾的最长匹配词元

    第一步,判断 南京市长    是否存在于词典,显然不在

    第二步,判断  京市长    是否存在于词典,显然不在

    第三步,判断   市长    是否存在于词典,此时符合,因此将该文段切分作为词元

  3. 未匹配文本为 南京      因此要找以京字结尾的最长匹配词元

    第一步,判断 南京      是否存在于词典,此时符合,因此将该文段切分作为词元

  4. 故分词结果为 南京 / 市长 / 江大桥


但纯暴力搜索时间效率比较差,可以利用字典树对其进行优化,主要的思路如下:

  1. 将词典构造成一棵字典树,所谓字典树就是一种数据结构,能减少存储空间、加快查找速度

    字典树的根节点不包含任何信息,其余节点是词元的公共前缀

    从根节点到其余节点的路径表示由路径上的字连接而成的词元

  2. 当进行匹配时,本质上是查找字典树中的一条路径,因此使用普通的树节点查找算法就可以

如果用上面的例子来说明,正向匹配算法的字典树和匹配过程如下:

正向匹配算法字典树
  1. 未匹配文本为南京市长江大桥,因此要找以南字开头的最长匹配词元

    第一步,查找最开始节点的子节点,找到节点,此时匹配

    第二步,查找上一步节点的子节点,找到节点,此时匹配南京

    第三步,查找上一步节点的子节点,找到节点,此时匹配南京市

    第四步,查找上一步节点的子节点,没有找得到,因此将上一步的文段切分作为词元

  2. 未匹配文本为   长江大桥,因此要找以长字开头的最长匹配词元

    第一步,查找最开始节点的子节点,找到节点,此时匹配

    第二步,查找上一步节点的子节点,找到节点,此时匹配长江

    第三步,查找上一步节点的子节点,没有找得到,因此将上一步的文段切分作为词元

  3. 未匹配文本为     大桥,因此要找以大字开头的最长匹配词元

    第一步,查找最开始节点的子节点,找到节点,此时匹配

    第二步,查找上一步节点的子节点,找到节点,此时匹配大桥

    第三步,查找上一步节点的子节点,没有找得到,因此将上一步的文段切分作为词元

  4. 故分词结果为 南京市 / 长江 / 大桥

还是用上面的例子来说明,逆向匹配算法的字典树和匹配过程如下:

逆向匹配算法字典树
  1. 未匹配文本为南京市长江大桥,因此要找以桥字结尾的最长匹配词元

    第一步,查找最开始节点的子节点,找到节点,此时匹配

    第二步,查找上一步节点的子节点,找到节点,此时匹配大桥

    第三步,查找上一步节点的子节点,找到节点,此时匹配江大桥

    第四步,查找上一步节点的子节点,没有找得到,因此将上一步的文段切分作为词元

  2. 未匹配文本为南京市长   ,因此要找以长字结尾的最长匹配词元

    第一步,查找最开始节点的子节点,找到节点,此时匹配

    第二步,查找上一步节点的子节点,找到节点,此时匹配市长

    第三步,查找上一步节点的子节点,没有找得到,因此将上一步的文段切分作为词元

  3. 未匹配文本为南京     ,因此要找以京字结尾的最长匹配词元

    第一步,查找最开始节点的子节点,找到节点,此时匹配

    第二步,查找上一步节点的子节点,找到节点,此时匹配南京

    第三步,查找上一步节点的子节点,没有找得到,因此将上一步的文段切分作为词元

  4. 故分词结果为 南京 / 市长 / 江大桥


无论使用纯暴力搜索还是字典树,我们可以发现上述两种方法得到的分词结果是不同的

  1. 正向最大匹配:南京市 / 长江 / 大桥
  2. 逆向最大匹配:南京 / 市长 / 江大桥

双向最大匹配算法会综合考虑正向和逆向的分词结果,从而决定最终分词,其规则如下:

  1. 如果正向和逆向分词最终的词元数不同,那么选择词元数较少的那个结果
  2. 如果正向和逆向分词最终的词元数相同,那么选择单字词较少的那个结果(若一样,则随便)

2.1.2 最短路径算法

基于词典匹配的另一种算法是最短路径分词,该算法的核心思想如下:

  1. 首先根据词典将输入文本中的所有词元识别出来构成有向无环图,即词图
  2. 找到从起点到终点的最短路径作为最佳组合方式,即为分词结果

具体操作如下:

  1. 假设给定文本 S = c 1 c 2 . . . c n S = c_1c_2...c_n S=c1c2...cn,其中 c i c_i ci 为单个汉字, n n n 为文本长度

  2. 建立 n + 1 n + 1 n+1 个节点 V 0 ,   V 1 ,   . . .   V n V_0,\ V_1,\ ...\ V_n V0, V1, ... Vn,将这些节点作为词图中的节点

  3. 相邻节点 V i − 1 V_{i-1} Vi1 V i V_{i} Vi ( 1 ≤ i ≤ n ) (1 \le i \le n) (1in) 之间建立有向边 V i − 1 → V i V_{i-1} \rightarrow V_{i} Vi1Vi,此时对应的词元就是 c i c_i ci

  4. w = c i . . . c j w = c_i...c_j w=ci...cj ( 0 < i < j ≤ n ) (0 \lt i \lt j \le n) (0<i<jn) 存在于词典,那么节点 V i − 1 V_{i-1} Vi1 V j V_{j} Vj 之间建立有向边 V i − 1 → V j V_{i-1} \rightarrow V_{j} Vi1Vj

  5. 最后,使用 Dijkstra \text{Dijkstra} Dijkstra 算法寻找以 V 0 V_0 V0 为起点、以 V n V_n Vn 为终点的最短路径即为分词结果

一个例子如下:

最短路径匹配

当然,寻找图最短路径是很常见的问题,除了经典的 Dijkstra \text{Dijkstra} Dijkstra 算法 ,也可以用其他合适的算法

另外,根据上述的设置,词图中每条边的权重值都是 1 1 1,也可以用词频等统计信息给边赋予权重


2.2 基于统计模型

基于统计模型的分词算法,其目标为:根据输入的文本和统计信息,对文本进行分词得到词元

通常认为在一定上下文中,相邻的文字同时出现的频率或概率越大,就越有可能可以构成词元

这种信息被称为字的共现,能体现文字组合关系的紧密程度和水平,属于统计信息的其中一种


该算法通过建立统计模型从大量训练语料获取词元的各种统计信息并将这些信息用于分词预测

下面会详细介绍各种基于统计模型的分词算法


2.2.1 N-gram model

在上节提到,我们可以给词图中的边赋予权重,权重信息可以通过语言概率统计得到

该模型认为,给定输入文本,其中某个词出现的概率由之前出现的词所决定,形式化表达如下:


假设给定输入文本 S = c 1 c 2 . . . c n S = c_1c_2...c_n S=c1c2...cn,其中 c i c_i ci 为单个词元, n n n 为文本长度

该文本的出现概率:
P ( S ) = P ( c 1 ,   c 2 ,   . . . ,   c n ) P(S) = P(c_1,\ c_2,\ ...,\ c_n) P(S)=P(c1, c2, ..., cn)
根据条件概率公式:
P ( S ) = P ( c 1 ) ⋅ P ( c 2 ∣ c 1 ) ⋅ P ( c 3 ∣ c 1 , c 2 ) ⋅ ⋯ ⋅ P ( c n ∣ c 1 , c 2 , . . . , c n − 1 ) P(S) = P(c_1) \cdot P(c_2|c_1) \cdot P(c_3|c_1, c_2) \cdot \cdots \cdot P(c_n|c_1, c_2, ..., c_{n-1}) P(S)=P(c1)P(c2c1)P(c3c1,c2)P(cnc1,c2,...,cn1)
可见,第 n n n 个词 c n c_n cn 出现的概率取决于前 n − 1 n - 1 n1 个词 c 1 ,   c 2 ,   . . . ,   c n − 1 c_1,\ c_2,\ ...,\ c_{n-1} c1, c2, ..., cn1


然而这种方式的计算复杂度太高,因此需要引入马尔可夫假设近似上式计算

马尔科夫假设认为:某个词出现的概率只取决于之前有限个词


假如某个词出现的概率只取决于前面一个词,那么该模型称为二元模型,即 2 -gram 2\text{-gram} 2-gram 语言模型

上述的计算公式可改写为:
P ( S ) = P ( c 1 ) ⋅ P ( c 2 ∣ c 1 ) ⋅ P ( c 3 ∣ c 2 ) ⋅ ⋯ ⋅ P ( c n ∣ c n − 1 ) P(S) = P(c_1) \cdot P(c_2|c_1) \cdot P(c_3|c_2) \cdot \cdots \cdot P(c_n|c_{n-1}) P(S)=P(c1)P(c2c1)P(c3c2)P(cncn1)
假如某个词出现的概率只取决于前面两个词,那么该模型称为三元模型,即 3 -gram 3\text{-gram} 3-gram 语言模型

上述的计算公式可改写为:
P ( S ) = P ( c 1 ) ⋅ P ( c 2 ∣ c 1 ) ⋅ P ( c 3 ∣ c 1 , c 2 ) ⋅ ⋯ ⋅ P ( c n ∣ c n − 2 , c n − 1 ) P(S) = P(c_1) \cdot P(c_2|c_1) \cdot P(c_3|c_1, c_2) \cdot \cdots \cdot P(c_n|c_{n-2}, c_{n-1}) P(S)=P(c1)P(c2c1)P(c3c1,c2)P(cncn2,cn1)

以此类推,这些模型被称为: n -gram model n\text{-gram model} n-gram model,可用于建模在上下文语境中词元出现的概率

我们可以用这些统计概率给词图的边赋予权重,示意图如下:

n-gram

加权词图中存在许多从起点到终点的路径,例如:

  1. P ( 南京市长江大桥 ) = P ( 南 ∣ S ) ⋅ P ( 京 ∣ 南 ) ⋅ P ( 市 ∣ 京 ) ⋅ P ( 长 ∣ 市 ) ⋅ P ( 江 ∣ 长 ) ⋅ P ( 大 ∣ 江 ) ⋅ P ( 桥 ∣ 大 ) P(南京市长江大桥) = P(南|S) \cdot P(京|南) \cdot P(市|京) \cdot P(长|市) \cdot P(江|长) \cdot P(大|江) \cdot P(桥|大) P(南京市长江大桥)=P(S)P()P()P()P()P()P()
  2. P ( 南京市长江大桥 ) = P ( 南京市 ∣ S ) ⋅ P ( 长江 ∣ 南京市 ) ⋅ P ( 大桥 ∣ 长江 ) P(南京市长江大桥) = P(南京市|S) \cdot P(长江|南京市) \cdot P(大桥|长江) P(南京市长江大桥)=P(南京市S)P(长江南京市)P(大桥长江)

找出其中使输入文本出现概率最大的路径,即为最佳分词组合


**那么上述的这些条件概率需要怎么计算呢?**这里会以条件概率 P ( c i ∣ c i − 1 ) P(c_{i}|c_{i-1}) P(cici1) 为例进行说明

首先条件概率等于联合概率除以边缘概率:
P ( c i ∣ c i − 1 ) = P ( c i , c i − 1 ) P ( c i − 1 ) P(c_{i}|c_{i-1}) = \frac{P(c_{i},c_{i-1})}{P(c_{i-1})} P(cici1)=P(ci1)P(ci,ci1)
联合概率只需统计 c i − 1 , c 1 c_{i-1},c_{1} ci1,c1 在训练语料中前后相邻出现的频率即可,具体是用出现次数除以语料大小
P ( c i , c i − 1 ) = # ( c i , c i − 1 ) # P(c_{i},c_{i-1}) = \frac{\#(c_{i},c_{i-1})}{\#} P(ci,ci1)=##(ci,ci1)
边缘概率则是统计 c i − 1 c_{i-1} ci1       在训练语料中自己单独出现的频率即可,仍然是用出现次数除以语料大小

P ( c i − 1 ) = # ( c i − 1 ) # P(c_{i-1}) = \frac{\#(c_{i-1})}{\#} P(ci1)=##(ci1)
最后化简可以得到 :
P ( c i ∣ c i − 1 ) = # ( c i , c i − 1 ) # ( c i − 1 ) P(c_{i}|c_{i-1}) = \frac{\#(c_{i},c_{i-1})}{\#(c_{i-1})} P(cici1)=#(ci1)#(ci,ci1)

2.2.2 HMM

HMM \text{HMM} HMM 全称为 H idden  M arkov  M odel \textbf{H}\text{idden}\ \textbf{M}\text{arkov}\ \textbf{M}\text{odel} Hidden Markov Model,翻译为:隐马尔可夫模型

隐马尔可夫模型是目前应用广泛的分词模型之一,它将分词问题看作是序列标注任务

所谓的序列标注就是说给定任意的一段输入序列,要求模型返回该序列中每个元素的状态标签

文本序列分词所定义的状态标签总共有以下四种:

  1. BBegin ):表示该文字是某个词语的开头,此时无需对其进行切分
  2. M (Middle):表示该文字是某个词语的中间,此时无需对其进行切分
  3. E (   End   ):表示该文字是某个词语的结尾,此时要对该词进行切分
  4. S (Single):表示该文字是作为单个字存在,此时要对该字进行切分

根据以上的描述,只要能推理出文本序列的标签,就能对该文本进行分词

下面是一个例子:

HMM标签

隐马尔可夫模型用于文本序列分词时包含两个关键的序列

  1. 文本序列:作为模型的输入,即人们显式看到的句子,又称为观测序列
  2. 状态序列:作为模型的输出,即人们不能看到的因素,又称为隐藏序列

上述隐藏序列又称为马尔可夫链,即当前状态的概率分布只由上一状态决定(一阶)

隐马尔可夫模型认为观测序列是由隐藏序列对应生成的,对应的概率图如下:

HMM过程

由于隐藏序列是人们不可观察的,所以要通过观测序列来推理得到隐藏序列


若从数学上理解,假设观测序列为 X X X,隐藏序列为 Y Y Y,隐马尔可夫模型实际上是一个生成式模型

因为生成式模型会认为输出 Y Y Y 按照一定的规律生成输入 X X X,模型对联合概率 P ( X ,   Y ) P(X,\ Y) P(X, Y) 进行建模


在解决此类问题时,隐马尔可夫模型会有两个重要的假设

  1. 齐次马尔可夫假设:隐藏的马尔可夫链在任一时刻的状态只与上一时刻的状态有关
  2. 观察值独立性假设:任一时刻的观测只与当前时刻的状态有关

最后来讲该模型的训练和预测过程,会有三个核心的矩阵,这些矩阵实际上就是隐马尔可夫模型的参数

  1. 初始概率矩阵:各个状态出现在句子开头的概率
  2. 转移概率矩阵:一个状态出现在另一个状态之后的概率
  3. 发射概率矩阵:某个状态下出现某字的概率

训练的过程就是根据给定的观测序列和隐藏序列对,通过统计来求解这三个矩阵

预测的过程就是根据给定的观测序列,应用这三个矩阵得到概率最大的隐藏序列


下面用一个例子来讲解如何求解和应用这三个矩阵,现假设给定的训练语料如下:

HMM训练语料

首先计算初始概率矩阵,先统计各个状态出现在句子开头的次数,再转化成概率矩阵就可以

HMM初始矩阵

然后计算转移概率矩阵,先统计一个状态出现在另一个状态之后的次数,再转化成概率矩阵就可以

HMM转移矩阵

最后计算发射概率矩阵,先统计某个状态下出现某字的次数,再转化成概率矩阵就可以

HMM发射矩阵

至此我们已经得到三个矩阵,接下来就是用这些矩阵对新输入句子中的每个文字预测其状态标签

假设现在给定一个输入句子,例如:我今天去弹吉他,显然句子中的每个文字都可能有四种状态

实际上我们需要计算所有可能的状态组合,并从中选择出概率最大的即为预测结果,示意图如下:

HMM预测

然而这样的纯暴力搜索方法的时间效率是非常低下的,为此我们可以使用维特比算法来进行优化

维特比算法可以理解成是动态规划算法、或贪心算法、或剪枝算法都可以

下面我们从剪枝的角度来讲维特比算法是怎么运作的,其算法的步骤如下:

  1. 当 “我” 的状态为 B 时,到达此节点的路径有一条,保留

    这一条路径是:OB

  2. 当 “我” 的状态为 M 时,到达此节点的路径有一条,保留

    这一条路径是:OM

  3. 当 “我” 的状态为 E 时,到达此节点的路径有一条,保留

    这一条路径是:OE

  4. 当 “我” 的状态为 S 时,到达此节点的路径有一条,保留

    这一条路径是:OS

  5. 当 “今” 的状态为 B 时,达到此节点的路径有四条,保留一条最优路径,其余路径不再考虑 (剪枝)

    这四条路径是:OBBOMBOEBOSB

    设保留路径是:OSB

  6. 当 “今” 的状态为 M 时,达到此节点的路径有四条,保留一条最优路径,其余路径不再考虑 (剪枝)

    这四条路径是:OBMOMMOEMOSM

    设保留路径是:OBM

  7. 当 “今” 的状态为 E 时,达到此节点的路径有四条,保留一条最优路径,其余路径不再考虑 (剪枝)

    这四条路径是:OBEOMEOEEOS E

    设保留路径是:OBE

  8. 当 “今” 的状态为 S 时,达到此节点的路径有四条,保留一条最优路径,其余路径不再考虑 (剪枝)

    这四条路径是:OBSOMSOESOSS

    设保留路径是:OSS

  9. 当 “天” 的状态为 B 时,达到此节点的路径有四条,保留一条最优路径,其余路径不再考虑 (剪枝)

    这四条路径是:OSBBOBMBOBEBOSSB

    设保留路径是:OBEB

  10. 当 “天” 的状态为 M 时,达到此节点的路径有四条,保留一条最优路径,其余路径不再考虑 (剪枝)

    这四条路径是:OSBMOBMMOBEMOSSM

    设保留路径是:OBMM


2.2.3 CRF

CRF \text{CRF} CRF   全称为  C onditional  R andom  F ield \textbf{C}\text{onditional}\ \textbf{R}\text{andom}\ \textbf{F}\text{ield} Conditional Random Field,翻译为:条件随机场模型

条件随机场模型将分词问题看作是序列标注任务,实际上该模型可以由隐马尔可夫模型引申得到

下面从数学角度入手,横向对比隐马尔可夫模型、最大熵马尔可夫模型、条件随机场模型的异同


首先以数学角度重新来回顾一下隐马尔可夫模型,该模型的概率图如下:

CRF_HMM概率图

为了简化运算,模型有以下假设

  1. 齐次马尔可夫假设: P ( y t ∣ y 1 : t − 1 ,   x 1 : t − 1 ) = P ( y t ∣ y t − 1 ) P(y_{t}|y_{1:t-1},\ x_{1:t-1}) = P(y_{t}|y_{t-1}) P(yty1:t1, x1:t1)=P(ytyt1)
  2. 观察值独立性假设: P ( x t ∣ y 1 : t     ,   x 1 : t − 1 ) = P ( x t ∣ y t ) P(x_{t}|y_{1:t\ \ \ },\ x_{1:t-1}) = P(x_{t}|y_{t}) P(xty1:t   , x1:t1)=P(xtyt)

模型的参数包括:初始概率分布 π \pi π、转移概率矩阵 A A A、发射概率矩阵 B B B,可将其表示为 λ = ( π ,   A ,   B ) \lambda = (\pi,\ A,\ B) λ=(π, A, B)

模型为生成模型,其建模对象定义为联合概率分布
P ( X ,   Y ∣ λ ) = ∏ t = 1 T P ( x t ,   y t ∣ λ ) = ∏ t = 1 T P ( y t ∣ y t − 1 , λ ) ⋅ P ( x t ∣ y t , λ ) P(X,\ Y|\lambda) = \prod_{t=1}^{T} P(x_t,\ y_t|\lambda) = \prod_{t=1}^{T} P(y_t|y_{t-1}, \lambda) \cdot P(x_t|y_t, \lambda) P(X, Yλ)=t=1TP(xt, ytλ)=t=1TP(ytyt1,λ)P(xtyt,λ)
式子的前半部分 P ( y t ∣ y t − 1 , λ ) P(y_t|y_{t-1}, \lambda) P(ytyt1,λ) 对应  转移概率矩阵,初始概率分布可以看作是转移概率矩阵的初始状态

式子的后半部分 P ( x t ∣ y t     , λ ) P(x_t|y_t\ \ \ , \lambda) P(xtyt   ,λ) 对应  发射概率矩阵


实际上,该模型的假设并不十分合理,很大程度上是为了降低计算复杂度而妥协的

以观察值独立性假设为例,每个观察值应该与整个序列有关,而不是仅与当前时刻的隐藏状态有关


最大熵马尔可夫模型打破了观察值独立性假设,模型的概率图如下:

CRF_MEMM概率图

上半部分表示整个观测序列对每个隐藏状态的影响,下半部分表示当前观测对当前隐藏状态的影响

通常来说只画上半部分或只画下半部分都是可以的,这里是为了对比方便才将二者同时画出

与隐马尔可夫模型最大的区别在于箭头方向的改变,该模型的箭头方向由观测指向隐藏状态


这说明模型更关心的是,在给定观测数据的情况下,其隐藏状态的取值

模型为判别模型,其建模对象定义为条件概率分布
P ( Y ∣ X ,   λ ) = ∏ t = 1 T P ( y t ∣ y t − 1 ,   x 1 : T ,   λ ) P(Y|X,\ \lambda) = \prod_{t=1}^{T} P(y_{t}|y_{t-1},\ x_{1:T},\ \lambda) P(YX, λ)=t=1TP(ytyt1, x1:T, λ)
对序列标注任务,该建模方式实际上是更有优势的,因为模型只需关心隐藏状态就可以


虽然最大熵马尔可夫模型打破了观察值独立性假设,但同时又带来了标注偏差问题

所谓标记偏差问题,简单来说,就是在状态转移时,若条件转移概率分布的熵越小,则越不关心观测值

极端的例子就是在上图虚线框,若 y t − 1 y_{t-1} yt1 转移到 y t y_{t} yt 时只有一条转移路径,则此时的观测值完全不起作用

根本的原因在于:上图虚线框中的局部有向图要求满足概率分布的性质,因此必须对其进行局部归一化


条件随机场模型解决了标记偏差问题,并间接了打破齐次马尔可夫假设,模型的概率图如下:

CRF_CRF概率图

对比最大熵马尔可夫模型最大的改变在于隐藏状态从有向图变成无向图,而无向图是天然的全局归一化


我们假设 X X X Y Y Y 有相同的结构分布,此时条件随机场称为线性随机场

模型还是判别模型,建模对象还是条件概率分布
P ( y ∣ x ) = 1 Z ( x ) ∑ t = 1 T exp ⁡ [ ∑ k = 1 K λ k f k ( y t − 1 , y t , x ) + ∑ l = 1 L μ l s l ( y t , x ) ] P(y|x) = \frac{1}{Z(x)} \sum_{t=1}^{T} \exp{[ \sum_{k=1}^{K} \lambda_k f_k(y_{t-1}, y_{t}, x) + \sum_{l=1}^{L} \mu_l s_l( y_{t}, x) ]} P(yx)=Z(x)1t=1Texp[k=1Kλkfk(yt1,yt,x)+l=1Lμlsl(yt,x)]
其中, Z ( x ) Z(x) Z(x) 是规范化因子 ,表示对 y y y 所有可能的取值求和

另外,式子中最核心的部分是两个特征函数

  1. f k f_k fk:定义在边上的特征函数,又称为转移特征函数 K K K 代表定义在该边上的特征函数的数量

           这类函数只和上一节点、当前节点和输入有关, λ k \lambda_k λk 表示函数对应的权重

  2. s l s_l sl:定义在点上的特征函数,又称为状态特征函数 L L L  代表定义在该点上的特征函数的数量

           这类函数只和当前节点和输入有关, μ l \mu_l μl 表示函数对应的权重

特征函数的取值只能是零或一,分别表示不满足或满足特征条件

每一个特征函数定义一个规则,对应权重定义这个规则的可信度,所有规则和可信度构成了条件概率分布

上述的参数需要通过训练语料来统计得到,之后便可利用该模型对新输入的句子进行标注和分词

最后将特征函数和可信度的分数叠加起来,选择使得整个句子得分最高的路径即为最佳分词组合

CRF预测

最后来总结一下 HMMCRF 的区别:

  1. HMM 是生成模型,对联合概率分布建模,其概率图为有向图

    CRF 是判别模型,对条件概率分布建模,其概率图为无向图

  2. HMM 的建立基于两个假设,即当前观测只依赖于当前状态和当前状态只依赖于上一状态

    CRF 的建立没有这些假设,因此其特征函数的选择更多样,例如可以考虑当前词和句首词的关系


2.3 基于深度学习

基于深度学习的分词算法,还是将分词问题看作是序列标注任务,然后使用端到端的模型来进行训练


而在自然语言处理领域中,经常用循环神经网络来建模文本序列,因为它能够很好地捕捉上下文信息

长短期记忆网络是循环神经网络的变种,在一定程度上能缓解循环神经网络在训练时出现的梯度问题

在此基础上,模型一般会采用双向结构,这可以进一步增强模型的编码能力,从而提升分词预测效果


目前用于分词的深度模型通常会先用双向长短期记忆网络编码序列,然后接一个线性层用于标签预测

示意图如下:

BiLSTM

我们可以在线性层后再接一个条件随机场,来学习标签间的状态转移,以避免一些不合理的标签组合

示意图如下:

BiLSTM_CRF

好啦,本文到此结束,感谢您的阅读!

如果你觉得这篇文章有需要修改完善的地方,欢迎在评论区留下你宝贵的意见或者建议

如果你觉得这篇文章还不错的话,欢迎点赞、收藏、关注,你的支持是对我最大的鼓励 (/ω\)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/363474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day50【代码随想录】动态规划之不同的子序列、两个字符串的删除操作、编辑距离

文章目录前言一、不同的子序列&#xff08;力扣115&#xff09;【hard】二、两个字符串的删除操作&#xff08;力扣583&#xff09;思路一思路二三、编辑距离&#xff08;力扣72&#xff09;【hard】前言 1、不同的子序列 2、两个字符串的删除操作 3、编辑距离 一、不同的子序…

网页扫描图像并以pdf格式上传到服务器端

本文描述如何通过网页驱动扫描仪、高拍仪等图像扫描设备进行图像扫描&#xff0c;扫描结果经编辑修改后以pdf压缩格式上传到后台java程序中进行服务器端落盘保存。图像扫描上传如文字描述顺序所介绍&#xff0c;先要驱动扫描设备工作&#xff0c;进行纸张数据的光学扫描操作形成…

Impacket工具使用

Impacket工具说明 Impacker是用户处理网络协议的Python类集合,用于对SAB1-3或IPv4/IPv6 上的TCP/UPD/ICMP/IGMP/ARP/IPv4/IPv6/SMB/MSRPC/NTLM/Kerberos/WMI/LDAP 等进行低级的编程访问,数据包可以从头开始构建,也可以从原始数据包中解析, 面向对象API使用处理协议的深层结构变…

Action Segmentation数据集介绍——Breakfast

文章目录简介细节Cooking actibitiesillustration of the actions论文讲解Breakfast&#xff08;The Breakfast Action Dataset&#xff09;简介 早餐动作数据集包括与早餐准备相关的10个动作&#xff0c;由18个不同厨房的52个不同的人执行。该数据集是最大的完全带注释的数据…

CCIE 350-401-实验全

实验 VRRP&#xff08;hello packettimes advertise&#xff09; This is a lab item in which tasks will be performed on virtual devices. Refer to the Tasks tab to view the tasks for this lab item.Refer to the Topology tab to access the device console(s) and p…

Spring Boot自动装配的原理

Spring Boot自动装配的原理自动装配的实现EnableAutoConfigurationAutoConfigurationImportSelectorSpring Boot中的自动装配&#xff0c;它是Starter的基础&#xff0c;也是Spring Boot的核心。那么什么叫自动装配呢&#xff1f;或者说什么叫装配呢&#xff1f; 简单来说&…

Vulnhub靶场----4、DC-4

文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 DC-4下载地址&#xff1a;https://download.vulnhub.com/dc/DC-4.zip kali&#xff1a;192.168.144.148 DC-4&#xff1a;192.168.144.152 二、渗透流程 端口扫描&#xff1a;nmap -T5 -p- -sV -sT -A 192.168.144.1…

ISIS协议

ISIS协议基础简介应用场景路由计算过程地址结构路由器分类邻居Hello报文邻居关系建立DIS及DIS与DR的类比链路状态信息的载体链路状态信息的交互路由算法网络分层路由域![在这里插入图片描述](https://img-blog.csdnimg.cn/9027c43b614a4399ae1f54e87a37f047.png)区域间路由简介…

【MySQL】表操作和库操作

文章目录概念库操作1.创建数据库2.删除数据库3.选择数据库4.显示数据库列表表操作1.创建数据表CREATE2.删除数据表DROP3.插入数据INSERT4.更新数据UPDATE5.修改数据ALTER6.查询数据SELECT7.WHERE子句8.ORDER BY子句9.LIMIT子句10.GROUP BY子句11.HAVING子句使用注意事项概念 M…

Java集合(一)---List和set

1.Java集合有哪些&#xff1f;集合类型主要有3种&#xff1a;set(集&#xff09;、list(列表&#xff09;和map(映射)Map接口和Collection接口是所有集合框架的父接口&#xff1a;1. Collection接口的子接口包括&#xff1a;Set接口和List接口2. Map接口的实现类主要有&#xf…

【Python】批量采集原神表情包~

嗨害大家好鸭~我是小熊猫(✿◡‿◡) 最近迷上了原神&#xff0c; 不自觉中就很喜欢保存广大旅行者制作的表情包~ 真的很有意思诶~ 源码资料电子书:点击此处跳转文末名片获取 一个个保存的话&#xff0c;好像效率很低嘛… 那我就发挥我小熊猫的老本行直接给把他们全部采集下…

零基础机器学习做游戏辅助第十三课--原神自动钓鱼(三)labelimg的使用

一、什么是labelimg labelimg是一款开源的图像标注工具,标签可用于分类和目标检测,它是用python写的,并使用Qt作为其图形界面,简单好用(虽然是英文版的)。其注释以 PASCAL VOC格式保存为XML文件,这是ImageNet使用的格式。此外,它还支持 COCO数据集格式。 二、安装label…

大数据时代下的企业网络安全

在大数据技术迅猛发展的今天&#xff0c;网络安全问题已经发展成一个广受关注的热门研究方向。有人说&#xff0c;“大数据下&#xff0c;人人裸奔”&#xff0c;隐私保护、数据防护日益成为广大学者、企业研究的焦点。 面对这种安全威胁&#xff0c;企业必须实施一些有效的信…

Allegro无法看到金属化孔的钻孔的原因和解决办法

Allegro无法看到金属化孔的钻孔的原因和解决办法 用Allegro设计PCB的时候,希望同时看到金属化孔的盘以及钻孔,如下图 但是有时显示效果是这样的,看不到钻孔了 导致无法直观地区分是通孔是还是表贴的盘 如何解决,具体操作如下 点击Setup

27正定矩阵

这一节进入正定矩阵的内容&#xff0c;什么叫做正定矩阵&#xff1f;为什么我们对矩阵正定这么感兴趣&#xff1f; PS&#xff1a;这一节将前面所有的概念都融合在一起&#xff1a;主元、行列式、特征值、不稳定性 一、正定矩阵的判断方法 为了说明问题&#xff0c;我们先考…

低代码平台和无代码平台哪个更适合开发企业管理系统?

编者按&#xff1a;本文分析了开发企业管理系统所需要的平台特性&#xff0c;并根据这些特点和低代码无代码的优劣比较&#xff0c;得出低代码平台更适合开发企业管理系统。关键词&#xff1a;私有化部署&#xff0c;可视化设计&#xff0c;源码交付&#xff0c;数据集成&#…

研究人员在野外发现大量的信息窃取者 “Stealc “的样本

一个名为Stealc的新信息窃取者正在暗网上做广告&#xff0c;它可能成为其他同类恶意软件的一个值得竞争的对象。 "SEKOIA在周一的一份报告中说&#xff1a;"威胁行为者将Stealc作为一个功能齐全、随时可用的窃取者&#xff0c;其开发依赖于Vidar、Raccoon、Mars和Re…

LeetCode 73. 矩阵置零

LeetCode 73. 矩阵置零 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 给定一个 KaTeX parse error: Double subscript at position 3: _m_̲ x _n_ 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法…

Power Query 再谈日期表

Power Query 再谈日期表 需要附件的朋友可以点赞关注后&#xff0c;在公众号(焦棚子)后台回复 日期表 三个字即可领取。 一、背景 在 Power BI 或者 Power Pivot 做业务分析中&#xff0c;必不可少的就是日期表。我们继续优化调制出符合国人习惯日期表。 本次更新&#xff…

harbor 仓库迁移升级

harbor 仓库迁移升级 harbor仓库安装数据传输仓库切换版本 v1.8.0 v2.3.5 harbor仓库安装 环境准备&#xff1a;安装docker详见&#xff1a;docker 的介绍和部署&#xff0c;并下载docker-compose详见&#xff1a;docker 三剑客compose。 现有支持的安装harbor仓库的方式有两…