如何将阿拉伯字母映射到 Python 中的音素?
How to map Arabic letters to phonemes in Python?
我想制作一个简单的 Python 脚本,将每个阿拉伯字母映射到音素声音符号。我有一个包含一堆单词的文件,脚本将读取这些单词以将它们转换为音素,并且我的代码中有以下字典:
我的 .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'
然后我使用 Linux 命令检查文件类型是否为 UTF-8:
file words.txt
我得到的输出:
words.txt: UTF-8 Unicode text
这个问题的任何解决方案,为什么它不映射到字典中的 Unicode 对象,因为我在 ar_let_phon_maplist[character]
行中用作键的字符也是 Unicode?
我的代码有问题吗?
你好像忘记了字典里的那个字。你有 ﺍ
(u'\ufe8d'
, ARABIC LETTER ALEF ISOLATED FORM),看起来很相似,但你没有 ا
(u'\u0627'
, ARABIC LETTER ALEF).
首先映入眼帘的是KeyError
。所以你的字典根本不知道文件中遇到的一些符号。展望未来,它不知道任何提交的字符,不仅是第一个。
我们可以用它做什么?好的,我们可以将 unicode table 的阿拉伯语段中的所有符号添加到我们的字典中。简单的?是的。清除?编号
如果你想真正理解这种 'strange' 行为的原因,你应该了解更多关于 Unicode 的知识。简而言之,有很多看起来相似但序号不同的字母。而且,有时同一封信可以以多种形式呈现。所以 comparing unicode characters is .
所以,如果允许我使用 Python 3.3+,我会按如下方式解决任务。首先,我将规范化 ar_let_phon_maplist
字典中的键:
ar_let_phon_maplist = {unicodedata.normalize('NFKD', k): v
for k, v in ar_let_phon_maplist.items()}
然后我们将遍历文件中的行、行中的单词和单词中的字符,如下所示:
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
我想制作一个简单的 Python 脚本,将每个阿拉伯字母映射到音素声音符号。我有一个包含一堆单词的文件,脚本将读取这些单词以将它们转换为音素,并且我的代码中有以下字典:
我的 .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'
然后我使用 Linux 命令检查文件类型是否为 UTF-8:
file words.txt
我得到的输出:
words.txt: UTF-8 Unicode text
这个问题的任何解决方案,为什么它不映射到字典中的 Unicode 对象,因为我在 ar_let_phon_maplist[character]
行中用作键的字符也是 Unicode?
我的代码有问题吗?
你好像忘记了字典里的那个字。你有 ﺍ
(u'\ufe8d'
, ARABIC LETTER ALEF ISOLATED FORM),看起来很相似,但你没有 ا
(u'\u0627'
, ARABIC LETTER ALEF).
首先映入眼帘的是KeyError
。所以你的字典根本不知道文件中遇到的一些符号。展望未来,它不知道任何提交的字符,不仅是第一个。
我们可以用它做什么?好的,我们可以将 unicode table 的阿拉伯语段中的所有符号添加到我们的字典中。简单的?是的。清除?编号
如果你想真正理解这种 'strange' 行为的原因,你应该了解更多关于 Unicode 的知识。简而言之,有很多看起来相似但序号不同的字母。而且,有时同一封信可以以多种形式呈现。所以 comparing unicode characters is
所以,如果允许我使用 Python 3.3+,我会按如下方式解决任务。首先,我将规范化 ar_let_phon_maplist
字典中的键:
ar_let_phon_maplist = {unicodedata.normalize('NFKD', k): v
for k, v in ar_let_phon_maplist.items()}
然后我们将遍历文件中的行、行中的单词和单词中的字符,如下所示:
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