用Python的Polyglot库做文字转写

我想从天城文字体文件得到它所支持的字符,字体文件中存储的是图形,而我想得到文本形式,本质上是编码。上篇文章介绍的方法得到了所支持字形的名称,我发现字形名称就是天城文的拉丁字母记号,那么应该可以通过文字转写得到对应的天城文文本。

举个例子,上篇文章中有个字形名称是dKKha,实际表示的是kkha,这是天城文क्ख的拉丁字母转写。क्ख是个合字,根据Python处理天城文的经验一文提供的代码,可得到它由下面几个字符组成:

1
2
3
क b'\\u0915' DEVANAGARI LETTER KA
् b'\\u094d' DEVANAGARI SIGN VIRAMA
ख b'\\u0916' DEVANAGARI LETTER KHA

क的转写是ka,ख的转写是kha,virama符号将ka附着的元音去掉,变成了k,和后面的kha结合便是kkha,那么将kkha转写为天城文便是क्ख。有很多网站可以做拉丁字母和天城文之间的转写。

Python的Polyglot库有文字转写的功能,可参考Transliteration Documentation。参照文档,可通过接口函数得到所支持的语言种类,使用之前要下载相应的语言包,在这里就不赘述了。由于它不支持梵语,所以选择同为使用天城文书写的印地语(Hindi)。下面这段代码测试两种语言之间的转写是否正确:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from polyglot.transliteration import Transliterator
import unicodedata

hindi_text = u"परिवर्तन"
print("Original Hindi word:", hindi_text)
print("Composed by:")
for c in hindi_text:
print(c, c.encode("unicode_escape"), unicodedata.name(c))

trans = Transliterator(source_lang="hi", target_lang="la")
latin_text = trans.transliterate(hindi_text)
print("Hindi trans to Latin:")
print(hindi_text, " -> ", latin_text)

trans = Transliterator(source_lang="la", target_lang="hi")
hindi_text = trans.transliterate(latin_text)

print("\nLatin trans to Hindi:")
print(latin_text, " -> ", hindi_text)
print("Composed by:")
for c in hindi_text:
print(c, c.encode("unicode_escape"), unicodedata.name(c))

得到如下结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Original Hindi word: परिवर्तन
Composed by:
प b'\\u092a' DEVANAGARI LETTER PA
र b'\\u0930' DEVANAGARI LETTER RA
ि b'\\u093f' DEVANAGARI VOWEL SIGN I
व b'\\u0935' DEVANAGARI LETTER VA
र b'\\u0930' DEVANAGARI LETTER RA
् b'\\u094d' DEVANAGARI SIGN VIRAMA
त b'\\u0924' DEVANAGARI LETTER TA
न b'\\u0928' DEVANAGARI LETTER NA
Hindi trans to Latin:
परिवर्तन -> privrtn

Latin trans to Hindi:
privrtn -> परिवर्टन
Composed by:
प b'\\u092a' DEVANAGARI LETTER PA
र b'\\u0930' DEVANAGARI LETTER RA
ि b'\\u093f' DEVANAGARI VOWEL SIGN I
व b'\\u0935' DEVANAGARI LETTER VA
र b'\\u0930' DEVANAGARI LETTER RA
् b'\\u094d' DEVANAGARI SIGN VIRAMA
ट b'\\u091f' DEVANAGARI LETTER TTA
न b'\\u0928' DEVANAGARI LETTER NA

上面的代码先从Hindi转写为Latin,再从Latin转写为Hindi,没能还原成最开始的Hindi字符,所以Polyglot库的转写功能不可信任。另外有个googletrans也可以做转写,它用的是谷歌翻译的接口,应该会更可靠,但由于奇怪的版本号依赖问题,安装不成功。

该问题暂时没有解决,就无法通过转写实现文章开头提到的需求。但我觉得这部分内容比较有趣,所以还是发了出来,希望对有需要的人有所帮助。