[英]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.