对于英文文本数据,我们每天都在为腾讯贡献着聊天记录,或则为百度贡献着搜索记录。而英文文本数据最大的入口,我认为也许是搜狗输入法。那些年看起来,搜狗早已基本统治了英文输入法。PC,Mac,iPhone,安卓都装上了搜狗输入法,甚至码农同学们装上ubuntu后的第一反应也是去装个linux版本的SougouInput(尽管好多bug)。搜狗输入法真的好用LINUX社区,但是越用越顺手,背后一定是数据驱动的算法。
但是我对于把我的所有输入数据,包括各类密码,都不知不觉贡献给了搜狗还是认为不舒服。搜狗完全有能力在我输入我复杂的前半部份密码的时侯手动跳出和推荐我的后半部份密码。据说如今只有iPhone的iOS系统能在辨识出用户输入密码的时侯手动跳转成为苹果自己的(我们窃以为安全的)输入法按键。
Github上有一个日本哥们的projectKyubyong/neural_chinese_transliterator,用seq2seq训练自己的英文拼音输入法。这是这篇博客的主题。我们的代码完全基于这个开源项目,加入了交互式的拼音测试环境。谢谢日本高手!而未来是希望能将这个偏research的项目弄成一个真正可用的产品,一个模型和数据本地化(别把数据上传云端)、根据输入内容自动甚至手动选择预训练模型(想像正在B站发弹幕或则在写结业论文的不同场景)、根据用户输入数据不断更新越来越好用的拼音输入法。我把它姑且称作“搜喵输入法”。
seq2seq模型
拼音输入的本质上就是一个序列到序列的模型:输入拼音序列,输出汉字序列。所以天然适宜用在例如机器翻译的seq2seq模型上。
模型初始输入是一个随机取样的拼音字母的characterembedding,经过一个CBHG的模型,输出是五千个汉字对应的label。
这儿使用的CBHG模块是state-of-art的seq2seq模型,用在Google的机器翻译和语音合成中输入法linux版,结构如下:
图片来自Tacotron:TowardsEnd-to-EndSpeechSynthesis
值得注意的几点:
1.模型先使用一系列的一维频域网路,有一系列的filter,filter_size从1到K,产生一个Conv1DBank。这样的作用相当于使用了一系列的unigrams,bigrams直至K-grams,尽可能多的领到输入序列从local到context的完整信息。虽然这样的模型,与之前我们谈到过的IDCNN(IteratedDilatedConvolutionaryNerualNetwork)有异曲同工之妙。而IDCNN相比较上去有更少的参数,不晓得假如把CBHG的Conv1DBank换成IDCNN是如何的疗效。
2.模型在最终的BiGRU之前加入了多层的HighwayLayers,拿来提取更高层次的特点。HighwayLayers可以理解为加入了原本不相邻层之间的“高速道路”,可以让梯度更好地往前流动;同时又加入一个类似LSTM中门的机制,手动学习这种高速道路的开关和流量。HighwayNetworks和ResidualNetworks、DenseNetworks都是想拉近深度网路中原本相隔很远的层与层之间的距离,使很深的网路也可以比较容易地学习。
3.模型中还使用了BatchNormalization(继ReLU以后你们公认的DL训练方法),ResidualConnection(降低梯度的传播距离),Stride=1的Max-pooling(保证Conv的局部不变性和时间维度的细度)以及一个时尚的BiGRU。Tacotron:TowardsEnd-to-EndSpeechSynthesis这篇文章发表在2017年4月输入法linux版,最潮的DL技术用到了好多。
语料获取
理论上所有的英文文本语料,我们都可以通过xpinyin这样的工具转化为拼音数据。这相当于只要有英文文本,我们就有了带标明的训练数据。
Kyubyong/neural_chinese_transliterator中使用了日本一个研究所的2007-2009的英文新闻语料。我们也可以使用英文维基百科dump和百度百科这样的语料。
再开脑洞,我们可以用所有英文的研究论文作为语料,训练学术版搜喵输入法;
用所有文言古文作为语料linux伊甸园论坛,训练文言文版搜喵输入法;
用所有Bilibili弹幕作为语料,训练网路鬼畜版搜喵输入法;
用所有自己的聊天记录作为语料,训练确切吻合自己语调的搜喵输入法;
等等等等。
模型训练
Clone搜喵输入法项目:
系统要求训练:
1.下载LeipzigChineseCorpus。解压缩,把zho_news_2007-2009_1M-sentences.txt拷贝到data/文件夹。其实你也可以用你自己的英文语料,改成一样的格式,或则更改一下build_corpus.py上面的解析部份.
2.构建拼音-汉字的平行语料。
#python3 build_corpus.py
3.构建辞典和生成训练数据。
#python3 prepro.py
4.训练模型,模型存在log/文件夹中。所有的参数都在hyperparams.py中。假如有好的GPU,可以把Batchsize调大一些。现有的默认参数,一个Epoch要跑一个多小时。
#python3 train.py
命令行输入拼音测试:
运行下边的命令,进行命令行输入拼音的测试
python3 eval.py
假如你不想自己训练数据…