繁体   English   中英

消除多单词字符串列表中的重复项

[英]get rid of duplicates in list of multi word strings

我有一个平行的语料库,格式为

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))

此给出以下输出

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

下一步是计算上述每对中的频率。 为此,我必须为每一对分别分开源语言和目标语言,即

('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àdi espression”),我将为平行语料库中的每一行知道“表达自由”多少次。和“自由表达”共同发生,只有“表达自由”发生多少次,只有“自由表达”发生多少次,而没有一次发生。

这是我的尝试

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

您实际上不必遍历所有复杂的代码即可转换为字符串和列表。 使用python可以提供更多的功能。

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

现在english_words现在是从双字母组提取的一组无序的唯一单词(说无序的,因为您不保证它们以存储的顺序出现)

现在打印english_words将产生:

expression liberty
human rights

编辑:问题的第二部分

您编写的提取频率的代码应该可以工作,但是并不需要太复杂。 您已经从平行语料库制作了双字母组,这意味着您已经拥有了从平行语料库到友好格式的所有内容; 元组列表。

作为进行计数统计的一般做法,您将创建一个字典(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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM