如何将阿拉伯语字母映射到Python中的音素?

如何将阿拉伯语字母映射到Python中的音素?,python,unicode,arabic,phonetics,grapheme,Python,Unicode,Arabic,Phonetics,Grapheme,我想制作一个简单的Python脚本,将每个阿拉伯字母映射为音素声音符号。我有一个文件,其中包含一组单词,脚本将读取这些单词以将其转换为音素,我的代码中有以下词典: ar_let_phon_maplist = {u'ﺍ':'A:', u'ﺏ':'B', u'ﺕ':'T', u'ﺙ':'TH', u'ﺝ':'J', u'ﺡ':'H', u'ﺥ':'KH', u'ﻩ':'H', u'ﻉ':'(ayn) ’', u'ﻍ':'GH', u'ﻑ':'F', u'ﻕ':'q', u'ﺹ':u'ṣ', u'ﺽ'

我想制作一个简单的Python脚本,将每个阿拉伯字母映射为音素声音符号。我有一个文件,其中包含一组单词,脚本将读取这些单词以将其转换为音素,我的代码中有以下词典:

ar_let_phon_maplist = {u'ﺍ':'A:', u'ﺏ':'B', u'ﺕ':'T', u'ﺙ':'TH', u'ﺝ':'J', u'ﺡ':'H', u'ﺥ':'KH', u'ﻩ':'H', u'ﻉ':'(ayn) ’', u'ﻍ':'GH', u'ﻑ':'F', u'ﻕ':'q', u'ﺹ':u'ṣ', u'ﺽ':u'ḍ', u'ﺩ':'D', u'ﺫ':'DH', u'ﻁ':u'ṭ', u'ﻙ':'K', u'ﻡ':'M', u'ﻥ':'N', u'ﻝ':'L', u'ﻱ':'Y', u'ﺱ':'S', u'ﺵ':'SH', u'ﻅ':u'ẓ', u'ﺯ':'Z', u'ﻭ':'W', u'ﺭ':'R'}
我的
.txt
文件中的内容:

السلام عليكم
السلام عليكم و رحمة الله
السلام عليكم و رحمة الله و بركاته
الحمد لله
كيف حالك
كيف الحال
我的代码中的字典:

ar_let_phon_maplist = {u'ﺍ':'A:', u'ﺏ':'B', u'ﺕ':'T', u'ﺙ':'TH', u'ﺝ':'J', u'ﺡ':'H', u'ﺥ':'KH', u'ﻩ':'H', u'ﻉ':'(ayn) ’', u'ﻍ':'GH', u'ﻑ':'F', u'ﻕ':'q', u'ﺹ':u'ṣ', u'ﺽ':u'ḍ', u'ﺩ':'D', u'ﺫ':'DH', u'ﻁ':u'ṭ', u'ﻙ':'K', u'ﻡ':'M', u'ﻥ':'N', u'ﻝ':'L', u'ﻱ':'Y', u'ﺱ':'S', u'ﺵ':'SH', u'ﻅ':u'ẓ', u'ﺯ':'Z', u'ﻭ':'W', u'ﺭ':'R'}
我有一个嵌套循环,我在其中读取每一行,转换每个字符:

with codecs.open(sys.argv[1], 'r', encoding='utf-8') as file:
        lines = file.readlines()

line_counter = 0

for line in lines:
        print "Phonetics In Line " + str(line_counter)
        print line + " ",
        for word in line:
                for character in word:
                        if character == '\n':
                                print ""
                        elif character == ' ':
                                print "  "
                        else:
                                print ar_let_phon_maplist[character] + " ",
line_counter +=1
这就是我得到的错误:

Phonetics In Line 0
السلام عليكم

Traceback (most recent call last):
  File "grapheme2phoneme.py", line 25, in <module>
    print ar_let_phon_maplist[character] + " ",
KeyError: u'\u0627'
我得到的结果是:

words.txt: UTF-8 Unicode text
这个问题的任何解决方案,为什么它不映射到字典中的Unicode对象,因为我在
ar\u let\u phon\u maplist[character]
行中用作键的字符也是Unicode?
我的代码有什么问题吗?

看起来你把那个字符忘在字典里了。您有
u'\ufe8d'
,阿拉伯语字母ALEF独立形式),看起来很相似,但你没有
ا
u'\u0627'
,阿拉伯语字母ALEF)。

首先吸引眼球的是
KeyError
。所以,您的词典根本不知道文件中遇到的一些符号。展望未来,它不知道任何提交的字符,不仅仅是第一个字符

我们能用它做什么?好的,我们可以将unicode表的阿拉伯段中的所有符号添加到字典中。易于理解的对清楚的没有

如果您想真正理解这种“奇怪”行为的原因,您应该更多地了解Unicode。简言之,有许多字母看起来相似,但序号不同。此外,同一封信有时可以以多种形式呈现。我也是

因此,如果允许我使用Python3.3+,我将按如下方式解决该任务。首先,我将规范化
ar\u let\u phon\u映射列表
字典中的键:

ar_let_phon_maplist = {unicodedata.normalize('NFKD', k): v 
                            for k, v in ar_let_phon_maplist.items()}
然后我们将迭代文件中的行、行中的单词和word中的字符,如下所示:

for index, line in enumerate(lines):
    print('Phonetics in line {0}, total {1} symbols'.format(index, len(line)))
    unknown = []  # Here will be stored symbols that we haven't found in dict
    words = line.split()
    for word in words:
        print(word, ': ', sep='', end='')
        for character in word:
            c = unicodedata.normalize('NFKD', character).casefold()
            try:                
                print(ar_let_phon_maplist[c], sep='', end='')
            except KeyError:
                print('_', sep='', end='')
                if c not in unknown:
                    unknown.append(c)
        print()
    if unknown:
        print('Unrecognized symbols: {0}, total {1} symbols'.format(', '.join(unknown), 
                                                                    len(unknown)))
脚本将生成如下内容:

Phonetics in line 4, total 9 symbols
كيف: KYF
حالك: HA:LK

我想你是对的,但我如何才能将unicode隔离形式转换为普通的unicode?@0x01Brain我不会把它称为不同的“形式”;这只是另一个角色。我刚在字典里放了两个词条。顺便说一句,如果我的答案对你有帮助,请随意投票。那么为什么他们有不同的十六进制值呢?@0x01Brain这是一个完全不同的字符。