波兰-中文语料库构建之篇章对齐

1 篇文章 0 订阅
1 篇文章 0 订阅

摘要:

本文通过爬取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个对应一个句子的情况。可以细化程序,找出最优情况

 

    

                                            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值