我有一个格式为
的并行语料库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
答案 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)