小实验|被切碎、打乱词序的句子还能够还原回来?是的,你没有听错





   “句子重建”小实验

小编昨晚被老婆的学英语听力的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

完全正确!

对比一下


小编棒不棒?点个呗!



私房文章*海量资料*关注我





点击下方“阅读原文”获得 本文源码网盘下载地址↓↓↓


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值