汉语错别字检查、词组建议的一个方案

  1. 背景
  2. 汉字的数字化
    1. 实数向量 One-hot Representation
    2. 词向量 Distributed Representation
  3. 模型
    1. 语言模型
    2. N-gram neural model
    3. Continuous Bag-of-Words model(CBOW)
    4. Skip-gram model
  4. PaddlePaddle
    1. Paddle Book
    2. Paddle Models
  5. 语言处理
    1. 如何判断词组的搭配合理性?
    2. 学习过程
  6. 交互流程
  7. 覆盖的端
  8. 参考

本文针对的是汉语错别字检查,或者为写作者提供建议词汇组合的一个方案。

背景

故事的背景,从新华社的一篇不论是浏览量还是评论量奇高的新闻稿件(公众号文章)说起。

废黜与废除
$$图1,搜狗输入法发布的“权威错别字”$$

我们假定新华社这么多位编辑想输入的是“废黜”,其实他们也确实想这么做,用机器学习的方式指出他们的错误之处,我们还需要知道“废黜”跟“废除”的相关性。

汉语词语正确性,都是相对的正确性。汉语词组从语境中独立出来看,没有绝对的错误。所以讨论就应该是这个词在当前句子中的正确性。

汉字的数字化

为了做这样的比较,我们往往先要把词表示成计算机适合处理的方式。即自然语言理解的问题转化为机器学习的问题,第一步把这些符号数字化。

实数向量 One-hot Representation

NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representation,把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。

示例:

沙特国王萨勒曼21日宣布,废除王储默罕默德·本·纳伊夫,另立穆罕默德·本·萨勒曼为新任王储。

分词结果,由23个词组成:

沙特 国王 萨勒曼 21日 宣布 废除 王储 穆罕默德 ·  本 · 纳伊夫 , 另立 穆罕默德 · 本 · 萨勒曼 为 新任 王储 。

如下列出了上面两个词的编码为:

理论上将,这种编辑都容易混淆的词,必然被人意识上相似性扰乱,从而影响词在句子中的正确性。然而这两个词对应的One-hot Representations之间的距离度量,无论是欧式距离还是余弦相似度,由于其向量正交,都认为这两个词毫无相关性。

这就是这种表示方法存在一个重要问题:“词汇鸿沟”现象:任意两个词之间都是孤立的,每个词本身的信息量都太小,光从这两个向量中看不出两个词是否有关系。要想精确计算相关性,我们还需要更多的信息——从大量数据里通过机器学习方法归纳出来的知识

词向量 Distributed Representation

在机器学习领域里,各种“知识”被各种模型表示,词向量模型(word embedding model)就是其中的一类。通过词向量模型可将一个 One-hot Representation映射到一个维度更低的实数向量(embedding vector),在这个映射到的实数向量表示中,希望两个语义(或用法)上相似的词对应的词向量“更像”,如废除的废黜的词向量表示:

这样如“废除”和“废黜”的对应词向量的余弦相似度就不再为零了。废除废黜的相似性评估得分:

'score' => float 0.21303
'words' =>
array (size=2)
'word_2' => string '废黜' (length=6)
'word_1' => string '废除' (length=6)

可以看到这两个词的相似性概率,并不算太高。

词向量模型可以是概率模型或神经元网络模型。

此处引用神经网络模型。

基于神经网络的模型不需要计算存储一个在全语料上统计的大表,而是通过学习语义信息得到词向量,因此能很好地解决以上问题。语义信息到词向量的学习过程使用PaddlePaddle完成。

统计学习的三要素:方法 = 模型 + 策略 + 算法

模型

语言模型

在介绍词向量模型之前,我们先来引入一个概念:语言模型。 语言模型旨在为语句的联合概率函数$P(w_1, …, w_T)$建模, 其中$w_i$表示句子中的第i个词。语言模型的目标是,希望模型对有意义的句子赋予大概率,对没意义的句子赋予小概率。 这样的模型可以应用于很多领域,如机器翻译、语音识别、信息检索、词性标注、手写识别等,它们都希望能得到一个连续序列的概率。

以上面的稿件为例,当编辑输入“沙特国王萨勒曼21日宣布,废除王储默罕默德·本·纳伊夫,另立穆罕默德·本·萨勒曼为新任王储。”时,识别引擎至少会提示你是否希望输入”沙特国王萨勒曼21日宣布,废黜王储默罕默德·本·纳伊夫,另立穆罕默德·本·萨勒曼为新任王储。“才是正确的, 因为根据语言模型计算出“废除王储”的概率很低,而与”废黜“近似的,可能引起错误的词中,”废除“会使该句生成的概率最大。

对语言模型的目标概率$P(w_1, …, w_T)$,如果假设文本中每个词都是相互独立的,则整句话的联合概率可以表示为其中所有词语条件概率的乘积,即:
$$\\ P(w_1, …, w_T) = \prod_{t=1}^TP(w_t)$$
然而我们知道语句中的每个词出现的概率都与其前面的词紧密相关, 所以实际上通常用条件概率表示语言模型:
$$\\ P(w_1, …, w_T) = \prod_{t=1}^TP(w_t | w_1, … , w_{t-1})$$

N-gram neural model

在计算语言学中,n-gram是一种重要的文本表示方法,表示一个文本中连续的n个项。基于具体的应用场景,每一项可以是一个字母、单词或者音节。 n-gram模型也是统计语言模型中的一种重要方法,用n-gram训练语言模型时,一般用每个n-gram的历史n-1个词语组成的内容来预测第n个词。

Yoshua Bengio等科学家的著名论文 Neural Probabilistic Language Models 中介绍如何学习一个神经元网络表示的词向量模型。文中的神经概率语言模型(Neural Network Language Model,NNLM)通过一个线性映射和一个非线性隐层连接,同时学习了语言模型和词向量,即通过学习大量语料得到词语的向量表达,通过这些向量得到整个句子的概率。用这种方法学习语言模型可以克服维度灾难(curse of dimensionality),即训练和测试数据不同导致的模型不准。

我们在上文中已经讲到用条件概率建模语言模型,即一句话中第t个词的概率和该句话的前t−1个词相关。可实际上越远的词语其实对该词的影响越小,那么如果考虑一个n-gram, 每个词都只受其前面n-1个词的影响,则有:
$$\\ P(w_1, …, w_T) = \prod_{t=n}^TP(w_t|w_{t-1}, w_{t-2}, …, w_{t-n+1})$$
给定一些真实语料,这些语料中都是有意义的句子,N-gram模型的优化目标则是最大化目标函数:
$$\\ \frac{1}{T}\sum_t f(w_t, w_{t-1}, …, w_{t-n+1};\theta) + R(\theta)$$

其中$f(w_t, w_{t-1}, …, w_{t-n+1})$表示根据历史n-1个词得到当前词$w_t$的条件概率,R(θ)表示参数正则项。

N-gram神经网络模型
$$图2,N-gram神经网络模型$$

上图展示了N-gram神经网络模型,从下往上看,该模型分为以下几个部分:

Continuous Bag-of-Words model(CBOW)

CBOW模型通过一个词的上下文(各N个词)预测当前词。当N=2时,模型如下图所示:

$$图3,CBOW模型$$

具体来说,不考虑上下文的词语输入顺序,CBOW是用上下文词语的词向量的均值来预测当前词。即:
$$\\ context = \frac{x_{t-1} + x_{t-2} + x_{t+1} + x_{t+2}}{4}$$

其中$x_t$为第t个词的词向量,分类分数(score)向量 $z=U*context$,最终的分类y采用softmax,损失函数采用多类分类交叉熵。

Skip-gram model

CBOW的好处是对上下文词语的分布在词向量上进行了平滑,去掉了噪声,因此在小数据集上很有效。而Skip-gram的方法中,用一个词预测其上下文,得到了当前词上下文的很多样本,因此可用于更大的数据集。

$$图4,Skip-gram模型$$

如上图所示,Skip-gram模型的具体做法是,将一个词的词向量映射到2n个词的词向量(2n表示当前输入词的前后各n个词),然后分别通过softmax得到这2n个词的分类损失值之和。

PaddlePaddle

PaddlePaddle的开发工程师介绍,自开源后,在推广方面也是下了大工夫,比如他们做了Book、Modelsl两个项目,让更多人参与到框架的使用过程中。

Paddle Book

Paddle Models

深度学习模型仓库:https://github.com/PaddlePaddle/models

语言处理

句子的处理,词性分析等,使用百度AI提供的自然语言处理相关接口来实现

接口能力 描述
词法分析 分词、词性标注、专名识别
词向量表示 查询词汇的词向量,实现文本的可计算
DNN语言模型接口 中文DNN语言模型接口用于输出切词结果并给出每个词在句子中的概率值,判断一句话是否符合语言表达习惯。
词义相似度接口 输入两个词,得到两个词的相似度结果
短文本相似度接口 短文本相似度接口用来判断两个文本的相似度得分

###Question

如何判断词组的搭配合理性?

汉字数量GB 18030是中华人民共和国现时最新的内码字集,总共收录70244个汉字;

汉语的词组搭配,就像是英文中26个字母的词组一样,只需要判断这个词组即可。
如何在如此多的汉字数量中,有相关组合的词组的词频,这跟英文的词组搭配相似,建立相应的词组词频数据库,用户数据库也作为一部分。

所以这里所说的词组的搭配正确性,都是相对的正确性。汉语词组从语境中独立出来看,没有绝对的错误。所以讨论就应该是这个词在当前句子中的正确性。

学习过程

要想知道该处的”废除“用错了,我们就需要知道”正确的“使用方式。关于新华社新闻正文中包含“废黜“的其他新闻稿件:

同时,也发现因为历史原因,”废黜“与”废除“用错的情况:纽约议员提决议案 将排华法案签署日定为“包容日”中:

 决议案指出,尽管《排华法案》已被废黜,联邦政府也因此道歉,但华裔遭受的伤害永远无法抹去,这段排斥、歧视移民的历史也不应被忘记。

显然法案的弃用,应该使用”废除“。这样错误的稿件就不在学习范围之内了。

上述稿件使用新华网提供的搜索工具获得。

交互流程

与英文不同,中文没有空格作为间隔,判断的前提应该是拿到光标符号截止,上一个符号结束的整句话,先解析其词组部分,然后再分词查询。由此下来,中文错别字的实时检查,耗时应该不会太短,接口的耗时优化会成为重要的一项工作内容。

在web方面,错别字检查服务需要建立在长连接之上,用户在每一步输入结束、打开文档的同时,开始错别字的实时校验。最小的校验单元可以成为一个句子。
先为此准备实时分析并给出相关词的准备工作。

交互流程如下

端、Client、Service

详细的交互内容至少包括:

web:

覆盖的端

要想完成错别字消灭这件事情,就要让不同的端,覆盖到不同编辑发布的平台。web端,浏览器,会是有限考虑的一部分。

参考

使用的流程图、序列图、数学公式来自hexo博客开源插件,非常感谢~

script>