Python - pyparsing unicode символы

:) Я пытался использовать w = Word (распечатки), но он не работает. Как я должен дать спецификацию для этого. 'w' предназначен для обработки символов хинди (UTF-8)

Код указывает грамматику и синтаксические анализы соответственно.

671.assess  :: अहसास  ::2
x=number + "." + src + "::" + w + "::" + number + "." + number

Если существуют только английские символы, это работает так, код является правильным для формата ASCII, но код не работает на unicode формат.

Я подразумеваю, что код работает, когда у нас есть что-то вроде формы 671.assess:: ahsaas:: 2

т.е. это анализирует слова в английском формате, но я не уверен, как проанализировать и затем распечатать символы в unicode формате. Мне нужно это для английского выравнивания слов хинди для цели.

Код Python похож на это:

# -*- coding: utf-8 -*-
from pyparsing import Literal, Word, Optional, nums, alphas, ZeroOrMore, printables , Group , alphas8bit , 
# grammar 
src = Word(printables)
trans =  Word(printables)
number = Word(nums)
x=number + "." + src + "::" + trans + "::" + number + "." + number
#parsing for eng-dict
efiledata = open('b1aop_or_not_word.txt').read()
eresults = x.parseString(efiledata)
edict1 = {}
edict2 = {}
counter=0
xx=list()
for result in eresults:
  trans=""#translation string
  ew=""#english word
  xx=result[0]
  ew=xx[2]
  trans=xx[4]   
  edict1 = { ew:trans }
  edict2.update(edict1)
print len(edict2) #no of entries in the english dictionary
print "edict2 has been created"
print "english dictionary" , edict2 

#parsing for hin-dict
hfiledata = open('b1aop_or_not_word.txt').read()
hresults = x.scanString(hfiledata)
hdict1 = {}
hdict2 = {}
counter=0
for result in hresults:
  trans=""#translation string
  hw=""#hin word
  xx=result[0]  
  hw=xx[2]
  trans=xx[4]
  #print trans
  hdict1 = { trans:hw }
  hdict2.update(hdict1)

print len(hdict2) #no of entries in the hindi dictionary
print"hdict2 has been created"
print "hindi dictionary" , hdict2
'''
#######################################################################################################################

def translate(d, ow, hinlist):
   if ow in d.keys():#ow=old word d=dict
    print ow , "exists in the dictionary keys"
        transes = d[ow]
    transes = transes.split()
        print "possible transes for" , ow , " = ", transes
        for word in transes:
            if word in hinlist:
        print "trans for" , ow , " = ", word
                return word
        return None
   else:
        print ow , "absent"
        return None

f = open('bidir','w')
#lines = ["'\
#5# 10 # and better performance in business in turn benefits consumers .  # 0 0 0 0 0 0 0 0 0 0 \
#5# 11 # vHyaapaar mEmn bEhtr kaam upbhOkHtaaomn kE lIe laabhpHrdd hOtaa hAI .  # 0 0 0 0 0 0 0 0 0 0 0 \
#'"]
data=open('bi_full_2','rb').read()
lines = data.split('!@#$%')
loc=0
for line in lines:
    eng, hin = [subline.split(' # ')
                for subline in line.strip('\n').split('\n')]

    for transdict, source, dest in [(edict2, eng, hin),
                                    (hdict2, hin, eng)]:
        sourcethings = source[2].split()
        for word in source[1].split():
            tl = dest[1].split()
            otherword = translate(transdict, word, tl)
            loc = source[1].split().index(word)
            if otherword is not None:
                otherword = otherword.strip()
                print word, ' <-> ', otherword, 'meaning=good'
                if otherword in dest[1].split():
                    print word, ' <-> ', otherword, 'trans=good'
                    sourcethings[loc] = str(
                        dest[1].split().index(otherword) + 1)

        source[2] = ' '.join(sourcethings)

    eng = ' # '.join(eng)
    hin = ' # '.join(hin)
    f.write(eng+'\n'+hin+'\n\n\n')
f.close()
'''

если входное предложение в качестве примера для исходного файла:

1# 5 # modern markets : confident consumers  # 0 0 0 0 0 
1# 6 # AddhUnIk baajaar : AshHvsHt upbhOkHtaa .  # 0 0 0 0 0 0 
!@#$%

ouptut был бы похож на этот:-

1# 5 # modern markets : confident consumers  # 1 2 3 4 5 
1# 6 # AddhUnIk baajaar : AshHvsHt upbhOkHtaa .  # 1 2 3 4 5 0 
!@#$%

Выходное Объяснение:-Это достигает двунаправленного выравнивания. Это означает первое слово английских 'современных' карт к первому слову хинди 'AddhUnIk' и наоборот. Здесь даже символы являются взятием как словами, как они также - неотъемлемая часть двунаправленного отображения. Таким образом, если Вы наблюдаете хинди, WORD '.' имеет пустое выравнивание, и это ни на что не отображается относительно английского предложения, поскольку это не имеет точки. 3-й интервал строки вывод в основном представляет разделитель, когда мы работаем на многие предложения для который Ваша попытка достигнуть двунаправленного отображения.

Что модификация должна я делать, чтобы она работала, если я имеет предложения хинди в Unicode (UTF-8) формат.

12
задан ThomasH 27 April 2010 в 22:17
поделиться

2 ответа

Как правило, не обрабатывайте закодированные байтстринги: как можно скорее превратите их в правильные юникодовые строки (вызвав их метод .decode), выполняйте всю свою обработку всегда на юникодовых строках, а затем, если потребуется для целей ввода-вывода, .encode снова закодируйте их в ту кодировку байтстринга, которая вам нужна.

Если вы говорите о литералах, как это, похоже, происходит в вашем коде, то "как можно скорее" - это сразу: используйте u'...' для выражения ваших литералов. В более общем случае, когда вы вынуждены выполнять ввод/вывод в кодированной форме, он находится сразу после ввода (так же как и сразу перед выводом, если вам нужно выполнить вывод в определенной кодированной форме).

7
ответ дан 2 December 2019 в 04:25
поделиться

Pyparsing's printables работает только со строками в диапазоне символов ASCII. Вам нужны печатные таблицы в полном диапазоне Unicode, например, так:

unicodePrintables = u''.join(unichr(c) for c in xrange(sys.maxunicode) 
                                        if not unichr(c).isspace())

Теперь вы можете определить trans, используя этот более полный набор непробельных символов:

trans = Word(unicodePrintables)

Я не смог проверить вашу тестовую строку на хинди, но думаю, что это поможет.

(Если вы используете Python 3, то нет отдельной функции unichr, и нет генератора xrange, просто используйте:

unicodePrintables = ''.join(chr(c) for c in range(sys.maxunicode) 
                                        if not chr(c).isspace())

EDIT:

С недавним выпуском pyparsing 2.3.0 были определены новые классы пространства имен, чтобы дать printables, alphas, nums, и alphanums для различных диапазонов языков Unicode.

import pyparsing as pp
pp.Word(pp.pyparsing_unicode.printables)
pp.Word(pp.pyparsing_unicode.Devanagari.printables)
pp.Word(pp.pyparsing_unicode.देवनागरी.printables)
27
ответ дан 2 December 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: