9

プレーンテキストのUTF8ドキュメントをRからL言語、ラテン語に変更する必要があります。残念ながら、文字と文字の音訳ほど簡単ではありません。
たとえば、R to L言語(ا)の「a」は、単語の構成に応じて「a」または「ә」のいずれかになります。

ag、k、e、またはhamza(گ،ك،ە،ء)の単語では、
すべてのa、o、i、u(ا،و،ى،ۇ)をラテン語に変更する必要があります。 ü(「ソフト」母音と呼ばれます)。
例えば。سالەمはsәlêmになり、ءۇيはüyになり、سوزمەنはsѳzmênになります

ag、k、e、またはhamza(گ،ك،ە،ء)
のない単語では、a、o、i、uはラテン文字のa、o、i、u(「ハード」母音と呼ばれます)に変わります。
例えば。الماはalmaになり、ۇلはulになり、ورتاはortaになります。

本質的に
、g、k、e、またはhamzaは、アラビア文字の発音ガイドとして機能します。
ラテン語では、アラビア文字の元の単語に応じて、2つの異なる母音のセットが必要です。

ステップ1として「ソフト」な母音の単語を実行してから、ドキュメントの残りの部分で別の検索と置換を実行する必要があるかもしれないと考えていました。しかし、どうすればこのような検索と置換をperlまたはpythonで実行できますか?

ユニコードの例を次に示します。\U+ 0633 \ U + 0627 \ U + 0644 \ U + 06D5 \ U + 0645 \ U + 0648 \ U + 0631 \ U + 062A \ U + 0627 \ U + 0674 \ U + 06C7 \ U + 064A \ U + 0633 \ U + 0648 \ U + 0632 \ U + 0645 \ U + 06D5 \ U + 0645 \ U + 0627 \ U + 0644 \ U + 0645 \ U + 0627 \ U + 06C7 \ U +0644 \ U + 0645 \ U + 06D5 \ U + 0646 \ U + 0649 \ U + 06AD \ U + 0627 \ U + 062A \ U + 0649 \ U + 0645 \ U + 0634 \ U + 0627 \ U + 0644 \ U + 0642 \ U + 0627 \ U+0631。

「sәlêmortaüysѳzmênalmaulmêningatimxalқar」のように表示されます(注:U + 06ADである文字ڭは、実際には2文字のn + gになり、「-ng」の音になります。 )。「salêmortauysozmênalmaulmêningatimxalқar」や「sәlêmѳrtәüysѳzmênәlmәülmêningәtimxәlқәr」のように表示しないでください。

助けてくれてありがとう。

4

4 に答える 4

4

文字を置換する序数マッピングを使用して独自の変換テーブルを作成できます。文字のセットごとに、(母音用に) 個別のテーブルが必要になります。これは部分的な例にすぎませんが、その方法を理解できるはずです。


他の文字の変換テーブルを指定する必要があることに注意してください。必要に応じて、1 つのアラビア文字を複数のラテン文字に変換することもできます。出力をリクエストと比較すると、変換テーブル内のすべての文字が正しく一致しているように見えます。

import re

s1 = {u'ء',u'ە',u'ك',u'گ'} # g, k, e, hamza

t1 = {ord(u'ا'):u'ә',  # first case
      ord(u'و'):u'ѳ',
      ord(u'ى'):u'i',
      ord(u'ۇ'):u'ü',
      ord(u'ڭ'):u'ng'} # with double

t2 = {ord(u'ا'):u'a',  # second case
      ord(u'و'):u'o',
      ord(u'ى'):u'i',
      ord(u'ۇ'):u'u',
      ord(u'ڭ'):u'ng'} # with double

def subst(word):    
    if any(c in s1 for c in word):
        return word.translate(t1)
    else:
        return word.translate(t2)

s = u'سالەم ورتا ءۇي سوزمەن الما ۇل مەنىڭ اتىم شالقار'

print re.sub(ur'(\S+)', lambda m: subst(m.group(1)), s)

# output:    سәلەم oرتa ءüي سѳزمەن aلمa uل مەنing aتiم شaلقaر

# requested: sәlêm orta üy sѳzmên alma ul mêning atim xalқar
于 2013-01-30T11:12:38.810 に答える
4

指示:

$ echo سالەم ورتا ءۇي سوزمەن الما ۇل مەنىڭ اتىم شالقار | ./arabic-to-latin

出力:

sәlêm orta üy sѳzmên alma ul mêning atim xalқar

stdin/stdout の代わりにファイルを使用するには:

$ ./arabic-to-latin input_file_with_arabic_text_in_utf8 >output_latin_in_utf8

arabic-to-latinファイルの場所:

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use open qw(:std :utf8);
#XXX normalization

sub replace_word {
    my ($word) = @_;
    $_ = $word;
    if (/ء|ە|ك|گ/) { # g, k, e, or hamza in the word
        tr/اوىۇ/әѳiü/; # soft
    } else {
        tr/اوىۇ/aoiu/; # hard
    }
    tr/سلەمرتزنشق/slêmrtznxқ/;
    s/ءüي/üy/g;
    s/ڭ/ng/g;
    $_;
}

while (my $line = <>) {
    $line =~ s/(\w+)/replace_word($1)/ge;
    print $line;
}

arabic-to-latinファイルを実行可能にするには:

$ chmod +x ./arabic-to-latin
于 2013-01-30T14:13:44.760 に答える
0

私はperlやpython(またはアラビア語)を話しませんが、これはあなたが使用できる基本的な考え方です(Javascriptを使用しますが、コールバックに置き換えられた任意の言語に翻訳できるはずです):

//replace [a-z] with the proper unicode range for arabic
input.replace(/[a-z]+/, function(word){
  //replace `[gkeh]` with their arabic equivalents
  if(/[gkeh]/.test(word){
    return word.replace(/./, function(c){
      return withSoftVowels[c]
    })
  }else{
    return word.replace(/./, function(c){
      return withHardVowels[c]
    })
  }
})

つまり、入力を単語に分割し、その単語に特定の文字が含まれているかどうかに基づいて、2つの変換テーブルのいずれかを使用してその単語内の各記号を置き換えます。正規表現は両方に使用できます。または、単語の境界で分割して単語内で置換を行うこともできます(indexOf分岐に相当するものを使用します)。

コールバックなしのアプローチは次のとおりです(Javascriptの文字列が可変である場合):

var words = input.split(' ');
var table;
for(var i=0; i<words.length; i++){
  if(words[i].test([gkeh]){
    table = softTable;
  }else{
    table = hardTable;
  }
  for(var j=0; j<words[i].length; j++){
    if(words[i][j] in table){
      words[i][j]=table[words[i][j]];
    }
  }
}
return words.join(' ');
于 2013-01-30T10:42:32.750 に答える
0

この Python コードは、Jan Dvorak のコードに基づいており、開始点を提供する必要があります。

import re
import codecs

def replace_word(word):
    if re.search(ur'[gkeh]', word):
        # hard vowels
        word = word.replace(u'a', u'ә')
        word = word.replace(u'o', u'ѳ')
        word = word.replace(u'i', u'i')
        word = word.replace(u'u', u'ü')
    else:
        # soft vowels
        word = word.replace(u'a', u'a')
        word = word.replace(u'o', u'o')
        word = word.replace(u'i', u'i')
        word = word.replace(u'u', u'u')
    return word

with codecs.open('input.txt', 'w', 'utf-8') as fh:
    input = fh.read()

output = re.sub(ur'(\S+)', lambda m: replace_word(m.group(1)), input)

with codecs.open('output.txt', 'w', 'utf-8') as fh:
    fh.write(output)
于 2013-01-30T11:00:42.810 に答える