摆脱多字串列表中的重复

时间:2015-10-15 20:26:28

标签: python

我有一个格式为

的并行语料库
one sentence in English: one sentence in Italian

我有一个从平行语料库中提取的双语术语列表,格式为

terms_list =  expression liberty, human rights > libertà di espression, diritti umani

我想要的是为术语列表中的每一行创建翻译对的双字母组,然后计算每对的统计数据。为了创建对,我尝试了这个

bigrams = []
for line in terms_list.splitlines():
    trans = line.split(' > ')
    for it in trans[0].split(', '):
        for en in trans[1].split(', '):
            bigrams.append((it, en))

Thsi提供以下输出

('expression liberty', 'libertà di espression')
('expression liberty', 'diritti umani')
('human rights', 'libertà di espression')
('human rights', 'diritti umani') 

以下步骤是计算每对上述对的la频率。为此,我必须为每一对分离源语言和目标语言,即对于

('expression liberty', 'libertà di espression')

我必须将'表达自由'与'自由进化'区分开来

为此我使用了这段代码

for i in bigrams:
    one = str([ii for ii in str(i).split("', '")[0][2: ].split('\n')])[2: -2]
    two = str([iii for iii in str(i).split("', '")[1][: -2].split('\n')])[2: -2]
    print (one)

这将给出

expression liberty
expression liberty
human rights
human rights

对于双语对中的每个项目,我必须知道他们在平行语料库中的统计数据,即对于('表达自由','libertàdiespression')我将知道并行语料库中的每一行多少次'表达自由'和'自由'表达'共同发生,只有“表达自由”发生了多少次,只发生了多少次“自由表达”,多少次都没有发生。

这是我的尝试

en = set([x[0] for x in bigrams])
it = set([x[1] for x in bigrams])
a =0
b = 0
c = 0
d =  0

for one in en:
    for two in it:
        for line in parallel_corpus.splitlines():
                    if one in line and two in line:
                            a += 1
                    elif one in line and not two in line:
                            b+= 1
                    elif two in line and not one in line:
                            c+= 1
                    else:
                            d +=1

1 个答案:

答案 0 :(得分:1)

您真的没有必要通过转换为字符串和列表来完成所有复杂的代码。使用python可以提供比这更多的功能。

english_words = set([x[0] for x in bigrams])
italian_words = set([x[1] for x in bigrams])

现在english_words现在是从bigrams中提取的一组无序单词(说无序,因为你不能保证它们按照它们存储的顺序排列)

现在打印english_words将产生:

expression liberty
human rights

修改:问题的第二部分

您编写的用于提取频率的代码应该可以使用,但这并不复杂。你已经从并行语料库中创建了bigrams,这意味着你已经拥有了从平行语料库到友好格式的所有内容;一个元组列表。

作为进行计数统计的一般做法,您可以创建一个字典(hashMap),其中键是您要计算的事物,值是计数本身。然后遍历双字母组列表,如果项目不在字典中,则添加一次,如果它在字典中,则只需增加它的计数器。这是这样的:

en_terms_dict = {}
it_terms_dict = {}
bigrams_dict = {}    
for line in parallel_corpus:
    en, it = line.split(' : ')
    if en in en_terms_dict:
        en_terms_dict[en] += 1
    else:
        en_terms_dict[en] = 1
    if it in it_terms_dict:
        it_terms_dict[it] += 1
    else:
        it_terms_dict[it] = 1
    if (en, it) in bigrams_dict:
        bigrams_dict[(en,it)] += 1
    else:
        bigrams_dict[(en, it)] = 1

现在通过遍历每个词典,您知道每个词的频率。当然,你可以通过减法来推断非长期的频率(我不知道为什么首先要计算一个术语没有出现的频率)

for k, v in en_terms_dict:
    print "the term %s appeared %d times"%(k,v)