1

3 天前,我问了一个关于构建具有 3 种语言的并行词典的问题:删除一些文本对的差异

问题如下:我有 2 对具有以下特征的文件: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 语种英语-阿拉伯语-法语词典。

史蒂夫回答了我并写了一个很好的代码来查找重复的英语单词并删除其他单词及其翻译:答案可以在这里找到

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

一种方法是使用当前代码构建一个 3 语言词典,然后在新的语言对上重新运行它,构建一个 4 语言词典。但我认为它不够高效,它会更好地解决这个问题。它也可能在其他语言中带来一些不一致。我的主要挑战是检查重复:当只有 2 个语言对时,检查重复将非常容易。但是如果我想检查 3 对中的重复,我该怎么办?如何更改代码以便一次提取 4language 字典?

4

2 回答 2

1

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

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

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

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

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

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) Refine %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以任何合适的方式输出。

于 2012-06-23T10:46:55.477 回答
0

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

如果您想要一个更简单的解决方案,请使用英语作为您的中间语言,但是您会在这些词典中遇到一些错误。

添加新词典将非常容易。您只需获取该语言的英语文件,然后使用 english2intermediate 哈希映射来获取新语言的标识符。

于 2012-06-23T23:12:55.477 回答