1

3 日前、私は 3 つの言語を持つ並列辞書の構築について質問しました:いくつかのテキスト ペアの相違点を削除します

質問は次のとおりです。次の特性を持つ 2 つのファイル ペアがあります。

これらのペアの各ファイル間には、行ごとの対応があります。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) に現れる共通の単語を見つけ、対応する翻訳を除外することでした。要するに、英語-アラビア語と英語フランス語の 2 つのバイリンガル辞書を使用して、3 か国語の英語-アラビア語-フランス語辞書を構築しようとしていると言えます。

スティーブは私に答えて、重複した英単語を見つけて他の単語とその翻訳を削除するための素敵なコードを書きました:答えはここにあります

しかし、もう少し複雑な質問があります。別の言語を追加したい場合はどうすればよいですか? つまり、別の英露辞書 (File5.txt には英語のエンティティが含まれ、File6.txt にはロシア語のエンティティが含まれているとします) があり、3 言語の辞書ではなく 4 言語の辞書を作成したいと考えています。

1 つの方法は、現在のコードを使用して 3 言語の辞書を作成し、それを新しい言語ペアで再実行して 4 言語の辞書を作成することです。しかし、それは十分に効率的ではないと思います。この問題のより良い解決策になるでしょう。また、他の言語でいくつかの矛盾が生じる可能性があります。私の主な課題は、重複をチェックすることです。言語ペアが 2 つしかない場合、重複をチェックするのは非常に簡単です。しかし、3 組の重複を確認したい場合はどうすればよいでしょうか。1 回のパスで 4language 辞書を抽出できるようにコードを変更するにはどうすればよいですか?

4

2 に答える 2

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適切な方法で出力します。

于 2012-06-23T10:46:55.477 に答える
0

Perl はわかりませんが、ハッシュ マップを使用します。言語ごとに 2 つのハッシュ マップ。すべての辞書で機能する意味のグローバル識別子 (中間言語)。したがって、英語の単語 x には id1 があり、アラビア語の id1 は単語 y です。したがって、1 つのハッシュ マップは単語をグローバル識別子にマップし、もう 1 つのハッシュ マップはグローバル識別子を実際の単語にマップします。したがって、2 つのハッシュマップ呼び出し (dict1.get(word):id dict2ID.get(id)) を使用して、すべての単語をある言語から別の言語に翻訳できます。

より簡単な解決策が必要な場合は、中間言語として英語を使用してください。ただし、それらの辞書には間違いがいくつかあります。

新しい辞書を追加するのは簡単です。その言語の英語を含むファイルを取得し、english2intermediate ハッシュ マップを使用して新しい言語の識別子を取得するだけです。

于 2012-06-23T23:12:55.477 に答える