Python - pyparsing символы Юникода
Вопрос
:) Я пробовал использовать w = Word (печатные материалы), но это не работает.Как я должен предоставить спецификацию для этого?'w' предназначен для обработки символов хинди (UTF-8).
Код определяет грамматику и анализирует ее соответствующим образом.
671.assess :: अहसास ::2
x=number + "." + src + "::" + w + "::" + number + "." + number
Если есть только английские символы, это работает, поэтому код корректен для формата ascii, но код не работает для формата unicode.
Я имею в виду, что код работает, когда у нас есть что-то в виде 671.оценить ::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
!@#$%
вывод будет выглядеть примерно так :-
1# 5 # modern markets : confident consumers # 1 2 3 4 5
1# 6 # AddhUnIk baajaar : AshHvsHt upbhOkHtaa . # 1 2 3 4 5 0
!@#$%
Пояснение к выводу:- Таким образом достигается двунаправленное выравнивание.Это означает, что первое слово английского "modern" соответствует первому слову хинди "AddhUnIk" и наоборот.Здесь даже символы принимаются за слова, поскольку они также являются неотъемлемой частью двунаправленного отображения.Таким образом, если вы обратите внимание, хинди-СЛОВО "." имеет нулевое выравнивание и ничему не соответствует по отношению к английскому предложению, поскольку в нем нет точки.3-я строка в выходных данных в основном представляет собой разделитель, когда мы работаем над несколькими предложениями, для которых вы пытаетесь добиться двунаправленного отображения.
Какие изменения я должен внести, чтобы это сработало, если у меня есть предложения на хинди в формате Unicode (UTF-8).
Решение
Как правило, делайте не процесс, закодированный байтовыми строками:преобразуйте их в правильные строки Юникода (вызывая их .decode
метод) как можно скорее, выполняйте всю свою обработку всегда в строках юникода, затем, если это необходимо для целей ввода-вывода, .encode
верните их обратно в любую кодировку bytestring, которая вам требуется.
Если вы говорите о литералах, как кажется в вашем коде, то "как можно скорее" - это немедленно:использование u'...'
чтобы выразить ваши литералы.В более общем случае, когда вы вынуждены выполнять ввод-вывод в закодированной форме, это происходит сразу после ввода (точно так же, как это происходит непосредственно перед выводом, если вам нужно выполнить вывод в определенной закодированной форме).
Другие советы
Пипарсинг 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())
Редактировать:
В недавнем выпуске 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)