Добавление номера позиции слова к тексту Unicode в Python - PullRequest
2 голосов
/ 20 февраля 2010

У меня есть код, который добавляет позиции слов к словам из исходного файла но вывод идет не так, как нужно:

Входной файл содержит следующее:

3.  भारत का इतिहास काफी समृद्ध एवं विस्तृत है।
57. जैसे आज के झारखंड प्रदेश से, उन दिनों, बहुत से लोग चाय बागानों में मजदूरी करने के उद्देश्य से असम आए।

Исходный код выглядит следующим образом:

    #!/usr/bin/python

    # -*- coding: UTF-8 -*-

    # encoding: utf-8

separators = [u'।', ',', '.']

text = open("hinstest1.txt").read()

    #This converts the encoded text to an internal unicode object, where

    # all characters are properly recognized as an entity:

text = text.decode("UTF-8")

    #this breaks the text on the white spaces, yielding a list of words:

words = text.split()



counter = 1



output = ""

    #if the last char is a separator, and is joined to the word:

for word in words:

    if word[-1] in separators and len(word) > 1:

        #word up to the second to last char:

        output += word[:-1] + u'(%d) ' % counter

        counter += 1

        #last char

        output += word[-1] +u'(%d) ' % counter

    else:

        output += word + u'(%d) ' % counter

        counter += 1

    #for ch in word:    

    #   if ch is '\n':

    print output

    #counter = 1

Вывод этого кода выглядит следующим образом:

3(1) .(2) 
3(1) .(2) भारत(2) 
3(1) .(2) भारत(2) का(3) 
3(1) .(2) भारत(2) का(3) इतिहास(4) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) में(24) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) में(24) मजदूरी(25) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) में(24) मजदूरी(25) करने(26) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) में(24) मजदूरी(25) करने(26) के(27) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) में(24) मजदूरी(25) करने(26) के(27) उद्देश्य(28) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) में(24) मजदूरी(25) करने(26) के(27) उद्देश्य(28) से(29) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) में(24) मजदूरी(25) करने(26) के(27) उद्देश्य(28) से(29) असम(30) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) में(24) मजदूरी(25) करने(26) के(27) उद्देश्य(28) से(29) असम(30) आए(31) ।(32) 

Я попытался изменить приведенный выше код так, чтобы счетчик обнаружил новую строку и повторно инициализировал положения слов, начиная с 1, для каждой новой строки. Я также должен убедиться, что позиции слов для серийных номеров не отображаются.

Мой измененный код не на 100% правильный, не могли бы вы помочь мне исправить его, чтобы получить желаемый результат:

Модифицированный код выглядит так:

    #!/usr/bin/python

    # -*- coding: UTF-8 -*-
    # encoding: utf-8
import fileinput
list1 = []
separators = [u'।', ',', '.']
chknwlin = ['\n']
text = open("hinstest1.txt").read()
output_file = ("ophwp1.txt")
    #This converts the encoded text to an internal unicode object, where

    # all characters are properly recognized as an entity:

text = text.decode("UTF-8")
    #this breaks the text on the white spaces, yielding a list of words:

words = text.split()

counter = 1

output = ""
    #if the last char is a separator, and is joined to the word:

for line in words:
    for word in line:
        for ch in line:

            if word[-1] in separators and len(word) > 1:

                #word up to the second to last char:

                output += word[:-1] + u'(%d) ' % counter

                counter += 1

                #last char

                output += word[-1] +u'(%d) ' % counter

            else :

                output += word + u'(%d) ' % counter

                counter += 1
#   if ch is '\n':
            if ch in chknwlin: 

            #for ch in words:   

                print output

                counter = 1
                    list1.append(output)

#words.close()

f1=open(output_file,'w')

f1.write(' '.join(list1))

f1.close()

Наконец-то я хочу, чтобы результат выглядел так:

3. भारत(1) का(2) इतिहास(3) काफी(4) समृद्ध(5) एवं(6) विस्तृत(7) है(8) ।(9)
57. जैसे(1) आज(2) के(3) झारखंड(4) प्रदेश(5) से(6) ,(7) उन(8) दिनों(9) ,(10) बहुत(11) से(12) लोग(13) चाय(14) बागानों(15) में(16) मजदूरी(17) करने(18) के(19) उद्देश्य(20) से(21) असम(22) आए(23) ।(24)

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

Ответы [ 3 ]

2 голосов
/ 20 февраля 2010

Я думаю, ваш код должен выглядеть примерно так:

# the input part is fine as is
lines = text.split('\n')
outlines = []
for line in lines:
    lout = []
    counter = 1
    for i, word in enumerate(lines.split()):
        if i == 0:  # leave 1st word of line alone, it's a marker:
            lout.append(word)
            continue
        # process each and every other word
        if word[-1] in separators and len(word) > 1:
            lout.append(word[:-1] + (u'(%d) ' % counter) +
                        word[-1] + (u'(%d) ' % counter+1))
            counter += 1
        else :
            lout.append(word + u'(%d)' % counter)
        counter += 1
    outlines.append(' '.join(lout))

f1=open(output_file,'w')
f1.write('\n'.join(outlines))
f1.close()

Невозможно протестировать этот код, поэтому могут остаться незначительные проблемы, но я думаю, что основные принципы в нем являются надежными: работа на двух уровнях (построчно в пределах штрафа, с \n в качестве разделителя и по слову в строка, с пробелом в качестве разделителя) и каждый раз используйте списки (с добавлением и соединением), а не собирайте строки по частям.

1 голос
/ 20 февраля 2010

Этот код даст вам желаемый результат. В начале строки я добавил проверку номера, которая не должна быть пронумерована.

Я адаптировал ваш оригинальный код, который работал (в основном). Вам просто нужно сбросить счетчик в конце строки ввода и добавить новую строку к вашему выводу.

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# encoding: utf-8

import re

list1 = []
separators = [u'।', ',', '.']
text = open('hinstest1.txt').read().decode('UTF-8')
output_file = ('ophwp1.txt')

for line in text.splitlines():
    counter = 1
    output = ''
    for word in line.split():
        # Special case for the number at the start of the line
        # The regex matches one or more decimal digits (\d+) followed by a dot (\.)
        if re.match(r'\d+\.', word):
            output += word + ' '
            continue
        # Special case: the last char is a separator joined to the word
        if word[-1] in separators and len(word) > 1:
            # word up to the second to last char
            output += word[:-1] + u'(%d) ' % counter
            counter += 1
            # last char
            output += word[-1] + u'(%d) ' % counter
            counter += 1
        else:
            output += word + u'(%d) ' % counter
            counter += 1
    output += u'\n'
    list1.append(output.encode('UTF-8'))

f1=open(output_file,'w')
f1.write(''.join(list1))
f1.close()

Я проверил этот код на предоставленном вами входном файле и, по большей части, сохранил ваш стиль кодирования.

0 голосов
/ 20 февраля 2010

Попробуйте изменить:

counter = 1
for line in words:
    # etc...

до:

for line in words:
    counter = 1
    # etc...

Это сбросит счетчик на 1 для каждой новой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...