Pergunta

:) Estou tentando fazer o processo de reversão de transliteração de um arquivo de entrada (atualmente em inglês) de volta à sua forma original (em hindi)

Uma amostra ou parte do arquivo de entrada se parece com o seguinte:

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"#

Seu significado equivalente em inglês é:

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.

Meu script se parece com o seguinte:

#!/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()

O erro que estou recebendo é:

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)

Você poderia me dizer como faço para lidar com esse erro. Obrigada..:)

Foi útil?

Solução

Você tem alguns problemas além dos que você perguntou.

(1) Um problema conceitual: "ek- budz*dhi-m-aan- p-ksii#" é não "inglês". É a língua hindi escrita no ASCII usando algum esquema de romanização. Parece Itran, mas Itran não tem AA e A, ele tem apenas AA e A. O esquema tem um nome? Você pode fornecer um URL? Seu objeto é melhor descrito como "translitra algum texto em hindi da romanização sem nome ao script de Devanagari".

(2) Mostrar o resultado de traduzir seu texto de hindi para inglês ("um pássaro velho sábio" etc.) é apenas moderadamente útil. A produção esperada de Devanagari seria uma idéia melhor.

(3) Como observado por @kaiser.se, o dicionário de transliteração possui chaves multi-bytes (até 3 bytes!), Alguns dos quais são prefixos de outros. Presumivelmente AA deve ser reconhecido em prioridade para A, gh deve ser reconhecido antes g, etc. iterando os itens de um dicionário acontece em uma ordem previsível, mas para seus propósitos deve ser considerada aleatória. No código a seguir, dei prioridade a "chaves" mais longas.

(4) O dicionário está faltando algumas chaves de carta (A S TZ) ou as regras de transliteração são mais complicadas do que qualquer um de nós adivinhou até agora

(5) O significado dos personagens # * e - não é 100% óbvio. Aparece no seu texto de entrada que z e * aparecem apenas em combinação como z *

(6) Seria uma boa ideia se você explicasse a interpretação de por exemplo shaakhaay-e-ng ... começa com sh então aa ou começa com sha então a? Quais são as regras?

A resposta para o problema que você perguntou é, obviamente, como vários outros apontaram que você precisa codificar sua saída Unicode usando uma codificação suportada pelo seu dispositivo de exibição, por exemplo, UTF-8.

Aqui está algum código:

#!/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()

Resultado:

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

एक घने जनगगल मेनग बहु t ऊँचै पेड थ a उ स की tzt ोनग लदी ष खैयेनग खैयेनग मजz बू t बैजुओनग की t marca फेिली हुई तीनग वन हँसोनग कै एक झुनह z zड इस प प निवैस क क t ै थ a वे सब सु सुरक्षि t ते ौर बडे ैम marca से ह ह t े उ उ न मेनग से ैम पक्षी बहु t बुद z zधिमैन थ a इस बुद z zधिमैन पक्षी ने दिन पेड की जड मेनग से एक ल t ै उ ग t े देखै इस बै बैntasयै t ुम z zहेनग ल ल t ै दे t ी हेि ", उ स ने उ न से" t ुम z z zहेनग इसे न s ह z zट कर देनै चैहिए "" इसे क z zयोनग न s ह z zट कर देनै चैहिए? "हँसोनग ने आ श z zयै हैनि पहुँचै सक t ी हेि "" मेरे मित्रोनग, "बुद z zधिमैन पक्षी ने उ tzt र दियै "वह छोटी सी ल t ै जल z zदी ही बडी हो जैयेगी यह हमैरे पेड पर चढZ कर उ स से लिपट t ी ौ ौntasz बू t हो जैयेगी "" t ो क z zयै हुआ "

que tem apenas algumas palavras reconhecíveis quando empurrado pelo Google Translate.

Atualizar Depois de examinar a tabela de transliteração mais de perto:

  • Três das entradas (AA, II e U) têm um espaço após o equivalente de Devanagari. Talvez os espaços devam ser removidos.

  • O padrão geral para consoantes parece ser:

Devanagari Letter Xa é representado por x
Devanagari letra xxa é representada por x
Devanagari letra XHA é representada por XH
Devanagari letra xxha é representada por xh

No entanto, 3 entradas quebram o padrão:
SSA -> SHA, mas Pattern diz S
Ta -> mas o padrão diz t
Tha -> tha, mas o padrão diz th

NOTA: Alterando as três entradas acima impediu meu código de reclamar que S e T ficaram inalteradas ao transliterar o texto da amostra e removeram as entradas SHA e THA aparentemente anomalous.

  • As entradas (D e Dr) são mapeadas para o mesmo personagem, Devanagari Letter DDA. D é a entrada esperada para esse personagem; Talvez o Dr. deva ser mapeado em outro lugar.

  • Não há entrada para a letra de Devanagari NGA (U+0919); Talvez deva ser codificado como Ng - há algumas palavras terminando em Ng no texto da amostra.

  • As ocorrências não encomeradas "Z*" no texto da amostra estão a ver com a letra de Devanagari ZA (U+095b)?

Outras dicas

F1.Write ('' .Join (List1))

list1, neste momento, contém seqüências de unicode. Você não pode escrever Unicode diretamente em um arquivo, é uma interface de byte. Você deve codificá -lo explicitamente (' '.join(list1).encode('utf-8')), ou, como Ignacio sugere, use um codecs O invólucro para codificar implicitamente strings unicode que você envia para ele. No momento você está definindo uma variável CODEC, mas não fazendo nada com isso.

Tem certeza de que deseja remover todos os hífens (-)? Olhando para o seu arquivo de entrada, parece que todas as substituições são códigos de dois ou três caracteres, como u'i-': u' इ '. Se é assim, você pode fazer algo como abaixo, mas certifique -se de usar strings Unicode para todas as suas chaves e valores no dicionário:

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()

Seguindo essa teoria, obtive o seguinte resultado, que parece traduções como 'z*', 't-', 'ng' e 'ei' estão faltando no dicionário. Não leio o Hindi, mas o Google Translate criou algumas das palavras em inglês em sua tradução, então acho que estou no caminho certo.

-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*यै हुआ"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top