使用perl或python将阿拉伯字符“ا”替换为一个单词中的“a”,而将“ә”替换为另一个单词

2024-10-01 02:29:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要将一个纯文本UTF8文档从R语言改为L语言。不幸的是,这不像汉字音译那么容易。
例如,R到L语言(ا)中的“a”可以是“a”或“ә”,这取决于单词的构成。在

用g、k、e或hamza(گ،ك،ە،ء)表示的单词
我需要把所有的a,o,I,u(ا1548;و1548;ى،)改成拉丁语ә,ѳ,I,ü(称为“软”元音)。
例如,žالەم变成sәlêm,ءۇيي¨زمەن成为sѳzmê

在没有g、k、e或hamza的单词中(گ،1603;،ە،ء)
a,o,i,u变为拉丁字母a,o,i,u(称为“硬”元音)。
例如,الما变为alma,ۇل变为ul,وПا变为orta。在

本质上,
g、k、e或hamza在阿拉伯语中充当发音指南。
在拉丁语中,我需要两组不同的元音,这取决于阿拉伯语中的原始单词。在

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

这是一个统一的例子:U+0633\U+0627\U+0627\U+0644\U+0644\U+06D5\U+0645\U+0648\U+0631\U+062A\U+0627\U+0627\U+0674\U+0674\U+06C7\U+064A\U+0633\U+0648\U+0632\U+0632\U+0645\U+060645\U+0645\U+0627\U+0644\U+0644\U+0644\U+0645\U+0645\U+0627\U+0627\U+06C7\U+0644\U+0644\U+0645\U+06D5\U+06D5\U+\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ѳ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ѳnәlmәl mәl mәtim xәlәr”。在

非常感谢你的帮助。在


Tags: 文档文本语言字母utf8单词ular
3条回答

命令:

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

输出:

^{pr2}$

要使用文件而不是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

我不会说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]
    })
  }
})

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

以下是不使用回调的方法(如果Javascript中的字符串是可变的):

^{pr2}$

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


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

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

相关问题 更多 >