Wednesday, July 22, 2015

თავი 9 (9,2 - 9,3)



9.2 ლექსიკონები და ფაილები

ლექსიკონები ხშირად გამოიყენება ტექსტურ ფაილში განმეორებადი სიტყვების დასათვლელად. დავიწყოთ ძალიან მარტივი ფაილით, რომლის სიტყვებიც აღებულია რომეო და ჯულიეტადან. http://shakespeare.mit.edu/Tragedy/romeoandjuliet/romeo_juliet.2.2.html

პირველ მაგალითად გამოვიყენებთ ტექსტის შემოკლებულ და გამარტივებულ ვერსიას სასვენი ნიშნების გარეშე. მოგვიანებით ვიმუშავებთ ამ ტექსტთან სასვენ ნიშნებიანად.

But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief

დავწერთ პითონის პროგრამას ფაილის ხაზებად წასაკითხად, ხაზების სიტყვის სიებად დასაყოფად და ხაზში ყოველ სიტყვას დავამარყუჟებთ და დავთვლით ლექსიკონის გამოყენებით.
ვნახავთ, რომ გვაქვს ორი for მარყუჟი. გარე მარყუჟი კითხულობს ფაილის ხაზებს და შიდა მარყუჟი ამეორებს სიტყვებს კონკრეტულ ხაზზე, ესაა მაგალითი ჩაბუდებული მარყუჟების ნიმუშისა, იმიტომ რომ ერთი მარყუჟია გარე(outer) და მეორე - შიდა(inner).
იმის გამო, რომ შიდა  მარყუჟი აკეთებს ყველა გამეორებას ყოველ ჯერზე, გარე მარყუჟი აკეთებს მხოლოდ ერთ გამეორებას. ორი ჩაბუდებული მარყუჟის გაერთიანებით ვრწმუნდებით, რომ მითითებულ ფაილში  ვითვლით ყოველ სიტყვას ყოველ ხაზში.

fname = raw_input('Enter the file name: ')
try:
            fhand = open(fname)
except:
            print 'File cannot be opened:', fname
            exit()
counts = dict()
for line in fhand:
            words = line.split()
            for word in words:
                        if word not in counts:
                                    counts[word] = 1
                        else:
                                    counts[word] += 1
print counts
 
პროგრამას როცა გავუშვებთ, დავინახავთ a raw dump of all of the counts in unsorted hash order. (romeo.txt ხელმისაწვდომია www.py4inf.com/code/romeo.txt)
 
python count1.py
Enter the file name: romeo.txt
{'and': 3, 'envious': 1, 'already': 1, 'fair': 1,
'is': 3, 'through': 1, 'pale': 1, 'yonder': 1,
'what': 1, 'sun': 2, 'Who': 1, 'But': 1, 'moon': 1,
'window': 1, 'sick': 1, 'east': 1, 'breaks': 1,
'grief': 1, 'with': 1, 'light': 1, 'It': 1, 'Arise': 1,
'kill': 1, 'the': 3, 'soft': 1, 'Juliet': 1}
 
ცოტა მოუხერხებელია შეხედო და ლექსიკონის მთვლელში იპოვნო ყველაზე ხშირად გამოყენებული სიტყვა. უფრო  სასარგებლო შედეგის მისაღებად საჭიროა დავამატოთ კოდი.



9.3 დამარყუჟება და ლექსიკონები

for მარყუჟში ლექსიკონს თუ იყენებ, როგორც თანრიგს, ეს აბრუნებს ლექსიკონის გასაღებებს, მარყუჟი ბეჭდავს თითოეულ გასაღებს და შესაბამის მნიშვნელობას:

counts = { 'chuck' : 1 , 'annie' : 42, 'jan': 100}
for key in counts:
print key, counts[key]

ესეც შედეგი:

jan 100
chuck 1
annie 42
 
კიდევ ერთხელ, გასაღებები არ არის რიგის მიხედვით.
შეგვიძლია გამოვიყენოთ ნიმუში, რომ შევასრულოთ მარყუჟის დაწერის სხვადასხვა სტილი. მაგალითად თუ გვინდა ლექსიკონში ვიპოვნოთ მასალა, რომელსაც ექნება ათზე მეტი მნიშვნელობა, უნდა დავწეროთ შემდეგი კოდი:

counts = { 'chuck' : 1 , 'annie' : 42, 'jan': 100}
for key in counts:
      if counts[key] > 10 :
            print key, counts[key]

for მარყუჟი ლექსიკონში ამეორებს გასაღებებს, ამიტომ უნდა გამოვიყენოთ ინდექს ოპერატორი, რომ ვიპოვნოთ შესაბამისი მნიშვნელობა ყოველი გასაღებისთვის. ასეთი იქნება შედეგი:

jan 100
annie 42

ვხედავთ მარტო იმ შედეგებს, რომელიც მეტია ასზე.
გასაღებების ანბანის მიხედვით ამობეჭდვა თუ გინდა, პირველად ლექსიკონში უნდა გააკეთო გასაღებების სია keys მეთოდის გამოყენებით, და შემდეგ გაასწორო ეს სია და დაამარყუჟო გასწორებული სია.

counts = { 'chuck' : 1 , 'annie' : 42, 'jan': 100}
lst = counts.keys()
print lst
lst.sort()
for key in lst:
            print key, counts[key]

შედეგი:

['jan', 'chuck', 'annie']
annie 42
chuck 1
jan 100

პირველად ხედავ  გასაღებების სიას, რომელიც ავიღეთ keys მეთოდის დახმარებით დაულაგებელია. შემდეგ ვხედავთ უკვე დალაგებულს for მარყუჟის დახმარებით.