Friday, July 24, 2015

თავი 9 (9,4 - 9,5)



9.4 Advanced text parsing

ზემოთ მაგალითში ვიყენებდით  ფაილს romeo.txt. ფაილი გავხადეთ მარტივი ყველა სასვენი ნიშნის წაშლით. ორიგინალ ტექსტს აქვს ბევრი სასვენი ნიშანი:

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,

მაშინ, როცა  ფუნქცია  ეძებს ჰარებს და სიტყვებს ექცევა, როგორც ჰარებით გაყოფილ სიმბოლოებს, სიტყვები „მსუბუქი!“ და „მსუბუქი“ უნდა განვიხილოთ განსხვავებულ სიტყვებად და გავაკეთოთ სხვა და სხვა ლექსიკონი თითოეული სიტყვისთვის.
მაშინ, როცა ფაილში არის დიდი ასოები,  who” და “Who უნდა განვიხილოთ, როგორც განსხვავებული სიტყვები განსხვავებული მთვლელებით.
შეგვიძლია გადავჭრათ ორივე პრობლემა სტრინგის მეთოდების  lower, punctuation და translate - ის გამოყენებით. translate არის ყველაზე დახვეწილი მეთოდი. აქაა translate - ის დოკუმენტაცია:

string.translate(s, table[, deletechars])



წაშალე ყველა სიმბოლო s - იდან რომელიც არის deletechars - ში(თუ არსებობს) და შემდეგ table - ის გამოყენებით გადათარგმნე სიმბოლოები. რომელიც უნდა იყოს 256 სიმბოლოიანი სტრინგი ნათარგმნი ყოველი სიმბოლოს მნიშვნელობისთვის და ინდექსირებული თავისი რიგით. table თუ არის None, მაშინ მხოლოდ სიმბოლოები წაიშლება.

არ მივუთითებთ table - ს, მაგრამ გამოვიყენებთ deletechars პარამეტრს ყველა სასვენი ნიშანის  წასაშლელად. პითონი გვაჩვენებს  სიმბოლოების სიას, რომელიც განიხილება სასვენ ნიშნებად:

>>> import string
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

გადავაკეთოთ პროგრამა:


import string # New Code
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:
            line = line.translate(None, string.punctuation) # New Code
            line = line.lower() # New Code
            words = line.split()
            for word in words:
                        if word not in counts:
                                    counts[word] = 1
                        else:
                                    counts[word] += 1
print counts

გამოვიყენეთ translate ყველა სასვენი ნიშნის წასაშლელად და lower - ხაზში სიმბოლოების  დასაპატარავებლად. სხვამხრივ პროგრამა უცვლელია. პითონის 2.5 და უფრო ადრეულ ვერსიებში, translate  პირველ პარამეტრად None - ს არ იღებს, ასე რომ translate - ის გამოსაძახებლად გამოიყენე ეს კოდი:

print a.translate(string.maketrans(' ',' '), string.punctuation

"პითონის  ხელოვნების" ან "პითონიკურად ფიქრის" შესწავლის ნაწილია მიხვედრა, რომ პითონს ხშირად აქვს ჩაშენებული შესაძლებლობები ბევრი მონაცემის ანალიზის პრობლემისთვის. დროთა განმავლობაში ნახავ საკმარის მაგალითებს და წაიკითხავ საკმარის დოკუმენტაციას, რომ ისწავლო სად ნახო ვინმეს აქვს თუ არა დაწერილი კოდი, რამელიც შენს სამუშაოს უფრო ადვილს გახდის.
ესაა შედეგის შემცირებული ვერსია:

Enter the file name: romeo-full.txt
{'swearst': 1, 'all': 6, 'afeard': 1, 'leave': 2, 'these': 2,
'kinsmen': 2, 'what': 11, 'thinkst': 1, 'love': 24, 'cloak': 1,
a': 24, 'orchard': 2, 'light': 5, 'lovers': 2, 'romeo': 40,
'maiden': 1, 'whiteupturned': 1, 'juliet': 32, 'gentleman': 1,
'it': 22, 'leans': 1, 'canst': 1, 'having': 1, ...}


შედეგში ყურება არც ისე მოხერხებულია . შეგვიძლია გამოვიყენოთ პითონი, რომ მოგვცეს ზუსტად ის, რაც გვინდა, მაგრამ ამის გასაკეთებლად უნდა ვისწავლოთ პითონის tuples. ამ მაგალითს tuples სწავლის შემდეგ განვიხილავთ.

9.5 გამართვა

როგორც იცი დიდ მონაცემებთან მუშაობა და მისი ამობეჭდვით გამართვა  შეიძლება იყოს მოუქნელი. აქაა რამდენიმე რჩევა დიდი მონაცემების გასამართად:

შევამციროთ ინფორმაციის ზომა:  თუ შესაძლებელია შეამცირე მონაცემების ზომა. მაგალითად, პროგრამა თუ კითხულობს ტექსტურ ფაილს, დაიწყე პირველი ათი ხაზით ან პატარა მაგალითით. ასევე შეგიძლია ფაილები შეასწორო ან(უკეთესი) შეასწორო პროგრამა ისე, რომ წაიკითხოს პირველი n  ხაზები.
შეცდომა თუ მოხდება, შეცდომის ცხადად საჩვენებლად შეგიძლია შეამცირო n და შემდეგ, შეცდომის საპოვნელად თანდათან გაზარდო n .

შეამოწმე ტიპები და რეზიუმეები(summaries): მთლიანი მონაცემების ამობეჭდვის და შემოწმების ნაცვლად,  განიხილე მონაცემის რეზიუმე: მაგალითად, ლექსიკონში ელემენტების რაოდენობა ან სიის ციფრების ჯამი.
შესრულებისას შეცდომას ძირითადად იწვევს მნიშვნელობის არასწორი ტიპი. ამ ტიპის შეცდომის გასამართად, ხშირად საკმარისია მნიშვნელობის ტიპის ამობეჭდვა.

დაწერე "თვითშემოწმება":    ზოგჯერ შესაძლებელია ისეთი კოდის დაწერა, რომელიც შეცდომებს ავტომატურად შეამოწმებს. მაგალითად, სიის ციფრების საშუალო არითმეტიკულს  თუ ითვლი, შეგიძლია შეამოწმო შედეგი,რომელიც არ უნდა იყოს უფრო მეტი, ვიდრე სიის უდიდესი ელემენტი და არ უნდა იყოს უფრო მცირე, ვიდრე სიის უმცირესი ელემენტი. ამას ეძახიან "ფსიქიკურ შემოწმებას", რადგან პოულობს შეცდომას, რომელიც "აბსოლუტურად არალოგიკურია"
სხვა სახის შემოწმება ადარებს ორი სხვადასხვა გამოთვლის შედეგებს, რომ ნახოს  შეესაბამებიან თუ არა ერთმანეთს. ამას ეწოდება "თანმიმდევრული შემოწმება."

შედეგის ამობეჭდვა:    ფორმატირებისას გამართვის ამონაბეჭდმა შეცდომის პოვნა შეიძლება გაადვილოს.
"ხარაჩოების" შენებაში დახარჯულ დროს გამართვის დროის შემცირება შეუძლია.