【问题标题】:How to extract matching strings into a defaultdict(set)? Python如何将匹配的字符串提取到 defaultdict(set) 中? Python
【发布时间】: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


【解决方案1】:

这种方式可以正常工作,但我会稍有不同,使用list 而不是set,这样我们就可以正确排序单词(set 将按字母顺序输出单词,而不是我们想要的) :

文件:q_15125575.py

#-*- encoding: utf8 -*-
from collections import defaultdict

INPUT = """you have requested a debate on this subject in the course of the next few days , during this part-session . {##} sus señorías han solicitado un debate sobre el tema para los próximos días , en el curso de este período de sesiones . {##} 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"""

if __name__ == "__main__":
    english, spanish, trans = INPUT.split(" {##} ")
    eng_words = english.split(' ')
    spa_words = spanish.split(' ')
    transtable = defaultdict(list)
    for e, s in [i.split('-') for i in trans.split(' ')]:
        transtable[eng_words[int(e)]].append(spa_words[int(s)])

    print(transtable['course'])
    print(transtable['you'])
    print(" ".join(transtable['course']))
    print(" ".join(transtable['you']))

输出:
['光标']
['sus', 'se\xc3\xb1or\xc3\xadas']
光标
sus señorías

代码稍长,因为我使用的是实际单词而不是索引 - 但这允许您直接从 transtable 查找

但是,你的方法和我的方法都在同一个问题上失败:重复单词。
print(" ".join(transtable['this'])
给:
el este
至少按照单词出现的顺序,所以它是可行的。想要翻译第一次出现的'this'
transtable['this'][0] 会给你第一个字。

并使用您的代码:

tt = defaultdict(set)
for e, s in [i.split('-') for i in trans.split(' ')]:
    tt[int(e)].add(int(s))

query = 'this'
for i in tt[eng_words.index(query)]:
    print i

给:
7

您的代码将只打印一个单词第一次出现的索引。

【讨论】:

  • 您在问题中的代码甚至无法正常工作,它有很多错误。您正在向 tt{} 添加字符串(例如,tt[s].add(t) 将给出 tt['0'] = '1')。然后,当您获取索引时,您是从原始字符串eng 中获取它,而不是从拆分词中获取它。这个索引是一个数字,而不是字符串,所以它总是什么都不返回。如果将其更改为tt[int(s)].add(int(t)),下一个问题是它会失败,因为spanish.split(" ") 需要一个整数,而不是一个集合。最后,(假设eng 是拆分词),eng.index(query) 仍然只会返回第一个结果。
  • 感谢您注意到缺少的代码,我会把完整的代码放上来。 =)
猜你喜欢
  • 2019-03-14
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
相关资源
最近更新 更多