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#」は「英語」ではありません。これは、ローマ字化スキームを使用して ASCII で書かれたヒンディー語です。ITRAN のように見えますが、ITRAN には AA と A がなく、aa と a しかありません。スキームに名前はありますか?URLを提供できますか?あなたのオブジェクトは、「名前のないローマ字からデバナーガリ文字へのヒンディー語のテキストの音訳」としてより適切に説明されています。

(2) テキストをヒンディー語から英語に翻訳した結果 (「A WISE OLD BIRD」など) を表示しても、あまり役に立ちません。予想されるデバナーガリーの出力は、より良い考えです。

(3) @kaiser.se が指摘したように、音訳辞書にはマルチバイト (最大 3 バイト!) のキーがあり、そのうちのいくつかは他のプレフィックスです。おそらくAAは よりも優先して認識される必要がありAghよりも前に認識される必要がありますg。辞書の項目の反復処理は予測可能な順序で行われますが、目的のためにはランダムと見なす必要があります。以下のコードでは、より長い「キー」を優先しています。

(4) 辞書にいくつかの文字キー (a S tz) が欠けているか、音訳規則がこれまでに推測したよりも複雑です。

(5) 文字 # * および - の意味は 100% 明らかではありません。入力テキストから、z と * は z* のように組み合わせてのみ表示されることがわかります

(6) の解釈を説明していただけると助かりshaakhaay-e-ngます。ルールは何ですか?shaashaa

あなたが尋ねた問題への答えは、もちろん、ディスプレイデバイスでサポートされているエンコーディング(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*धिमैन क्षी

एकघनेघनेजनगगलघनेबहुबहुबहुएकएकएकथथथथथ a _ _ नमेनगपकपकपकपकएकएकबहुबहुबुद Z Z बुद a उसउसनेउपूछै "tुमz ुमहेनगन z z z z हकककचैहिए " "इसेZक हँसोनगनेहँसोनगशZ <em> <em>चपूछै "यह"यहtोtनीtनीनीछोटीहेिहेिककzककपहुँचैपहुँचैपहुँचैपहुँचैपहुँचैहेिहेिहेि " मेमेमेमितमेमितमितमितमितमितमित "दीहीदीहीहोजैयेगीजैयेगीयहयहなりेयहयहहमैपेडपेडचढZou Zouचढउउससेलिपटलिपटजैयेगीजैयेगीौौौौमजमज Zou Z Zमजtहो "" tो Z

Google翻訳に押し込んだときに認識できる単語はわずかです。

音訳表をより詳しく調べた後に更新します。

  • エントリのうち 3 つ (AA、II、および U) には、対応するデバナーガリー語の後にスペースがあります。おそらく、スペースを削除する必要があります。

  • 子音の一般的なパターンは次のようになります。

デーヴァナガリ文字 XA は x で表され
ます デーヴァナガリ文字 XXA は X で表されます デーヴァナガリ文字 XHA
は 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'इ' などの 2 文字または 3 文字のコードのようです。その場合、以下のようにすることもできますが、辞書内のすべてのキーと値に 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」などの翻訳が辞書から欠落しているように見える次の結果を得ました。私はヒンディー語を読みませんが、Google 翻訳はあなたの翻訳でいくつかの英単語を思いついたので、正しい方向に進んでいると思います.

-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 に答える