Domanda

:) Sto cercando di andare circa il processo di inversione traslitterazione di un file di input (attualmente in inglese) torna alla sua forma originale (in hindi)

Un campione o di una parte del file di input seguente aspetto:

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

Il suo significato equivalente in inglese è:

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.

Il mio script è simile al seguente:

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

l'errore che sto ottenendo è:

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)

La prego di dirmi come faccio a far fronte a questo errore. Grazie ..:)

È stato utile?

Soluzione

Hai qualche problema diversi da quello che hai chiesto.

(1) Un problema concettuale: "E-K- b-u-d-z * DHI-m-aan- p-ksii #" è non "inglese". E 'la lingua Hindi scritto in ASCII utilizzando alcuni schema di romanizzazione. Sembra Itran ma Itran non ha AA e A, ha solo AA e a. Il regime ha un nome? Potete fornire un URL? Il vostro oggetto è meglio descritta come "la traslitterazione del testo Hindi dalla romanizzazione senza nome allo script Devanagari".

(2) che mostra il risultato di tradurre il testo da Hindi a Inglese ( "Un vecchio e saggio uccello", ecc) è solo moderatamente utile. L'uscita Devanagari previsto sarebbe un'idea migliore.

(3) Come osservato da @ kaiser.se, il dizionario traslitterazione ha tasti, alcuni dei quali sono prefissi degli altri multi-byte (! Fino a 3 byte). Presumibilmente AA deve essere riconosciuto in via prioritaria ai A, gh deve essere riconosciuto prima g, ecc iterare su voci di un dizionario accade in un ordine che è prevedibile, ma per il tuo scopo deve essere considerato come casuale. Nel codice che segue, ho dato la priorità ai più "chiavi".

(4) Sia il dizionario non contiene alcuni tasti lettera (una S t z) o le regole di traslitterazione sono più complicati di qualsiasi di noi ha intuito finora

(5) Il significato dei caratteri # * e - non è evidente al 100%. Risulta dal testo di input che z e * appaiono solo in combinazione come z *

(6) Sarebbe una buona idea se si ha spiegato l'interpretazione di esempio shaakhaay-e-ng ... vuol iniziare con sh poi aa o lo fa iniziare con sha poi a? Quali sono le regole?

La risposta al problema che hai chiesto è, naturalmente, come molti altri hanno sottolineato che è necessario per codificare l'output Unicode utilizzando una codifica che è supportato dal dispositivo di visualizzazione per esempio UTF-8.

Ecco un po 'di codice:

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

Output:

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

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

, che ha solo alcune parole riconoscibili quando spinto attraverso Google Translate.

Aggiorna dopo aver esaminato più da vicino la tabella di traslitterazione:

  • Tre delle voci (AA, II, e U) presentano uno spazio dopo l'equivalente Devanagari. Forse gli spazi devono essere rimossi.

  • Lo schema generale per le consonanti sembra essere:

Devanagari LETTERA XA è rappresentato da x
Devanagari LETTERA XXA è rappresentato da X
Devanagari LETTERA XHA è rappresentata da
xh Devanagari LETTERA XXHA è rappresentato da Xh

Tuttavia 3 voci rompere il modello:
SSA -> sha, ma modello dice S
TA -> th ma modello dice t
THA -> tha ma modello dice esimo

Nota: la modifica di cui sopra 3 voci fermato il mio codice di lamentarsi che S e T sono stati lasciati invariati quando traslitterare il testo di esempio, e rimosso lo sha apparentemente anomalo e tha voci

.
  • Articoli (D e dr) vengono mappati allo stesso carattere, DEVANAGARI LETTERA DDA. D è la voce prevista per quel personaggio; forse dr dovrebbe essere mappato altrove.

  • Non v'è alcuna voce per Devanagari LETTERA NGA (U + 0919); forse dovrebbe essere codificato come ng -. ci sono un paio di parole che terminano in ng nel testo di esempio

  • sono la uncatered-le occorrenze "Z *" nel nulla testo di esempio a che fare con Devanagari LETTERA ZA (U + 095B)?

Altri suggerimenti

  

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

list1, a questo punto, contiene stringhe Unicode. Non è possibile scrivere Unicode direttamente in un file, è un'interfaccia di byte. Si dovrebbe o codificare esplicitamente (' '.join(list1).encode('utf-8')), o, come suggerisce Ignacio, utilizzare un wrapper codecs per codificare implicitamente stringhe Unicode inviati ad esso. Al momento si sta definendo una CODEC variabile, ma non fare nulla con esso.

Sei sicuro di voler rimuovere tutti i trattini (-)? Guardando il tuo file di input, sembra che tutte le sostituzioni sono a due o tre caratteri codici, come u'I - ': u' इ'. Se è così, si potrebbe fare qualcosa di simile al di sotto, ma assicurarsi che si sta utilizzando stringhe Unicode per tutte le chiavi e valori nel dizionario:

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

A seguito di questa teoria, ho ottenuto il seguente risultato, che assomiglia a traduzioni come 'z *', 't-', 'ng', e 'Ei' mancano dal dizionario. Non leggo Hindi, ma Google Translate si avvicinò con alcune delle parole in inglese nella vostra traduzione, quindi penso di essere sulla strada giusta.

-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*यै हुआ"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top