获取句子中的单词索引

时间:2015-02-21 10:29:16

标签: python python-2.7 python-3.x

我有一个平行文字。每行包含源语言(src)和目标语言(tgt)。在src和tgt中,括号之间有一些表达式。该文件看起来像这样

parallel(src('he is a [good man]'),tgt('lui è un [buon uomo]')). 

parallel(src('she is a [good woman]'),tgt('lei è una donna buona')). 

parallel(src('he is a beautiful man]'),tgt('lei è una bella donna')). 

所以在某些行中,括号和其他行之间有表达式,括号之间没有表达式。

我想在每行旁边提取括号中的表达式和src和tgt语言中表达式的第一个单词的位置。 我试过这段代码

with open(file) as fi:
    for line in fi.readlines():
    src = line[12:line.index('tgt')]
    tgt = line[line.index('tgt'): ]
    srcs = src.split()
    tgts = tgt.split()
    ss = ""
    tt = ""
    match = re.search(r"\[(.*?)\]",src)
    if match:
        ss = match.group(1)
    match = re.search(r"\[(.*?)\]",tgt)
    if match:
        tt = match.group(1)

    print line, [[ss, ':', srcs.index('['+ss.split()[0])],[ tt,':', tgts.index('['+tt.split()[0])]]

它适用于括号之间有表达式的行,但对于括号之间没有表达式的行,它会给出错误“IndexError:list index out of range”

预期输出

parallel(src('he is a [good man]'),tgt('lui è un [buon uomo]')). [[good man:3][buon uomo:3]

parallel(src('she is a [good woman]'),tgt('lei è una donna buona')).[[good woman:3][]] 

parallel(src('he is a beautiful man]'),tgt('lei è una bella donna')). [[]:[]]

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

发生错误是因为ss.split确实生成了0个单词的列表。简单的解决方法是:

if not ss or not tt:
    print(line, "[[]:[]]")
else:
    print line, [[ss, ':', srcs.index('['+ss.split()[0])],[ tt,':', tgts.index('['+tt.split()[0])]]

更复杂的解决方法是正确完成,即:

source = '[]'
match = re.search(r"\[(.*?)\]", src)
if match:
    source_phrase = match.group(1)
    tmp = src[:match.start()]
    source_position = len(tmp.split())
    source = "[{}:{}]".format(source_phrase, source_position)

target = '[]'
match = re.search(r"\[(.*?)\]", tgt)
if match:
    target_phrase = match.group(1)
    tmp = tgt[:match.start()]
    target_position = len(tmp.split())
    target = "[{}:{}]".format(target_phrase, target_position)

print line, "[{}: {}]".format(source, target)