小编昨晚被老婆的学英语听力的APP给吸引上了,其中有一个九空格的功能,就是听句子,把空格中的单词补上。琢磨着APP界面上空格和候选词之间的对应关系,小编突然脑洞大开。是否,我不听听力也能把这些候选词填上呢?人工来填空似乎是很费劲的,那么能不能用程序来填空呢?
如果能办到,就说明被切碎、打乱词序的句子还能够还原回来!
下图是可可英语的“听力填词”界面
学习者需要一边听听力,一边从候选项中选择单词进行填空。需要注意的是
1)空格中所缺的单词全部在候选项中
2)候选项中的单词全部是需要的,没有多余的。
好了,开始发挥作为世界上最高级的物种,人类,的聪明才智,想办法!
假定一道题目中,需要填空的单词数是N(通常N为8、9)。那么把N个单词填充到N个空格中,可能的方案数是N的阶乘(N!)。如果能够通过一种方式,把每一种可能的方案都进行打分,选出最优的,就有望能解决问题!
搬来援兵:
怎么对一个胡拼乱凑的句子进行打分呢?
比如 下面两个句子,怎么区分哪一个更好
句子A:
The ban rule need month and the there court expired was now no last to said on it
句子B:
The ban expired last need and the month said there was now no court to rule on it
这两个句子显然都不对,不通顺,但是肉眼来看,貌似句子B比句子A要靠谱那么一点点呢!但是程序怎么来判断这一点呢?怎么破?
晴天霹雳一声巨响,上帝给人类送来了语言模型!
语言模型就是用来计算一个句子的概率的模型,即P(W1,W2,...Wk)。利用语言模型,可以确定哪个词序列的可能性更大,或者给定若干个词,可以预测下一个最可能出现的词语。
既然说到这么牛逼闪闪的数学工具,咱们还是去请老师给大家做一下科普
关于语言模型的科普
1)、语言模型是用来计算一个句子的概率的模型,如果用S表述句子,那么就是P(S)。或者用单词来表示句子,那么就是P(W1,W2,...Wn)。使用概率论中联合概率的概念,可以展开成如下的形式
2)、语言模型有什么用途
机器翻译:P(high winds tonight | 今晚有大风) > P(large winds tonight | 今晚有大风)
拼写纠错/语法纠错/Query 改写:P(about fifteen minutes from) > P(about fifteen minuets from)
音字转换:P(机器翻译及其应用激起了人们极其浓厚的学习兴趣 | ji qi fan yi ji qi ying yong ji qi le ren men ji qi nong hou de xue xi xing qu) > P(机器翻译机器应用激起了人们极其浓厚的学习兴趣 | ji qi fan yi ji qi ying yong ji qi le ren men ji qi nong hou de xue xi xing qu)
其他:非常多哦
请语言模型出山。
训练自己的语言模型
咱们使用Kenlm来训练,这是一个久经考验的开源语言模型工具,最大的优点是“快”,和RNN训练的语言模型对比过,模型进行打分时,Kenlm判断“非常快”,而RNN的语言模型速度“不能忍”。
1、 语料获取及预处理
1 billion words
https://github.com/ciprian-chelba/1-billion-word-language-modeling-benchmark
下载其 training-monolingual 语料 并使用get_data脚本进行tokenize和shuffle( 不清楚shuffle对于语言模型有多大影响)
2、训练
传统方法 kenlm
https://kheafield.com/code/kenlm/
nohup /kenlm/build/bin/lmplz -o 5 <./training-monolingual.tokenized.shuffled/all > lm.arpa &
注意,咱们训练的是Ngram(N=5),具体什么是Ngram,以后有机会再给大家介绍。
好了,训练好的语言模型怎么用来对句子打分呢?
import kenlm
model = kenlm.LanguageModel('path/to/model/lm_model.bin') # 5gram
model.score(s)
是不是很简单!
等不及了,说干就好,下面开始动手!
上代码
代码请在本文末尾点击阅读原文获取,托管在百度网盘
见证奇迹
可以看到,最优的句子是
The ban expired last month and the court said there was now no need to rule on it
完全正确!
对比一下
小编棒不棒?点个赞呗!