0

:) 我正在尝试将输入文件(当前为英文)的音译反转回其原始形式(印地语)的过程

输入文件的示例或一部分如下所示:

E-k- b-u-d-z*dhi-m-aan- p-ksii#

E-k- ghn-e- j-ngg-l- m-e-ng E-k- b-h-u-t- UUNNc-aa p-e-dr thaa#
U-s- k-ii p-t-z*t-o-ng s-e- l-d-ii shaakhaay-e-ng m-j-*zb-uut- b-aaj-u-O-ng k-ii t-r-h- pheil-ii h-u-II thiing#
w-n- h-NNs-o-ng k-aa E-k- jhu-nhz*D- I-s- p-e-dr p-r- n-i-w-aas- k-r-t-aa thaa#
w-e- s-b- y-h-aaNN s-u-r-ksi-t- the- AUr- b-dre- AAr-aam- s-e- r-h-t-e- the-#
U-n- m-e-ng s-e- E-k- p-ksii b-h-u-t- b-u-d-z*dhi-m-aan- thaa#
I-s- b-u-d-z*dhi-m-aan- p-ksii n-e- E-k- d-i-n- p-e-dr k-ii j-dr m-e-ng s-e- E-k- l-t-aa k-o- U-g-t-e- d-e-khaa# 
I-s- k-e- b-aar-e- m-e-ng U-s-n-e- d-uus-r-e- p-ksi-y-o-ng s-e- b-aat- k-ii#
"k-z*y-aa t-u-m-z*h-e-ng w-h- l-t-aa d-i-khaaII d-e-t-ii h-ei", U-s- n-e- U-n- s-e- p-uuchaa "t-u-m-z*h-e-ng I-s-e- n-Shz*T- k-r- d-e-n-aa c-aah-i-E-"#
"I-s-e- k-z*y-o-ng n-Shz*T- k-r- d-e-n-aa c-aah-i-E-?" h-NNs-o-ng n-e- AAshz*c-*ry- s-e- p-uuchaa "y-h- t-o- I-t-n-ii cho-T-ii s-e- h-ei#
h-m-e-ng y-h- k-z*y-aa h-aan-i- p-h-u-NNc-aa s-k-t-ii h-ei"#
"m-e-r-e- m-i-tro-ng," b-u-d-z*dhi-m-aan- p-ksii n-e- U-t-z*t-r- d-i-y-aa "w-h- cho-T-ii s-ii l-t-aa j-l-z*d-ii h-ii b-drii h-o- j-aay-e-g-ii#
y-h- h-m-aar-e- p-e-dr p-r- c-Dh*z k-r- U-s- s-e- l-i-p-T-t-ii j-aay-e-g-ii AUr- phi-r- m-o-T-ii AUr- m-j-*zb-uut- h-o- j-aay-e-g-ii"#
"t-o- k-z*y-aa h-u-AA"#

它在英语中的等效含义是:

A WISE OLD BIRD.

Deep in the forest stood a very tall tree.
Its leafy branches spread out like long arms.
This was the home of a flock of wild geese.
They were safe there.
One of the geese was a wild old bird.
One  day this wise old bird noticed  a small creeper growing at the foot of the tree.
He spoke to the other birds about it.
"Do you see that creeper ?" he said to them.
"You must destroy it."
"Why must we destroy it ?" asked the geese in surprise.
"It is so small.
What harm can it do?"
"My friends," replied the wise old bird, " that little creeper will soon grow.

我的脚本如下所示:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
CODEC = 'utf-8'
input_file=sys.argv[1]
output_file=sys.argv[2]
list1=[]



f=open(input_file,'r')
f1 = open(output_file,'w')

english_hindi_dict={'A' : u'अ' ,  'AA' : u'आ ' , 'I' : u'इ' , 'II' : u'ई ' , 'U' : u'उ ' ,\
                'UU' : u'ऊ' , 'r' : u'ऋ' , 'E' : u'ए' , 'ai' : u'ऐ' , 'O' : u'ओ' , 'AU' : u'औ' ,\
                'k' : u'क' , 'kh' : u'ख' , 'g' : u'ग' , 'gh' : u'घ' , 'c' : u'च' , 'ch' : u'छ',\
                'j': u'ज' , 'jh' : u'झ' , 'tr' : u'त्र' , 'T' : u'ट'  , 'Th' : u'ठ' , 'D' : u'ड',\
                'dr' : u'ड' , 'Dh' : u'ढ' , 'Na' : u'ण' , 'th' : u'त' ,  'tha' : u'थ',\
                'd' : u'द' , 'dh': u'ध' , 'n' : u'न' , 'p' : u'प' , 'ph' : u'फ' ,\
                'b' : u'ब' , 'bh' : u'भ' , 'm' : u'म' , 'y' : u'य' , 'r' : u'र' , 'l' : u'ल' ,\
                'w' : u'व' , 'sh' : u'श' , 'sha' : u'ष', 's' : u'स' , 'h' : u'ह' , 'ks' : u'क्ष' ,\
                'i' : u'ि' , 'ii' : u'ी' , 'u' : u'ु' , 'uu' : u'ू' , 'e' : u'े' ,\
                'aa' : u'ै' , 'o' : u'ो' , 'AU' : u'ौ' ,'H' : u'्' ,'mn' : u'ं' ,\
                'NN' : u'ँ' , 'AW' : u'ॅ' , 'rr' : u'ृ' , '4' : u'४' , '6': u'६'  , '8' : u'८',\
                '2' : u'२' , '5' : u'५' , '3' : u'३' , '7' : u'७' , '9' : u'९' , '1' : u'१'}
for line in f:
      #line=line.strip() to remove a line from its newline character....  
      #line=line.rstrip('.')   
      line=line.replace('-','')
      line=line.replace('#','|') # i am using the or symbol for poornviram
      #line=line.replace('।','')
      #line = line.lower()
for word in line:
    for ch in word:
        if (ch in english_hindi_dict) :
            translatedToken = english_hindi_dict[ch]
        else :
                translatedToken = ch

#{ translatedToken = english_hindi_dict[ch] }

#for ch in line:
    f1.write(translatedToken)
    #print translatedToken
    #line = line.replace( char,english_hindi_dict[char] )   
      #list1.append(line)
f.close()

f1.write(' '.join(list1))

f1.close()

我得到的错误是:

python transliterate_eh_nw.py Hstory.txt op1.txt
Traceback (most recent call last):
  File "transliterate_eh_nw.py", line 43, in <module>
    f1.write(translatedToken)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u092f' in position 0: ordinal not in range(128)

你能告诉我如何处理这个错误。谢谢..:)

4

3 回答 3

4

除了您询问的问题之外,您还有一些问题。

(1) 一个概念问题:“Ek-budz*dhi-m-aan-p-ksii#”不是“english”。它是使用某些罗马化方案以 ASCII 编写的印地语语言。它看起来像 ITRAN,但 ITRAN 没有 AA 和 A,它只有 aa 和 a。该计划有名称吗?你能提供一个网址吗?您的对象最好被描述为“将一些印地语文本从未命名的罗马字母音译为梵文脚本”。

(2) 显示将您的文本从印地语翻译成英语的结果(“A WISE OLD BIRD”等)只是适度有用。预期的梵文输出将是一个更好的主意。

(3) 正如@kaiser.se 所说,音译字典具有多字节(最多3 个字节!)键,其中一些是其他的前缀。大概AA必须优先于被识别Agh必须在 之前被识别g,等等。对字典项目的迭代以可预测的顺序发生,但出于您的目的,应将其视为随机的。在下面的代码中,我优先考虑更长的“键”。

(4) 要么是字典缺少一些字母键(a S tz),要么是音译规则比我们迄今为止所猜测的更复杂

(5) # * 和 - 字符的含义不是 100% 明显的。从您的输入文本中可以看出,z 和 * 仅作为 z* 组合出现

(6) 如果您解释了 eg shaakhaay-e-ng... 它是从shthen开始aa还是从shathen开始,这将是一个好主意a?都有些什么样的规矩?

您所问问题的答案当然是其他几个人指出您需要使用显示设备支持的编码(例如 UTF-8)对 unicode 输出进行编码。

这是一些代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

input_data = """
E-k- b-u-d-z*dhi-m-aan- p-ksii#

E-k- ghn-e- j-ngg-l- m-e-ng E-k- b-h-u-t- UUNNc-aa p-e-dr thaa#
[snip]
"t-o- k-z*y-aa h-u-AA"#
"""

roman_devanagari_dict={'A' : u'अ' ,  'AA' : u'आ ' , 'I' : u'इ' , 'II' : u'ई ' , 'U' : u'उ ' ,\
[snip]
            '2' : u'२' , '5' : u'५' , '3' : u'३' , '7' : u'७' , '9' : u'९' , '1' : u'१'}

#Presuming we need to do the 3-letter cases then the 2-letter then the 1-letter
replacements = [(-len(k), unicode(k), v) for k, v in roman_devanagari_dict.items()]
replacements.sort()

data = input_data.decode('ascii')

for _junk, from_text, to_text in replacements:
    data = data.replace(from_text, to_text)

# Presuming the '-' are inter-character markers, delete them last, not first
data = data.replace(u'-', '')
data = data.replace(u'#', '')
print "untransliterated:", set(c for c in data if 0x20 < ord(c) < 0x7f)

BOM = u'\ufeff'
outf = open('devanagari.txt', 'w')
outf.write(BOM.encode('utf8')) # for the benefit of clueless Windows s/w
outf.write(data.encode('utf8'))
outf.close()

输出:

एक बुदz*धिमैन पक्षी

एकघनेजनगगलमेनगएकबहुबहुपेडथउउससपखैयेनगमजषमजमज zबूtबैजुओनगकीफेिलीहुईतीनगवनहँसोनगकैzडइसपेडनिवैसकरकरझुनहझुनहपेडपरनिवैसकरथथवेसबसुरक्षिसुरक्षितेबडेआरैमसेसुरक्षि t े नमेनगसेएकपक्षीबहुz धिमैनथइसबुदबुदz धिमैनपक्षीनेएकदिनबुदमेनगसेएकलदिनकोमेनगसेललैउगगदेखैदेखैइसबैरेउसनेदूसरेपक्षियोनगसेबैबै“कz 〗z ुमवहलtकीकयैz हेनगललैदेुमलललदिखैईदेहेि”, उसनेउनसेसेपूछैपूछैपूछैपूछैुमहेनगइसे sहz टटकरदेनैचैहिए“”इसेकz योनगयोनगsहz टकरदेनैचैहिए?“ हँसोनगनेआशz च<em>रयसेसेपूछैसेसेयहइछोटीछोटीसेहमेनगयहzयैयैहैनिपहुँचैसकीहेिहेिहेिहेिहेिहेिहेिहेिहेिहेिहेिहेिहेिहेिहेिहेिहेिहेिहेिहेिक" कककहेिहेिमित्रोनगमित्रोनगमित्रोनगमित्रोनगमित्रोनगकमित्रोनगमित्रोनगमित्रोनगकमित्रोनगमित्रोनगमित्रोनगहेिकमित्रोनगमित्रोनगकमित्रोनगकमित्रोनगमित्रोनगमित्रोनगमित्रोनगककककइककककककककइकककदीदीहीबडीहोहोजैयेगीयहपेडपरचढ z करकरउसेसेलिपटलिपटलिपटलिपटलिपटमोटीमोटीमोटीमोटीौरौरौरमोटीमोटीमोटीमोटीमोटीमोटीमोटीमोटीजैयेगी “

当通过谷歌翻译推送时,它只有几个可识别的单词。

更仔细地检查音译表后更新:

  • 其中三个条目(AA、II 和 U)在梵文等效项之后有一个空格。也许应该删除空格。

  • 辅音的一般模式似乎是:

梵语字母 XA 用 x 表示
梵语字母 XXA 用 X
表示 梵语字母 XHA 用 xh 表示
梵语字母 XXHA 用 Xh 表示

然而 3 个条目打破了模式:
SSA -> sha 但模式说 S
TA -> th 但模式说 t
THA -> tha 但模式说 th

注意:更改上述 3 个条目使我的代码不再抱怨在音译示例文本时 S 和 t 保持不变,并删除了看似异常的 sha 和 tha 条目。

  • 条目(D 和 dr)映射到同一个字符 DEVANAGARI LETTER DDA。D 是该字符的预期条目;也许 dr 应该映射到其他地方。

  • DEVANAGARI LETTER NGA (U+0919) 没有条目;也许它应该被编码为 ng——示例文本中有几个以 ng 结尾的单词。

  • 示例文本中未出现的“z*”是否与 DEVANAGARI LETTER ZA (U+095B) 有任何关系?

于 2010-02-16T02:04:54.940 回答
1

f1.write(' '.join(list1))

list1,此时,包含 Unicode 字符串。您不能将 Unicode 直接写入文件,它是一个字节接口。您应该对其进行显式编码(' '.join(list1).encode('utf-8')),或者按照 Ignacio 的建议,使用codecs包装器对您发送给它的 Unicode 字符串进行隐式编码。目前您正在定义一个变量CODEC,但没有对它做任何事情。

于 2010-02-15T10:43:53.250 回答
1

您确定要删除所有连字符 (-) 吗?查看您的输入文件,看起来所有替换都是两个或三个字符的代码,例如 u'I-':u'इ'。如果是这样,您可以执行以下操作,但请确保您为字典中的所有键和值使用 Unicode 字符串:

import codecs

# read the whole file at once
f = codecs.open(input_file,'r','ascii')
data = f.read()
f.close()

# perform all the replacements
for k,v in english_hindi_dict.items():
    data = data.replace(k,v)

# write the whole file result
f = codecs.open(output_file,'w',CODEC)
f.write(data)
f.close()

按照这个理论,我得到了以下结果,看起来字典中缺少诸如“z*”、“t-”、“ng”和“ei”之类的翻译。我不读印地语,但谷歌翻译在你的翻译中找到了一些英文单词,所以我认为我在正确的轨道上。

-z*धिमैन पक्षी

एक घने जngगल मेng एक बहुt- ऊँचै पेड तै
उस की पt-z*t-ोng से लदी शैखैयेng मज*zबूt- बैजुओng की t-रह फeiली हुई तीng
वन हँसोng कै एक झुnhz*ड इस पेड पर निवैस करt-ै तै
वे सब यहैँ सुरक्षिt- ते ौर बडे आरैम से रहt-े ते
उन मेng से एक पक्षी बहुt- बुदz*धिमैन तै
इस बुदz*धिमैन पक्षी ने एक दिन पेड की जड मेng से एक लt-ै को उगt-े देखै 
इस के बैरे मेng उसने दूसरे पक्षियोng से बैt- की
"कz*यै t-ुमz*हेng वह लt-ै दिखैई देt-ी हei", उस ने उन से पूछै "t-ुमz*हेng इसे नShz*ट कर देनै चैहिए"
"इसे कz*योng नShz*ट कर देनै चैहिए?" हँसोng ने आशz*च*rय से पूछै "यह t-ो इt-नी छोटी से हei
हमेng यह कz*यै हैनि पहुँचै सकt-ी हei"
"मेरे मित्रोng," बुदz*धिमैन पक्षी ने उt-z*t-र दियै "वह छोटी सी लt-ै जलz*दी ही बडी हो जैयेगी
यह हमैरे पेड पर चढ*z कर उस से लिपटt-ी जैयेगी ौर फिर मोटी ौर मज*zबूt- हो जैयेगी"
"t-ो कz*यै हुआ"
于 2010-02-15T19:09:29.473 回答