index koincidence pro kratke zpravy
[krypto.git] / referencni.py
1 #!/usr/bin/env python
2
3 """Modul pro praci s referencnimi tabulkami."""
4
5 import pickle
6 from ocesavac import ocesat
7 import codecs
8 from koincidence import index_koincidence2
9 from spolecne import ABECEDA, MABECEDA
10
11 def nova_tabulka(tabulka, abc=MABECEDA):
12     """Z tabulky cetnosti vyskytu udela tabulku percentualni cetnosti."""
13     celkem = sum(sum(tab2.values()) for tab2 in tabulka.values())
14     if celkem != 0:
15         for i in abc:
16             for j in abc:
17                 tabulka[i][j] /= float(celkem)
18     return tabulka
19
20 def poradi_dle_frekvence(freq):
21     return sorted(freq.keys(), key=freq.get, reverse=True)
22
23 class reference:
24     def __init__(self, tref, komentar=''):
25         self.abeceda = tref.abeceda
26         self.poradi = poradi_dle_frekvence(tref.frekvence)
27         self.tabulka = nova_tabulka(tref.tabulka, tref.abeceda)
28         self.komentar = komentar
29
30 class treference:
31     def __init__(self, mezery=True):
32         if mezery:
33             self.abeceda = MABECEDA
34         else:
35             self.abeceda = ABECEDA
36         self.mezery = mezery
37         self.frekvence = dict()
38         for c in self.abeceda:
39             self.frekvence[c] = 0
40         self.tabulka = dict()
41         for i in self.abeceda:
42             self.tabulka[i] = dict()
43             for j in self.abeceda:
44                 self.tabulka[i][j] = 0
45         self.soubory = []
46         
47     def pridej(self, soubor):
48         f = codecs.open(soubor, encoding='UTF-8')
49         text = ocesat(f.read(), self.mezery)
50         f.close()
51         for i in range(len(text) - 1):
52             self.tabulka[text[i]][text[i+1]] += 1
53             self.frekvence[text[i]] += 1
54         else:
55             self.frekvence[text[i+1]] += 1
56         self.soubory.append(soubor)
57
58 def uloz(co, kam):
59     soubor = open(kam, 'w')
60     pickle.dump(co, soubor)
61     soubor.close()
62
63 def nacti(odkud):
64     return pickle.load(open(odkud))
65
66 def tiskni(sref):
67     r = nacti(sref)
68     slovnik = dict(zip(r.abeceda, r.frekvence))
69     for i in range(len(r.abeceda)):
70         print "{0} {1:>6.2%}   {2} {3:>6.2%}".format(
71             r.abeceda[i],
72             r.frekvence[i],
73             r.poradi[i],
74             slovnik[r.poradi[i]] )
75     print " "
76     print "Index koincidence: {0:>5.2%}".format(r.index_koinc)
77     print " "
78     for char in r.abeceda:
79         print char + " " + " ".join(
80             ["{:0>5.2f}".format(r.tabulka[char][ch2] * 1000)
81                 for ch2 in r.abeceda])
82
83 def prumerny_index(tref):
84     suma = 0
85     for soubor in tref.soubory:
86         f = codecs.open(soubor, encoding='UTF-8')
87         text = ocesat(f.read(), tref.mezery)
88         f.close()
89         suma += index_koincidence2(text[:len(text)/2], text[len(text)/2:])
90     return float(suma)/len(tref.soubory)