-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuse_lm.py
118 lines (81 loc) · 3.44 KB
/
use_lm.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
from scipy.stats import entropy
import tensorflow as tf
import lstm_model
from encode_characters import InputEncoder, OutputEncoder, character_to_features
input_enc = InputEncoder()
output_enc = OutputEncoder()
input_enc.load("input_encoder.pickle")
output_enc.load("output_encoder.pickle")
bilstm_model = lstm_model.BiLSTM_Model.load('bilstm_model_512.h5',
input_enc, output_enc)
VERBOSE = False # False -- output for matplotlib :)
ORDER = 15 # model order XXX how to get it from the loaded model?
TH = 0.001 # minimum prob for a tip to consider
TO_ESTIMATE = '● '
print('\n\n\n')
s = "Miután mind a tanításra, mind a predikcióra megvannak a szükséges kényelmi metódusok, általában nem kell bajlódnunk a sztringkódoló használatával. OCR-hiba: nem krumpli, hanem krumpIi. A majornmal hasonlítjuk össze. Legalább 17500 vagy 9734 fajtája van. És ha széttöre dezik a szó?"
# XXX "szőringkódoló" és "sztringhódoló" xdlol
# XXX írásjelek eléggé felcserélhetők: ? vs ,
# XXX nagybetűs rövidítés -- hát ja, bármi lehet kb.
# XXX ott van az (egykarakteres) OCR-hiba, ahol 100%-os tipp van,
# körülötte meg teljes bizonytalanság!!! EZ FONTOS!
# -- vagy ez trivi, mert pont ezt mondja meg a perplexitás??? XXX
# XXX töredezettség... nagy zavar a kornyeken
# XXX számok -- barmi lehet
#
# XXX mindig ra kene jonni apatternbol, hogy mit erdemes megprobalni
# EZT meg lehetne valahogy tanulni?? :) neuralisan?? :)
def vis(char):
"""Make char visible."""
return '␣' if char == ' ' else char
# data arrays for matplotlib
y_best = []
y_entr = []
x_labels = []
def char_prediction(text, target_index=0):
"""Return best_char, best_prob and entropy for char at `text[target_index]`."""
res = bilstm_model.estimate_alternatives(text, target_index)
PROB = 1
entr = entropy([x[PROB] for x in res.items()])
tips = list(filter(lambda x: x[PROB] > TH,
sorted(res.items(), key=lambda x: x[PROB], reverse=True)))
best, best_prob = tips[0]
return best, best_prob, entr
for ti in range(len(s)): # ti = target index = we estimate this char
best, best_prob, entr = char_prediction(s, ti)
left = max(0, ti - ORDER)
right = min(len(s), ti + 1 + ORDER)
msg = "OK" if best == s[ti] else "ERR!"
padding_size = min(ORDER, ti)
padding = ' ' * padding_size
if VERBOSE:
print(f'{s[left:ti]}{TO_ESTIMATE}{s[ti+1:right]}')
print(f'{padding}{vis(best)} -- {msg} -- H={entr:.4f}')
for char, prob in tips:
print(f'{vis(char)} {prob:.4f}')
print()
else:
curr = s[ti]
best_print = '' if curr == best else best
print(f'{vis(curr)}\t{vis(best_print)}\t{best_prob:.4f}\t{entr:.4f}\t{msg}')
label = curr if curr == best else f'{curr}..{best}'
y_best.append(best_prob)
y_entr.append(entr)
x_labels.append(label)
import matplotlib.pyplot as plt
import numpy as np
LEN = 280
y_best = y_best[0:LEN]
y_entr = y_entr[0:LEN]
x_labels = x_labels[0:LEN]
x = range(len(x_labels))
plt.rcParams["figure.figsize"] = (30, 5)
fig, ax = plt.subplots() # XXX mi a frasz ez a plt / fig / ax ? sose ertem..
ax.plot(x, y_best, y_entr)
plt.xticks(x, x_labels, rotation='vertical', fontsize=6)
ax.set(xlabel='',
ylabel='entrópia és legvalszg tipp valszge',
title='kétirányú LSTM modell karakterjóslása')
ax.grid()
fig.savefig("use_lm.png", dpi=300)
# plt.show()