-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
351 lines (321 loc) · 20.2 KB
/
main.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import hashlib
import os
from scipy.sparse import rand
from xsv import testing_svo_to_xsv
__author__ = 'Matteo'
from nltk import Tree
from viterbi import test_model, train_model
from cky import cky_and_viterbi, test_cky, evaluate, test_cky_with_viterbi
from util import get_pcfg, transform_leaves_def, get_obj_from_file, save_obj_to_file
from config import Config
def main(v, config):
log = config.LOGGER
os.system('clear')
if v == 1:
while True:
print """
####################################################################################
####################### ESERCITAZIONE 1 - VITERBI ##########################
####################################################################################
## ##
## Scelta del pos tag: ##
## 1 => uso i pos tag della prima colonna (Google). ##
## 2 => uso i pos tag della seconda colonna (Penn Tree Bank). ##
## Gestione delle unknown words: ##
## 1 => assumo distribuzione uniforme tra i vari tag. ##
## 2 => assumo distribuzione legata al training set. ##
## 3 => (migliore) assumo distribuzione uguale a quella fornita dalla ##
## distribuzione delle parole che compaiono 1 volta nel training set. ##
## Gestione delle maiuscole e minuscole: ##
## 1 => Prendo tutte le parole e faccio lower su tutte. ##
## 2 => Prendo tutte le parole e faccio lower solo su quelle a inizio frase. ##
## 3 => (comportamento analogo a 2) risolvo l'ambiguità contando ##
## quante volte una parola a inizio frase compare in mezzo alla frase ##
## compare in mezzo alla frase capital e non se compare più volte ##
## non capital, allora la metto non capital, se no la metto capital. ##
## ------------------------------------------------------------------------------ ##
## Riesegui training (develop mode - presentation mode): ##
## 0 => NO. Salta il training sfruttando il dump dell'ultimo training. ##
## 1 => SI: Riscrive le strutture, ignorando le computazioni precedenti. ##
## ------------------------------------------------------------------------------ ##
## Durante la selezione: ##
## q => Torna al menù di scelta dell'esercitazione. ##
## ##
####################################################################################
"""
try:
dummy = raw_input("POST da utilizzare (default 1): ")
if len(dummy) == 0: dummy = 1
if dummy == "q": return
dummy = int(dummy)
Config.POS_TAG = dummy
if dummy != 1 and dummy != 2: raise BaseException
dummy = raw_input("Gestione unknown w (default 3): ")
if len(dummy) == 0: dummy = 3
if dummy == "q": return
dummy = int(dummy)
Config.UNKNOW_WORD = dummy
if dummy != 1 and dummy != 2 and dummy != 3: raise BaseException
dummy = raw_input("Gestione maiuscole (default 2): ")
if len(dummy) == 0: dummy = 2
if dummy == "q": return
dummy = int(dummy)
Config.CAPITALMODE = dummy
if dummy != 1 and dummy != 2 and dummy != 3: raise BaseException
dummy = raw_input("Esegui il training (default 0 (NO)): ")
if dummy.isalpha() and ("s" in dummy.lower() or "y" in dummy.lower()): dummy = 1
elif dummy.isalpha() and "n" in dummy.lower(): dummy = 0
elif dummy == "q": return
elif len(dummy) == 0: dummy = 0
elif dummy.isdigit(): dummy = int(dummy)
train_mode = int(dummy)
if train_mode != 0 and train_mode != 1: raise BaseException
Config.STRING_VERSION = str(Config.POS_TAG)+"."+str(Config.UNKNOW_WORD)+"."+str(Config.CAPITALMODE)
log.info("####################################################")
log.info("## CONFIGURAZIONE (postag.unknown.capital): "+Config.STRING_VERSION+" ##")
log.info("####################################################")
log.info("=======>>>> INIZIO TRAINING <<<<=======")
if train_mode == 1:
transition_probs, emission_probs, single_words_distribution, start_probs = train_model(config)
save_obj_to_file([transition_probs, emission_probs, single_words_distribution, start_probs], config.DUMP_TRAINING)
else:
log.info("Carico il dump dell'ultimo training")
obj = get_obj_from_file(config.DUMP_TRAINING)
transition_probs, emission_probs, single_words_distribution, start_probs = obj[0], obj[1], obj[2], obj[3]
log.info("Dump caricato")
log.info("=======>>>> FINE TRAINING <<<<=======\n")
log.info("=======>>>> INIZIO TESTING <<<<=======")
test_model(config, transition_probs, emission_probs, single_words_distribution)
log.info("=======>>>> FINE TESTING <<<<=======\n")
go_on()
except Exception, e:
print "Opzione non valida", e
elif v == 2:
while True:
print """
####################################################################################
########################## ESERCITAZIONE 2 - CKY #############################
####################################################################################
## ##
## Scelta della versione di CKY: ##
## 1 => CKY senza l'esecuzione di Viterbi. ##
## 2 => CKY con l'esecuzione di Viterbi. ##
## Percentuale di testing e training: ##
## ( 0.0, 1.0 ) ##
## => Esempio: 0.9 = 90% training, 10% testing. ##
## Limita il numero di linee del file: ##
## 0 => Prendo tutte le linee del file. ##
## >1 => Prendo x linee del file del treebank. ##
## ------------------------------------------------------------------------------ ##
## Riesegui testing (develop mode - presentation mode): ##
## 0 => NO: Salta il testing e mostra i risultati sfruttando il dump ##
## dell'ultimo test. ##
## 1 => SI: Riesegue il testing, ignorando le computazioni precedenti e ##
## salvando i risultati su file per valutazioni successive. ##
## ------------------------------------------------------------------------------ ##
## Durante la selezione: ##
## q => Torna al menù di scelta dell'esercitazione. ##
## ##
####################################################################################
"""
try:
dummy = raw_input("Versione di CKY da eseguire (default 1): ")
if len(dummy) == 0: dummy = 1
if dummy == "q": return
dummy = int(dummy)
cky_mode = dummy
if cky_mode != 0 and cky_mode != 1 and cky_mode != 2: raise BaseException
dummy = raw_input("Percentuale training/testing (default 0.9): ")
if len(dummy) == 0: dummy = 0.9
if dummy == "q": return
dummy = float(dummy)
percentage = dummy
dummy = raw_input("Limite il file di treebank (default 0 (NO): ")
if len(dummy) == 0: dummy = -1
if dummy == "q": return
dummy = int(dummy)
limit = dummy
dummy = raw_input("Riesegui per il testing (default 0 (NO)): ")
if dummy.isalpha() and ("s" in dummy.lower() or "y" in dummy.lower()): dummy = 1
elif dummy.isalpha() and "n" in dummy.lower(): dummy = 0
elif dummy == "q": return
elif len(dummy) == 0: dummy = 0
elif dummy.isdigit(): dummy = int(dummy)
testing_mode = int(dummy)
if testing_mode != 0 and testing_mode != 1: raise BaseException
if cky_mode == 1:
log.info("####################################################")
log.info("################### ESECUZIONE #####################")
log.info("####################################################")
log.info("Ottengo la grammatica")
pcfg_cnf_grammar, test_set, training_set, all_sentences, terminal_symbols = get_pcfg(config, config.TREEBANK_FILE, "S", percentage, limit)
log.info("=======>>>> INIZIO TESTING <<<<=======")
log.info("Frasi di training: %s", str(len(training_set)))
log.info("Frasi di testing : %s", str(len(test_set)))
#test_set = [test_set[4], test_set[8], test_set[11], test_set[16], test_set[19], test_set[24], test_set[25], test_set[32], test_set[42], test_set[43], test_set[49], test_set[51], test_set[52], test_set[55], test_set[58], test_set[60], test_set[68], test_set[69], test_set[71], test_set[74], test_set[76], test_set[81], test_set[84], test_set[87], test_set[88], test_set[91], test_set[93], test_set[95], test_set[98], test_set[99], test_set[100], test_set[102], test_set[105], test_set[109]]
if testing_mode == 1:
log.info("Creo gold e test file...potrebbero volerci ORE")
test_cky(config, config.CKY_WITHOUT_VITERBI_GOLD_FILE, config.CKY_WITHOUT_VITERBI_TEST_FILE, test_set, pcfg_cnf_grammar)
log.info("File correttamente creati")
else:
log.info("Eseguo la valutazione")
evaluate(config.CKY_EVALUATOR_PATH, config.EVALUATOR_PARAMETER_FILE, config.CKY_WITHOUT_VITERBI_GOLD_FILE, config.CKY_WITHOUT_VITERBI_TEST_FILE)
log.info("Valutazione completata")
log.info("=======>>>> FINE TESTING <<<<=======\n")
go_on()
elif cky_mode == 2:
log.info("####################################################")
log.info("################### ESECUZIONE #####################")
log.info("####################################################")
log.info("Trasformo il treebank con i POS di Google al posto dei terminali")
transform_leaves_def(config, config.TREEBANK_FILE, config.TREEBANKGOOGLE_FILE)
log.info("Treebank trasformato")
log.info("Ottengo la grammatica")
pcfg_cnf_grammar, test_set, training_set, all_sentences, terminal_symbols, original_testing_set = get_pcfg(config, config.TREEBANKGOOGLE_FILE, "S", percentage, limit, config.TREEBANK_FILE)
log.info("=======>>>> INIZIO TESTING <<<<=======")
log.info("Frasi di training: %s", str(len(training_set)))
log.info("Frasi di testing : %s", str(len(test_set)))
if testing_mode == 1:
log.info("Creo gold e test file...potrebbero volerci ORE")
test_cky_with_viterbi(config, pcfg_cnf_grammar, test_set, config.CKY_WITH_VITERBI_GOLD_FILE, config.CKY_WITH_VITERBI_TEST_FILE, original_testing_set)
log.info("File correttamente creati")
else:
log.info("Eseguo la valutazione")
evaluate(config.CKY_EVALUATOR_PATH, config.EVALUATOR_PARAMETER_FILE, config.CKY_WITH_VITERBI_GOLD_FILE, config.CKY_WITH_VITERBI_TEST_FILE)
log.info("Valutazione completata")
log.info("=======>>>> FINE TESTING <<<<=======\n")
go_on()
else:
print "Opzione non valida"
except Exception, e:
print "Opzione non valida", e
elif v == 3:
while True:
print """
####################################################################################
###################### ESERCITAZIONE 3 - SVO to XSV ##########################
####################################################################################
## ##
## Scelta della frase: ##
## 0 => Inserisci una frase generica. ##
## 1 => Prova l'esecuzione con qualche frase di testing. ##
## 2 => Seleziona una frase a caso dal treebank e prova con quella ##
## Disegna GRAFICAMENTE entrambi gli alberi: ##
## 0 => Non disegna nella finestra grafica nessun albero. ##
## 1 => Genera l'albero manipolato ma non quello originale. ##
## 2 => Genera l'albero originale e quello manipolato. (per proseguire ##
## oltre durante l'esecuzione, bisogna chiudere la finestra che ##
## visualizza l'albero originale disegnato e attendere la generazione ##
## dell'albero manipolato). ##
## ------------------------------------------------------------------------------ ##
## Durante la selezione: ##
## q => Torna al menù di scelta dell'esercitazione. ##
## ##
####################################################################################
"""
try:
dummy = raw_input("Scelta della frase (default 1): ")
if len(dummy) == 0: dummy = 1
if dummy == "q": return
dummy = int(dummy)
sentence_choice = dummy
if sentence_choice != 0 and sentence_choice != 1 and sentence_choice != 2: raise BaseException
dummy = raw_input("Disegna graficamente (default 2): ")
if len(dummy) == 0: dummy = 2
if dummy == "q": return
dummy = int(dummy)
graphic_draw = dummy
if graphic_draw != 0 and graphic_draw != 1 and graphic_draw != 2: raise BaseException
log.info("####################################################")
log.info("################### ESECUZIONE #####################")
log.info("####################################################")
if sentence_choice == 0:
sentence = raw_input("Inserisci una frase: ")
t, nt = testing_svo_to_xsv(config, sentence, t = None)
if t != None:
config.LOGGER.info("Frase SVO:"+str(t.leaves()))
if graphic_draw > 0 and t != None:
t.draw()
if nt != None:
config.LOGGER.info("Frase XSV:"+str(nt.leaves()))
if graphic_draw > 1 and nt != None:
nt.draw()
go_on()
elif sentence_choice == 1:
sentences = ["Io mangio la mela molto velocemente .", "Luca e Paola corsero per raggiungere il treno in partenza .",
"Infine i miei genitori consegnarono appositamente i soldi raccolti per riaprire la palestra ."]
for s in sentences:
log.info("Frase comune: "+str(s))
t, nt = testing_svo_to_xsv(config, s, t = None)
if t != None:
config.LOGGER.info("Frase SVO:"+str(t.leaves()))
if graphic_draw > 0 and t != None:
t.draw()
if nt != None:
config.LOGGER.info("Frase XSV:"+str(nt.leaves()))
if graphic_draw > 1 and nt != None:
nt.draw()
raw_input("Premi invio per continuare...")
elif sentence_choice == 2:
tr = Tree.fromstring(open(config.TREEBANK_FILE).readlines()[rand(0, len(open(config.TREEBANK_FILE).readlines()))].decode('utf-8'))
sentence = tr.leaves()
log.info("Frase dal treebank: "+str(sentence))
t, nt = testing_svo_to_xsv(config, sentence, tr)
if tr != None:
config.LOGGER.info("Frase SVO:"+str(tr.leaves()))
if graphic_draw > 0 and tr != None:
tr.draw()
if nt != None:
config.LOGGER.info("Frase XSV:"+str(nt.leaves()))
if graphic_draw > 1 and nt != None:
nt.draw()
go_on()
else:
raise TypeError('Scelta non valida')
log.info("=======>>>> FINE TESTING <<<<=======\n")
except Exception, e:
print "Opzione non valida", e
else:
os.system('clear')
print "Opzione non valida"
def go_on():
raw_input("Premi invio per continuare...")
os.system('clear')
def executor(config):
os.system('clear')
while True:
print """
####################################################################################
####### Esercitazioni - Matteo Madeddu - Sistemi Cognitivi - Modulo 1 #######
####################################################################################
## ##
## 1 => POS Tagger ##
## 2 => CKY ##
## 3 => SVO to XSV ##
## ------------------------------------------------------------------------------ ##
## q => Esci ##
## ##
####################################################################################
"""
try:
es = raw_input("Apri esercitazione n.: ")
if len(es) == 0: es = 1
if es == "q":
break
else:
es = int(es)
main(es, config)
os.system('clear')
except:
print "\nOpzione non valida"
go_on()
os.system('clear')
exit(1)
if __name__ == '__main__':
# creo la configurazione
config = Config()
# imposto un alias per il logging
log = config.LOGGER
executor(config)