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

标签 linux perl text nlp

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

问题如下: 我有 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)中的常见单词并过滤出它们对应的翻译。 简而言之,我可以说使用英-阿双语词典和英法双语词典,我正在尝试构建一个英-阿-法三语词典。

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

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

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

最佳答案

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

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

关于linux - 如何从双语词典构建 4 种语言词典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11166718/

相关文章:

linux - RPM - 签名后修改包

Linux LowFree 和 Slab

C - 在linux终端中打印希腊字母

mysql - 无法通过从两个不同子程序到新子程序的传递值来执行计算 : Perl

perl - 为什么这个 reduce {} 没有按预期返回最大值?

html - 如何动态更改破折号中的 html.Button 文本?

linux - 使 strlcpy 在 Linux 中可用

使用只有 3 位索引的列表元素的正则表达式替换不能按我预期的那样工作

swift - 按钮上的文字不正确

C# 使用 Lists 读取、写入和搜索文本文件行