tags:

views:

69

answers:

3

Hi..:) I have a code which appends word positions to the words from the source file but the output is not coming as desired:

The input file contains the following:

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

The original source code is like this:

    #!/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

The output for this code is like this:

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) 

I have tried to modify the above code so that the counter detects a new line and reinitializes the word positions to start from 1 for every new line, I also need to make sure that no word positions is displayed for the serial nos.

My modified code is not 100% correct could you please help me correct it to get the desired output:

Modified code looks like this:

    #!/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()

I finally want the output to look like this:

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)

The modified code is not giving me any output on the console and is also copying nothing to the output file.

I need your help urgently.. Please.. I am a novice to python I am really getting stuck with this problem. I will be grateful for any help thank you..:)

A: 

Try changing:

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

to:

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

This will reset the counter to 1 for each new line.

Mark Byers
Hello Sir..:) Thank you for your answer. I was able to kind of solve the previous query with help of my project guide wrt mapping in python by placing characters like 'AA' in the dictionary first and then 'A'..( I hope you remember we were discussing this) i tried it out its not working, I am still not getting any op in the console or in the file, sir how can I also prevent serial nos. from having word positions, If you can please look into it also Sir as that also was an added question.
mgj
+2  A: 

I think your code should something like:

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

Can't test this code, so there might be minor issues left, but I think the main principles in it are sound: work on two levels (by line within fine, with \n as separator, and by word within line, with space as separator) and each time use lists (with append and join) rather than build up strings by pieces.

Alex Martelli
Hello Sir..:) Thank you for your answer. I was able to kind of solve the previous query with help of my project guide wrt mapping in python by placing characters like 'AA' in the dictionary first and then 'A'..( I hope you remember we were discussing this with even Mark Byers Sir). Sir are you the author of the book Python Cookbook and Python in a NutShell.. Getting your guidance is an honour Sir...:) Thank you....:) God Bless..
mgj
@mgj, yep I wrote the Cookbook and Nutshell, tx for the kind words. Funny to get kind words and no upvote though;-).
Alex Martelli
@Alex: Don't feel bad, I upvoted you :-). It's funny you found non-upvoting funny but not the use of "Sir".
Alok
@Alok, I do call people "Sir" sometimes (though in conversation rather than writing) so why should I find it funny if others do too?-)
Alex Martelli
+1  A: 

This code will give you the desired output. I added a check for the number at the start of the line, which should not be numbered.

I adapted your original code, which was (mostly) working. You just needed to reset the counter at the end of an input line, and add a newline to your output as well.

#!/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()

I tested this code on the input file you provided and, for the most part, I retained your coding style.

Danilo Piazzalunga
Thank you very much for your time...:) The code works perfectly well..:) Thanks again Danilo..:)
mgj