9

我需要将纯文本 UTF8 文档从 R 语言更改为 L 语言到拉丁语。不幸的是,它不像字符-字符音译那么容易。
例如,R 到 L 语言 (ا) 中的“a”可以是“a”或“ә”,具体取决于单词的组成。

在带有 ag、k、e 或 hamza(گ،ك،ە، ء)的单词中,
我需要将所有 a、o、i、u(ا،و،ى،ۇ)更改为拉丁文 ә、ѳ、i、 ü(称为“软”元音)。
例如。سالەم 变成 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 充当阿拉伯语脚本中的发音指南。
在拉丁语中,我需要两组不同的元音,具体取决于阿拉伯语脚本中的原始单词。

我在想我可能需要将“软”元音词作为第一步,然后对文档的其余部分进行单独的查找和替换。但是,我如何使用 perl 或 python 进行这样的查找和替换?

这是一个 unicode 示例: \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êm orta üy sѳzmên alma ul mêning atim xalқar”。(注意:字母 ڭ,即 U+06AD 实际上以两个字母 n+g 结尾,发出“-ng”音)。它不应该看起来像“salêm orta uy sozmên alma ul mêning atim xalқar”,也不应该像“sәlêm ѳrtә üy sѳzmên әlmә ül mêning әtim xәlқәr”。

非常感谢任何帮助。

4

4 回答 4

4

您可以使用序数映射构建自己的翻译表来替换字符,对于每组字符,您需要一个单独的表(用于元音)。这只是一个部分示例,但应该让您知道如何去做。


请注意,您需要为其他字符指定转换表。如果需要,您还可以将一个阿拉伯字符翻译成多个拉丁字符。如果您将输出与您的请求进行比较,似乎翻译表中的所有字符都正确匹配。

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

要使用文件而不是标准输入/标准输出:

$ ./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]
    })
  }
})

也就是说,将输入拆分为单词,然后根据该单词是否包含特定字符,使用两个翻译表之一替换该单词中的每个符号。正则表达式可用于两者,或者您可以按单词边界拆分并在单词内进行替换(同时使用等效的indexOffor 分支)。

这是没有回调的方法(如果 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 回答