如何从双语词典中构建4种语言词典

时间:2012-06-23 03:56:39

标签: linux perl text nlp

3天前我问了一个关于构建一个有三种语言的并行字典的问题:removing differencies of some text pairs

问题如下:  我有两对文件,具有以下特征:pair1:(File1.txt,File2.txt)pair2:(File3.txt,File4.txt)

这些对中的每个文件之间存在逐行对应关系。假设File1.txt和File3.txt是一些英文单词,File2.txt和File4.txt分别是他们的阿拉伯语和法语翻译。另外,File1.txt和File3.txt非常相似(在某些情况下也是如此)。


    File1.txt       File2.txt
    EnWord1         ArTrans1
    EnWord2         ArTrans2
    EnWord3         ArTrans3
    Enword4         ArTrans4

    File3.txt       File4.txt
    EnWord1         FrTrans1
    EnWord3         FrTrans3
    Enword4         FrTrans4
    Enword5         FrTrans5

我想要做的是比较两对的英文边,找到两个文件中出现的常用词(EnWord1,EnWord3和EnWord4)并过滤掉它们相应的翻译。 简而言之,我可以说使用两种双语英语 - 阿拉伯语和英语法语词典,我正在尝试建立一个3种语言的英语 - 阿拉伯语 - 法语词典。

史蒂夫回答我并写了一个很好的代码来查找重复的英文单词并删除其他单词及其翻译:The answer could be found here

但我还有一个更复杂的问题: 如果我想添加其他语言,我该怎么办?我的意思是我有另一个英语 - 俄语词典(Say File5.txt包含英文实体,File6.txt包含俄语实体),我想建立一个4种语言的词典而不是3种语言的词典。

一种方法是使用当前代码构建3种语言的字典,然后通过在新的语言对上重新运行它,构建一个4种语言的字典。但我觉得它不够有效,而且对这个问题更好的解决方案。它也可能会引起其他语言的一些不一致。 我的主要挑战是检查重复:当只有2个语言对时,检查重复将非常容易。但是,如果我想检查3对中的重复,我该怎么办? 如何更改代码才能在一次传递中提取4种语言字典?

2 个答案:

答案 0 :(得分:1)

我将描述一种我将在此任务中使用的通用方法。

1)定义%dictionary哈希。此哈希的每个键都是英语单词,而每个值又是对包含该单词'翻译的另一个哈希的引用。像这样:

my %dictionary = ( 
  'EnWord1' => { 
     arabic => 'Arabic EnWord1', 
     french => 'French EnWord1',
     ...
  },
  ...
);

(在我们开始处理文件之前,这个哈希将为空,我只是在这里显示一个结构。)

2)同时扫描每对文件,在此哈希中添加相应的记录。有一个简单的方法:

my %filenames = (
  'arabic' => ['File1.txt', 'File2.txt'],
  'french' => ['File3.txt', 'File4.txt'],
  ...
);

for my $lang (keys %filenames) {
  open my $efh, '<', $filenames{$lang}[0] or die $!, "\n";
  open my $tfh, '<', $filenames{$lang}[1] or die $!, "\n";
  while (<$efh>) {
    chomp(my $enLine = $_);
    chomp(my $trLine = <$tfh>);
    $dictionary{$enLine}{$lang} = $trLine;
  }
}

3)优化%dictionary:只保留那些已扫描所有语言的翻译元素......

my $proper_translations_count = scalar keys %filenames;
for my $word (keys %dictionary) {
  my $translations = $dictionary{$word};
  if (scalar keys %$translations != $translations_count) {
    delete $dictionary{$word};
  }
}

4)以任何合适的方式输出%dictionary

答案 1 :(得分:0)

我不知道Perl,但我会使用哈希映射。 每种语言的2个哈希映射。 意义的全局标识符(中间语言),适用于所有词典。所以英语单词x有id1,而阿拉伯语中的id1是单词y。 因此,一个哈希映射将字映射到全局标识符,另一个哈希映射将全局标识符映射到实际字。所以你可以通过2个hashmap调用将每个单词从一种语言翻译成另一种语言(dict1.get(word):id dict2ID.get(id))

如果您想要一个更简单的解决方案,请使用英语作为您的中间语言,但随后您将在这些词典中出现错误。

添加新词典会很容易。您只需获得该语言的英语文件,并使用english2intermediate哈希映射来获取新语言的标识符。