深度学习与中文分词

大家好,本来我是打算经常更新这里的文章的,但是事情好像总是很多,最近受了一位朋友的影响,更觉得要握紧时间了。下面进入正题:

什么是中文分词?

根据宗成庆老师所著的《统计自然语言处理》中的描述:由于词是语言的能够独立运用的最小语言单位,所以计算机在对自然语言进行处理之前,都要进行分词的处理。 而在很多西方语言中,词与词之间是有空格之类的显著的区别标志,这使得分词的工作较为轻松。 而在汉语的很多语言中,词与词之间没有明显的界限,自动分词技术称为了很多自然语言处理的基本环节,同时这可以认为是一个尚未完全解决的问题。

为什么是深度学习?

随着深度学习的发展,越来越多的项目开始拥抱深度学习,中文分词这个课题也不例外。为了让我们对这个演变的过程有个清晰的认识,所以姑且在此把中文分词分为3个阶段。

第一个阶段是完全基于词典的分词(机械分词),这个阶段的分词效果很差,对于歧义不能很好的识别,需要有一份预置的词典,词典的粒度不容易控制,但是,分词速度很快,在此期间诞生了很多优秀的基于词典的匹配算法(如前向最大匹配算法)。

第二个阶段是引入机器学习中的基于N-Gram语言模型训练的时间序列模型(如HMM)。 值得一提的是,Nianwen Xue老师在Chinese Word Segmentation as Character Tagging提出的基于字标注的模型,被后续至今的几乎所有的模型采用。著名的开源项目jieba中,是在机械分词的基础上,引入了HMM模型对于连续的单字进行处理以提升效果。之所以说是引入,是由于以下的几个原因导致了这个阶段的时间序列模型多数会和中文分词结合使用,才能达到更好的效果。

由于N-Gram模型的限制,训练语料中远处的信息被未能得到利用,对于一些语义歧义不能很好的判断。
时间序列中的参数矩阵规模较大,难以训练,统一分词标准的大规模训练语料难以获取,人工标注代价很高。
第三个阶段是近期兴起的仍在前行的尚未大规模应用的基于RNN的分词模型。因为上述的机器学习中的训练语料中的远处信息未能得到利用,关于这一问题,可以参考邱锡鹏教授在Long Short-Term Memory Neural Networks for Chinese Word Segmentation提出的经典的例子:

  • 冬 天 (winter), 能 (can) 穿 (wear) 多 少 (amount) 穿 (wear) 多少 (amount);夏天 (summer),能 (can) 穿 (wear) 多 (more) 少 (little) 穿 (wear) 多 (more) 少 (little)。

RNN在理论上可以解决这个问题,可是由于梯度消失的问题,一般的RNN充分训练较为困难,而其变种LSTM在此方面工作的较为出色。关于LSTM的工作原理,可以参考这篇著名的文章Understanding LSTM Networks。

字嵌入+双向LSTM+CRF的模型

在这里,我们介绍一种目前较为流行的基于字标注的字向量+双向LSTM+CRF的模型,模型如下所示:

图片来自于邱锡鹏教授近期的论文Adversarial Multi-Criteria Learning for Chinese Word Segmentation。

可以看到,针对待分词的语句,将其每个字都转换为字向量,转换的方式可以使用Word2vec,也可以使用一些其他的向量化模型,而且这个向量化模型可以是通用的,不必针对训练语料单独训练一个向量化模型。并且LSTM模型的输入一般是固定长度的,我们需要定义一个固定的长度,对小于/大于这个长度的输入,进行填充/截断,这个长度一般为120以内,因为现在大部分模型,都难以处理超过120的输入。

在得到固定长度的字向量之后,将其作为BiLSTM的输入,LSTM开始训练,得到每个词在字标注上概率分布,再根据CRF模型,得到最终的字标注结果。

在参考了一些开源项目的情况下,我已经基于Tensoflow使用Python接口实现了这个模型,并在公司内部得到了使用,训练语料包括一些公开的如SIGHAN上的语料,还包括一些购买的语料。由于公司的信息安全的规定,目前还未能公开所有的代码及语料。

目前存在的问题

事情不总是一帆风顺的,深度学习提升了分词的效果,但是也有一些问题,根据理论和一些实际的经验,在此我认为的列出:

  • 需要更大规模的训练语料,难以获取。
  • 距离较远的词的信息更加难以学习,训练时间更长。
  • 就分词而言,更远距离的词,对分词结果影响没有想象的大。
  • 模型的分词性能较为一般。