2010-02-15 4 views
0

:) Je suis en train d'aller sur le processus d'inversion translittération d'un fichier d'entrée (actuellement en anglais) à sa forme originale (en hindi)Python - codec encodage ascii unicode: erreur

Un échantillon ou une partie du fichier d'entrée ressemble à ceci:

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

Son sens équivalent en anglais est:

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. 

Mon script ressemble à ceci:

#!/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'erreur que je reçois est:

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) 

Pourriez-vous s'il vous plaît me dire comment puis-je faire face à cette erreur. Merci .. :)

+0

Travailler avec seulement unicode est la seule chose à faire correctement, voir d'autres réponses. Je pense que vous avez besoin d'une sorte de commande, par exemple vous voulez être sûr de faire la substitution 'AA' avant de faire 'A'. – u0b34a0f6ae

+0

Avez-vous l'intention d'accepter une réponse? –

+0

Accepté Monsieur .. désolé pour le retard .. j'espère que vous ne vous méprenez pas Merci .. :) – boddhisattva

Répondre

4

Vous avez quelques problèmes autres que celui que vous avez demandé.

(1) Un problème conceptuel: "E-k-u-d-z * dhi-m-a-p-ksii #" est et non "anglais". C'est une langue hindi écrite en ASCII en utilisant un schéma de romanisation. Il ressemble à ITRAN mais ITRAN n'a pas AA et A, il a seulement aa et a. Est-ce que le régime a un nom? Pouvez-vous fournir une URL? Votre objet est mieux décrit comme "translittérer du texte hindi de la romanisation anonyme à l'écriture Devanagari". (2) Montrer le résultat de la traduction de votre texte de l'hindi à l'anglais ("A WISE OLD BIRD", etc.) n'est que modérément utile. La sortie Devanagari attendue serait une meilleure idée.

(3) Comme remarqué par @ kaiser.se, le dictionnaire de translittération a des clés multi-octets (jusqu'à 3 octets!), Dont certaines sont des préfixes d'autres. Probablement AA doit être reconnu en priorité à A, gh doit être reconnu avant g, etc .. Itérer sur les éléments d'un dictionnaire se produit dans un ordre qui est prévisible, mais pour vos besoins doit être considéré comme aléatoire.Dans le code qui suit, j'ai donné la priorité aux "clés" plus longues.

(4) Soit le dictionnaire est manquant quelques touches de lettres (un S tz) ou les règles de translittération sont plus compliquées que chacun d'entre nous a deviné jusqu'à présent

(5) La signification des caractères # * et - n'est pas 100% évident. Il apparaît de votre texte d'entrée que z et * apparaissent uniquement en combinaison sous la forme z *

(6) Ce serait une bonne idée si vous expliquiez l'interprétation de par ex. shaakhaay-e-ng ... commence-t-elle par sh puis aa ou commence-t-elle par sha puis a? Quelles sont les règles?

La réponse au problème que vous avez demandé est bien sûr que plusieurs autres ont souligné que vous avez besoin d'encoder votre sortie Unicode en utilisant un encodage qui est pris en charge par votre dispositif d'affichage, par exemple. UTF-8.

Voici quelques code:

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

Sortie:

एक बुद 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 हुआ हुआ "

qui a seulement quelques mots reconnaissables quand poussé à travers Google Translate.

Mise à jour après avoir examiné le tableau de translittération plus près:

  • Trois des entrées (AA, II et U) ont un espace après l'équivalent Devanagari. Peut-être que les espaces devraient être supprimés.

  • Le schéma général pour les consonnes semble être:

DEVANAGARI LETTRE XA est représenté par x
DEVANAGARI LETTRE XXA est représenté par X
DEVANAGARI LETTRE XHA est représenté par xh
LETTRE DEVANAGARI XXHA est représenté par Xh

Cependant 3 entrées cassent le modèle:
SSA -> sha mais le motif dit S
TA -> e mais modèle dit t
THA -> tha mais modèle dit e

Remarque: La modification des 3 entrées ci-dessus ont arrêté mon code de se plaindre que S et T ont été laissés inchangés lorsque translittération votre échantillon de texte, et enlevé les entrées sha et tha apparemment anormales.

  • entrées (D) et DR sont mis en correspondance avec le même caractère, DEVANAGARI LETTRE DDA. D est l'entrée attendue pour ce personnage; peut-être dr devrait être cartographié ailleurs.

  • Il n'y a pas d'entrée pour DEVANAGARI LETTER NGA (U + 0919); peut-être devrait-il être encodé en tant que ng - il y a quelques mots qui se terminent par ng dans le texte d'exemple. Les occurrences de "z *" dans le texte d'exemple sont-elles quelque chose à voir avec DEVANAGARI LETTER ZA (U + 095B)?

+0

Salut John ... :) Tout d'abord merci beaucoup pour votre précieux temps et aide , Je suis désolé de ne pas encore accepter l'une des réponses jusqu'à présent, j'ai été un peu retenu récemment avec le travail connexe va sûrement revenir à vous dès que possible, j'espère que vous comprenez .... – boddhisattva

+0

@john merveille si vous pouvez aider avec http://stackoverflow.com/questions/41079364/python-get-unicode-from-devnagari-character – user2661518

+0

@ user2661518 Voulez-vous dire la question que vous venez de supprimer? –

1

f1.write (» » .join (list1))

list1, à ce stade, contient des chaînes Unicode. Vous ne pouvez pas écrire Unicode directement dans un fichier, c'est une interface octet. Vous devez soit le coder explicitement (' '.join(list1).encode('utf-8')), soit, comme Ignacio le suggère, utiliser un wrapper codecs pour coder implicitement les chaînes Unicode que vous lui envoyez. Au moment où vous définissez une variable CODEC, mais ne faites rien avec elle. Voulez-vous vraiment supprimer tous les traits d'union (-)?

1

Etes-vous sûr de vouloir supprimer tous les traits d'union (-)? En regardant votre fichier d'entrée, il semble que tous les remplacements sont des codes à deux ou trois caractères, tels que u'I - ': u' इ '. Si tel est le cas, vous pourriez faire quelque chose comme ci-dessous, mais assurez-vous d'utiliser des chaînes Unicode pour toutes vos clés et valeurs dans le dictionnaire:

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

Après cette théorie, je suis le résultat suivant, qui semble comme les traductions telles que 'z *', 't-', 'ng' et 'ei' sont absentes du dictionnaire. Je ne lis pas l'hindi, mais Google Translate a trouvé quelques mots anglais dans votre traduction, donc je pense que je suis sur la bonne voie.

-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*यै हुआ" 
+0

Merci pour votre réponse Monsieur .. Je reviendrai à vous Monsieur dans un certain temps .. suis-je un peu tenu en place ... – boddhisattva

Questions connexes