在术语列表中对项目进行排序

2024-09-30 05:30:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这样的平行语料库:

parallel_corpus =
one sentence in Italian : one sentence in English
one sentence in Italian : one sentence in English

我有一份双语词汇表

bigram_list =
Difensori dei diritti umani, libertà di espressione > Human rights defenders, freedom of expression

sgomberi forzati, violazioni dei diritti umani > forced evictions, human rights violations

因此双语术语文件中的每一行都包含以“>;”分隔的两种语言的术语

我想要的是,为上面文件中的每一行关联成对的候选翻译(一种语言中的术语与另一种语言中的术语相邻)。因此,对于上面的第一个示例,bigrams将如下所示:

('Difensori dei diritti umani','Human rights defenders')
('Difensori dei diritti umani','freedom of expression')
('libertà di espressione','Human rights defenders')
('libertà di espressione','freedom of expression')

之后我想估计像上面那样的每个二元图的互信息,然后选择高值的二元图。我试过这个密码

for line in bigram_list.splitlines():
    n = 0
    s = 0.001
    a = 0
    b = 0
    c = 0
    d = 0
    mi = ''
    bi= []
    trans = line.split(' > ')
    left =  trans[0].split(', ')
    right = trans[1].split(', ')
    for i in left:
            for j in right:
                    for line in parallel_corpus.splitlines():
                            n += 1
                            if i in line and j in line:
                                    a += 1
                            elif i in line and not j in line:
                                    b+= 1
                            elif j in line and not i in line:
                                    c+= 1
                            else:
                                    d +=1
                    mi = log(((a +s)/n)/(((b+s)/n)*((c+s)/n)))
                    bi.append((i,j,mi)) 
    print (bi)

此代码提供以下输出

[('Difensori dei diritti umani', 'Human rights defenders', 9.747427586368971), ('Difensori dei diritti umani', 'freedom of expression', 4.054309816276213), ('libertà di espressione', 'Human rights defenders', 1.7964873912918353), ('libertà di espressione', 'freedom of expression', 3.5916971873132355)]
[('sgomberi forzati', 'forced evictions', 9.971061859787796), ('sgomberi forzati', 'human rights violations', 5.278014664230184), ('violazioni dei diritti umani', 'forced evictions', 4.3759922075718447), ('violazioni dei diritti umani', 'human rights violations', 2.760410122135915)]

我需要的是对于bigram\u列表中的每一行,如果有具有相同第一个元素的对,请选择一个具有高值的对。例如:在下面的行中

[('Difensori dei diritti umani', 'Human rights defenders', 4.747427586368971), ('Difensori dei diritti umani', 'freedom of expression', 4.054309816276213), ('libertà di espressione', 'Human rights defenders', 3.7964873912918353), ('libertà di espressione', 'freedom of expression', 3.5916971873132355)]

我们有

('Difensori dei diritti umani', 'Human rights defenders', 9.747427586368971)

'Difensori dei diritti umani', 'freedom of expression', 4.054309816276213

因此,我们必须选择第一对,其中包含与第二对相同的第一个元素('Difensori dei diritti umani'),但具有较高的值。你知道吗

有人能帮忙吗?你知道吗


Tags: ofinlinefreedomexpressionhumandirights
1条回答
网友
1楼 · 发布于 2024-09-30 05:30:19

因为您只需要具有相同第一个元素和最大值的pair,所以可以创建一个以first element作为键的字典。您可以遍历元组列表并检查key(元组的第一个元素)是否存在。如果确实如此,则检查该值是否高于字典中的值,如果为真,则替换。你知道吗

下面是与您的示例相关的代码:

temp_dict = {}
for i in a:
    if temp_dict.has_key(i[0]):
        if (temp_dict[i[0]][2] < i[2]):
            temp_dict[i[0]] = i
    else:
        temp_dict[i[0]] = i

迭代示例代码中的两个列表后的输出:

{'violazioni dei diritti umani': ('violazioni dei diritti umani', 'forced evictions', 4.375992207571844), 'Difensori dei diritti umani': ('Difensori dei diritti umani', 'Human rights defenders', 9.747427586368971), 'sgomberi forzati': ('sgomberi forzati', 'forced evictions', 9.971061859787795), 'libert\xc3\xa0 di espressione': ('libert\xc3\xa0 di espressione', 'freedom of expression', 3.5916971873132355)}

Demo of your working code

相关问题 更多 >

    热门问题