摘要:
本文通过爬取ted.com和谷歌翻译,通过计算句子语义相似度进行篇章对齐
1.爬取ted.com
1.1 爬出有波兰语字幕演讲所有url
1.2 判断有波兰语字幕的url是否有中文简体字幕,若有则爬下网页正则提取出中文和波兰语字幕
中文字幕命名为10xxcn.txt,对应波兰字幕命名为10xxpl.txt
2.爬谷歌翻译
2.1 把上面爬取的波兰字幕翻译为中文,由于谷歌翻译每次只能限制在5000个字符,所以分次爬取再合并
3. 使用语义相似度进行篇章下句子对齐
文本爬取下来已经是篇章对齐,所以只需要篇章内部做句子对齐
3.1 句子语义相似度实验:
计算语义相似度有很多算法,试过几种后决定采用jaccard算法,这个算法感觉已经可以满足基本要求,如果想进一步提升效果还可以用word2vec。下面是用jaccard进行的测试
篇章对齐文章,句子语义相似度平均得分:0.3777 0.379 (接近0.4)
篇章不齐文章,平均得分:0.1241 0.17 0.088546 0.1199(基本不高于0.2)
3.2 算法内容:
我一开始想判断句子相似度,如果小于0.2就认定为可能错误对应的句子,但是观察之后发现google 翻译在小语种上的表现并没有那么出色,他有时候翻译得并不对,即使句子对应正确,得分可能还是低于0.2,而且句子没对应上得分高于0.2分的也时存在的。所以我的思路是不仅仅看当前单词,还根据该后面2个句子来判断它是否对应上:
首先是阈值确定,测试得到:如果3个句子都是对应上的,他们的得分和会在1分左右波动,而如果3句都对应不上的,得分和通常在0.1,0.2徘徊。我一开始设定阈值1即如果3个句子他们得分低于1分,则进入判断,判断它是否真的对应错了,以及怎么对应错了,判断程序下述。
经过实验,阈值取0.5反而有更好的结果,因为2篇文章前面的句子对齐,到开始不齐的交接,往往是其中一个语言把2个句子合并为一个句子,然后后面就开始乱了。这种2个句子对应一个句子的语义相似度一般能够有0.1-0.2,完全对不上的一般低于0.1,所以0.5已经足够筛选出出错位置;相反,如果阈值取太大(如1),很可能当前句子没有错误,只是后面最后一个单词没对应上的原因。
3.3 程序分析:
1.将篇章的句子存入2个list中,谷歌翻译出来的篇章命名为goole_list, ted.com爬下来的正确篇章命名为real_list
2.为这2个list分别设定左指针和右指针goo_left=0,goo_right=len(google_list),real_left=0,real_right=len(real_list)
3.取出goo_left,real_left对应句子计算jaccard相似度,再计算他们之后2个句子对应句子相似度(google_list[goo_left+1]和real_list[goo_left+1],google_list[goo_left+2]和real_list[goo_left+1]的相似度)
如果这3个句子相似度和大于0.5,我们有理由相信goo_left,real_left 对应句子是对齐的,那么左右指针各加1,再把这2个句子放入新文本中。
4.如果3个句子相似度和小于0.5,先判断这3个句子之后的3个句子的相似度是否大于0.5,如果是,通过后面的正确来反推前面的正确,goo_left = goo_left+3;real_left = real_left+3
5.如果后面3个句子的相似度小于0.5,那么该句子出错的嫌疑就非常大了,下面判断是否真的出错:
6.正常情况下,主要有3种可能性:(还有其他概率较小的情况,暂不考虑)
1. 该句子对齐了
2. goole译文(或者说波兰语) 把2句并为1句
3. 中文字幕把2个并为1句了
那么我们假设出现了上面的情况并纠正之后,计算该句子后面5个句子的相似度和
如2:计算式子为:
real_left_prob = real_left + 1
goo_left_prob = goo_left + 2
target1 = jaccard_similarity(real[real_left_prob], google[goo_left_prob])
target2 = jaccard_similarity(real[real_left_prob + 1], google[goo_left_prob + 1])
target3 = jaccard_similarity(real[real_left_prob + 2], google[goo_left_prob + 2])
target4 = jaccard_similarity(real[real_left_prob + 3], google[goo_left_prob + 3])
target5 = jaccard_similarity(real[real_left_prob + 4], google[goo_left_prob + 4])
target_sum2 = target1 + target2 + target3 + target4 + target5
求出3种情况得到的结果,选择语义相似度和最大的一种情况进行纠正。
3.4 结果分析
目测效果不错,3句子语义相似度和能在1左右波动;结果文本目测基本可以对应上
4 分析总结
4.1 改进方向
虽然整体对齐效果不错,但是在局部上可能还有一些问题,仍有很大的进步空间。以后还可以进行下面的尝试:
1. 可以换更为语义相似度更为准确的算法,如基于深度学习的word2vec,
亲测对语义相似度得分计算更为准确,但这个算法载入模型时间较长,且我尝试过程中遇到未知的bug,遂放弃
2. 在可以通过大量实验找出最合适阈值(3个句子的相似度和),时间关系此工作未进行
3. 考虑更多产生句子不齐的情况,比如有时候出现3个对应一个句子的情况。可以细化程序,找出最优情况