自然语言处理学习笔记(1)——词典分词

自然语言处理学习笔记(1)——词典分词


一、相关定义(P32)

  • 中文分词:将一段文本拆分为一系列单词的过程,这些单词顺序拼接后等于源文本。
  • 词典分词:一个确定的查词与输出的规则系统,仅需要一部词典和一套查词典的规则,是最简单、最常见的分词算法(语言是时刻在发展变化的,任何词典都只是某个时间节点拍摄的一张快照)。
  • 词的定义:在语言学上,词语是具备独立意义的最小单位。

二、切分算法

1. 完全切分(P36)

  • 完全切分指的是:找出一段文本中的所有单词(并不是标准意义上的分词),不考虑效率的话,朴素的完全切分算法非常简单,只需遍历文本中的连续序列,查询该序列是否在词典中。

2. 最长匹配算法(P37)

  • 正向最长匹配:在以某个下标为起点递增查词的过程中,优先输出更长的单词,该下标的扫描顺序从前往后
  • 逆向最长匹配:操作与正向最长匹配类似,只不过下标的扫描顺序从后往前
  • 双向最长匹配:同时执行正向和逆向最长匹配,若两者的词数不同,则返回词数更少的那一个;否则,返回两者中单字更少的那一个;当单字数也相同时,优先返回逆向最长匹配的结果。三种匹配规则的效果对比如下图:

自然语言处理学习笔记(1)——词典分词_第1张图片

  • 速度评测:(1)同等条件下,Python 的运行速度比 Java 慢,效率只有 Java 的一半不到;

    ​ (2)正向匹配和逆向匹配的速度差不多,是双向的两倍。


三、字典树

1. 定义(P46)

  • 字符串集合常用字典树tire 树、前缀树)存储,这是一种字符串上的树形数据结构。字典树中每条边都对应一个字,从根节点往下的路径构成一个个字符串,如下图所示:

自然语言处理学习笔记(1)——词典分词_第2张图片

当词典大小为 n 时,虽然最坏情况下字典树的复杂度依然是 O(logn) ,但它的实际速度比二分查找快。

  • 实现及其增删改查的操作见P47-49

2. 双数组字典树(Double Array Tire,DAT)(P55)

  • basecheck 两个数组组成,简称双数组,且满足:

    p = base[b] + c

    check[p] = base[b]

    若不满足此条件,则状态转移失败。例如当前状态为自然,我们想知道是否可以转移到自然人,先执行自然人 = base[自然] + 人,然后检查check[自然人] == base[自然]是否成立,据此判断转移是否成功。

  • DAT的构造是普通字典上的深度优先遍历问题:为字典树的每个节点分配一个双数组中的下标,并维护双数组的值,其构造算法为递归的过程,代码见 P58。

  • DAT每次状态转移的时间复杂度都是常数,但全切分长度为 n 的文本时,复杂度是 O(n2)

3. AC自动机(Aho-Corasick)(P60)

  • 一次扫描就查询出所有出现过的单词,时间复杂度为 O(n) ,被广泛用于多字符串搜索。

  • 给定多个词语(也称模式串,pattern),从母文本中匹配它们的问题称为多模式匹配(multi-pattern matching),AC自动机就是一种常用的多模式匹配算法,适用于中文处理中汉字这种短模式串。

  • AC自动机由 goto 表、fail 表和 output 表组成。

    goto 表:也称 success 表,就是是一颗前缀树,用来将每个模式串索引到前缀树上,如下图:

自然语言处理学习笔记(1)——词典分词_第3张图片

output 表:给定一个状态,需要知道该状态是否对应某个或某些模式串,以决定是否输出模式串以及其对应的值。output 表中的元素有两种,一种是从初始状态到当前状态的路径本身对应的模式串(如下图2号状态),另一种是路径的后缀所对应的模式串(如下图5号状态)。

自然语言处理学习笔记(1)——词典分词_第4张图片

fail 表:fail 表保存的是状态间的一对一关系,存储状态转移失败后应当回退的最佳状态。最佳状态指的是能记住已匹配上的字符串的最长后缀的那个状态(如下图,匹配 she 后来到状态 5 ,再来一个字符,goto 失败,当前匹配到的字符串为 she,最长后缀为 he,对应路径 0-1-2,因此,状态 2 就是状态 5 fail 的最佳选择)。

自然语言处理学习笔记(1)——词典分词_第5张图片

4. 基于双数组字典树的AC自动机(ACDAT)(P67)

  • 原理:AC自动机的 goto 表本身就是一颗字典树,可以用双数组字典树来替换 goto 表。ACDAT 的构建原理就是为每个状态( base[i]和check[i] )构建 output [i] [] 和 fail [i]。

    具体来说,分以下三步:

    (1)构建一颗普通的字典树,让终止节点记住对应模式串的字典序;

    (2)构建双数组字典树,在将

你可能感兴趣的:(自然语言处理,自然语言处理,nlp)