【发布时间】:2013-02-14 01:20:40
【问题描述】:
我有一个包含这样行的文本文件(见下文),其中一个英语句子后面跟着一个西班牙语句子和由“{##}”分隔的等效翻译表。 (如果你知道它是giza-pp 的输出)
您已要求在接下来的课程中就该主题进行辩论 几天,在这部分会议期间。 {##} sus señorías han solicitado 联合国辩论 sobre el tema para los próximos días , en el curso de este 会议期间。 {##} 0-0 0-1 1-2 2-3 3-4 4-5 5-6 6-7 7-8 8-9 12-10 13-11 14-11 15-12 16-13 17-14 9-15 10-16 11-17 18-18 17-19 19-21 20-22
翻译表这样理解,0-0 0-1表示英文第0个单词(即you)匹配西班牙语第0个和第1个单词(即sus señorías)
假设我想知道句子中course在西班牙语中的翻译是什么,通常我会这样做:
from collections import defaultdict
eng, spa, trans = x.split(" {##} ")
tt = defaultdict(set)
for s,t in [i.split("-") for i in trans.split(" ")]:
tt[s].add(t)
query = 'course'
for i in spa.split(" ")[tt[eng.index(query)]]:
print i
有没有一种简单的方法可以做到以上几点?可以regex? line.find()?
经过一些尝试,我必须这样做以解决许多其他问题,例如 MWE 和缺少翻译:
def getTranslation(gizaline,query):
src, trg, trans = gizaline.split(" {##} ")
tt = defaultdict(set)
for s,t in [i.split("-") for i in trans.split(" ")]:
tt[int(s)].add(int(t))
try:
query_translated =[trg.split(" ")[i] for i in tt[src.split(" ").index(query)]]
except ValueError:
for i in src.split(" "):
if "-"+query or query+"-" in i:
query = i
break
query_translated =[trg.split(" ")[i] for i in tt[src.split(" ").index(query)]]
if len(query_translated) > 0:
return ":".join(query_translated)
else:
return "#NULL"
【问题讨论】:
-
感谢您对错误的说明。可能有人可能有更简单或至少更快的方法=)
-
您有什么特别需要
defaultdict(set)的原因吗? -
其实
defaultdict(list)也可以,只是想要一套这样我就不会重复了。 -
我会使用
list只是因为它可以让您保持秩序,set不会这样做。至于重复,它们可能是有益的 - 它们向您显示单词在西班牙语中出现的顺序,甚至考虑到语法变化。如果您不允许重复,则每个翻译只会出现一次,并且没有顺序 - 这意味着您不知道哪个翻译是正确的。
标签: python string translation text-alignment defaultdict