Python – pyparsing caracteres Unicode

🙂 Intenté usar w = Word (imprimibles), pero no funciona. ¿Cómo debo dar la especificación para esto? ‘w’ está destinado a procesar caracteres hindi (UTF-8)

El código especifica la gramática y analiza en consecuencia.

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

Si solo hay caracteres en inglés, está funcionando, por lo que el código es correcto para el formato ascii, pero el código no funciona para el formato Unicode.

Quiero decir que el código funciona cuando tenemos algo de la forma 671.assess :: ahsaas :: 2

es decir, analiza las palabras en el formato en inglés, pero no estoy seguro de cómo analizar y luego imprimir caracteres en el formato Unicode. Necesito esto para la alineación de la palabra Inglés Hindi para propósito.

El código de python se ve así:

 # -*- 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() ''' 

si una oración de entrada de ejemplo para el archivo fuente es:

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

La salida se vería así:

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

Explicación de salida: – Esto logra la alineación bidireccional. Significa que la primera palabra del inglés ‘moderno’ se asigna a la primera palabra del hindi ‘AddhUnIk’ y viceversa. Aquí incluso los caracteres se toman como palabras, ya que también son una parte integral del mapeo bidireccional. Así si observas la palabra hindi ‘.’ tiene una alineación nula y no se asigna a nada con respecto a la oración en inglés ya que no tiene un punto final. La tercera línea int la salida básicamente representa un delimitador cuando estamos trabajando para una serie de oraciones para las que está intentando realizar un mapeo bidireccional.

¿Qué modificación debo hacer para que funcione si tengo las oraciones hindi en formato Unicode (UTF-8).

Como regla general, no procese las secuencias de caracteres codificadas: conviértalas en cadenas Unicode adecuadas (llamando a su método .decode ) tan pronto como sea posible, haga todo el procesamiento siempre en cadenas Unicode, luego, si tiene que hacerlo para E / S Para ello, .encode nuevamente en cualquier encoding de bytring que requiera.

Si estás hablando de literales, como parece que estás en tu código, el “tan pronto como sea posible” es a la vez : usa u'...' para express tus literales. En un caso más general, donde se ve obligado a hacer E / S en forma codificada, es inmediatamente después de la entrada (al igual que es inmediatamente antes de la salida si necesita realizar la salida en una forma codificada específica).

Los printables de Pyparsing solo tratan con cadenas en el rango de caracteres ASCII. Desea imprimibles en el rango completo de Unicode, como este:

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

Ahora puede definir trans utilizando este conjunto más completo de caracteres sin espacio:

 trans = Word(unicodePrintables) 

No pude probar contra tu cadena de prueba Hindi, pero creo que esto hará el truco.

(Si está usando Python 3, entonces no hay una función unichr separada, y no hay un generador de rango, solo use:

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

EDITAR:

Con el reciente lanzamiento de pyparsing 2.3.0, se han definido nuevas clases de espacio de nombres para dar printables , alphas , nums y alphanums para varios rangos de idiomas Unicode.

 import pyparsing as pp pp.Word(pp.pyparsing_unicode.printables) pp.Word(pp.pyparsing_unicode.Devanagari.printables) pp.Word(pp.pyparsing_unicode.देवनागरी.printables)