# # Motore di disambiguazione - Versione 2.0 # # Modulo 6: # # - disambiguazione esterna dei numerali e interna di nomi, aggettivi, ecc. # # # I punti in cui si deve intervenire per definire la propria regola sono 3: # (1) Condizione iniziale # (2) Regola vera e propria # (3) Eco della regola # function assegna(campo, pos, end, cpn, cp, csp, sp, spl, cl) { cpn = 1 cp = split (campo, sp, /\);\(/) csp = split (sp[1], spl, /\(/) pos = pos "," while (cpn <= cp) { if (cpn > cp) break if (sp[cpn] ~ pos) { if (sp[cpn] ~ /\)$/ || sp[cpn] ~ /\)$/) { cl = sp[cpn] sub (/\)/, "", cl) print spl[1] cl } else if (cpn == 1) print spl[1] spl[2] end else print spl[1] sp[cpn] end } cpn++ } } BEGIN { RS = "" # gestisce l'input come se fosse formato da una riga unica ORS = " " # inserisce uno spazio alla fine di ogni 'print' nf = 1 # # Feature Declaration # E' possibile creare regole basate su features numeriche o sigle. # pers_1 = ",1," pers_2 = ",2," pers_3 = ",3," gend_masc = ",4," gend_fem = ",5," gend_c = ",4;5," numb_sg = ",6," numb_pl = ",7," numb_n = ",6;7," degr_pos = ",8," degr_comp = ",9," degr_sup = ",10," loc_const = ",11," loc_two = ",12," loc_three = ",13," loc_four = ",14," loc_five = ",15," loc_six = ",16," loc_seven = ",17," loc_eight = ",18," loc_nine = ",19," # ---------------- n_c = ",20," n_p = ",21," adj = ",26," PD_dem_s = ",30," PD_dem_w = ",31," PD_ind = ",32," PD_pos_s = ",33," PD_pos_w = ",34," PD_int = ",35," PD_rel = ",36," PD_per_s_n = ",37," PD_per_s_o = ",38," PD_per_w_o = ",39," PD_exc = ",40," adv_g = ",45," adv_p = ",46," con_c = ",50," con_s = ",51," adp_pre = ",56," adp_post = ",57," art_d = ",60," art_i = ",61," num_c = ",64," num_o = ",65," intj = ",68," pun_f = ",70," pun_n = ",71," r_frg = ",75," r_abb_ = ",76," r_for = ",77," r_epe = ",78," v_m_f_ind_pr = ",111," v_m_f_ind_im = ",112," v_m_f_ind_pa = ",113," v_m_f_ind_fu = ",114," v_m_f_sub_pr = ",115," v_m_f_sub_im = ",116," v_m_f_cnd_pr = ",117," v_m_f_imp_pr = ",118," v_m_n_i_pr = ",121," v_m_n_p_pr = ",122," v_m_n_p_pa = ",123," v_m_n_g_pr = ",124," v_a_f_ind_pr = ",211," v_a_f_ind_im = ",212," v_a_f_ind_pa = ",213," v_a_f_ind_fu = ",214," v_a_f_sub_pr = ",215," v_a_f_sub_im = ",216," v_a_f_cnd_pr = ",217," v_a_f_imp_pr = ",218," v_a_n_i_pr = ",221," v_a_n_p_pr = ",222," v_a_n_p_pa = ",223," v_a_n_g_pr = ",224," v_d_f_ind_pr = ",311," v_d_f_ind_im = ",312," v_d_f_ind_pa = ",313," v_d_f_ind_fu = ",314," v_d_f_sub_pr = ",315," v_d_f_sub_im = ",316," v_d_f_cnd_pr = ",317," v_d_f_imp_pr = ",318," v_d_n_i_pr = ",321," v_d_n_p_pr = ",322," v_d_n_p_pa = ",323," v_d_n_g_pr = ",324," } # { while (nf <= NF) { # !*!* Inizio regole di disambiguazione *!*! # # Creazione di 3 puntatori: # 'nf' -> punta al campo corrente # 'bw' -> punta al campo che precede 'nf' di N posizioni # 'fw' -> punta al campo che segue 'nf' di N posizioni # campo = $nf fw = nf fw++ if ($fw ~ /\@/ || $fw ~ /\%/ || $fw ~ /\$/ || $fw ~ /\/ || $fw ~ /\#/) fw++ if ($fw ~ /\@/ || $fw ~ /\%/ || $fw ~ /\$/ || $fw ~ /\/ || $fw ~ /\#/) fw++ if ($fw ~ /\@/ || $fw ~ /\%/ || $fw ~ /\$/ || $fw ~ /\/ || $fw ~ /\#/) fw++ # omette le stringhe contenenti: # '@' # '%' # '$' # '' # '#' bw = nf if (nf >=2) bw-- if (($bw ~ /\@/ || $bw ~ /\%/ || $bw ~ /\$/ || $bw ~ /\/ || $bw ~ /\#/) && bw > 2) bw-- if (($bw ~ /\@/ || $bw ~ /\%/ || $bw ~ /\$/ || $bw ~ /\/ || $bw ~ /\#/) && bw > 2) bw-- if (($bw ~ /\@/ || $bw ~ /\%/ || $bw ~ /\$/ || $bw ~ /\/ || $bw ~ /\#/) && bw > 2) bw-- # omette le stringhe contenenti: # '@' # '%' # '$' # '' # '#' if (campo ~ /\@/ || campo ~ /\%/ || campo ~ /\$/ || campo ~ /\/ || campo ~ /\#/) { print campo nf++ } # omette le stringhe non ambigue: else if (campo !~ /\);\(/ && campo !~ /[0-9];[0-9]/) { print campo nf++ } # (2) Regola vera e propria # # Regola per la disambiguazione esterna di "perch'" # else if (campo ~ /^perch'_/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" nf++ if (($bw ~ /^:_/ && $fw ~ /^io_/) || ($bw ~ /^[cr]agione_/ && $fw ~ /^elli_/)) { assegna(campo, "36", end) } else if ($bw ~ /^sovente_/) { assegna(campo, "45", end) } else if (($bw ~ /^:_/ && ($fw ~ /^ella_/ || $fw ~ /^ogni_/))) { assegna(campo, "47", end) } else { assegna(campo, "51", end) } } # (2) Regola vera e propria # # Regola per la disambiguazione esterna di "Perch'" # else if (campo ~ /^Perch'_/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" nf++ if ($bw ~ /^!_/ && $fw ~ /^io_/) { assegna(campo, "36", end) } else if (($bw ~ /^_/ && $fw ~ /^io_/) || ($bw ~ /^._/ && $fw ~ /^i'_/)) { assegna(campo, "51", end) } else { assegna(campo, "47", end) } } # (2) Regola vera e propria # # Regola per la disambiguazione esterna di 'perch' # else if (campo ~ /^perch_/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" bbw = bw bbw-- ffw = fw ffw++ nf++ if (($bw ~ /^ragione_/ && ($fw ~ /^fu_/ || $fw ~ /^quello_/ || $fw ~ /^fece_/ || $fw ~ /^il_/)) || ($bw ~ /^cagioni_/ && $fw ~ /^'l_/)) { assegna(campo, "36", end) } else if ($bw ~ /^!_/ || $bw ~ /^il_/ || $bw ~ /^domandava_/ || $bw ~ /^maraviglia_/ || $fw ~ /^ridea_/ || $fw ~ /^desiderate_/ || ($bw ~ /^,_/ && ($fw ~ /^mi_/ || $fw ~ /^piangi_/ || $fw ~ /^siete_/ || $fw ~ /^ti_/ || $fw ~ /^tieni_/)) || ($bbw ~ /^mio_/ && $bw ~ /^,_/ && $fw ~ /^non_/ && $ffw ~ /^mi_/) || ($bw ~ /^:_/ && ($fw ~ /^hai_/ || $fw ~ /^no_/)) || ($bw ~ /^e_/ && $fw ~ /^\._/) || ($bw ~ /^sapere_/ && $fw ~ /^,_/) || ($bw ~ /^e_/ && $fw ~ /^_/) || ($bw ~ /^E_/ && $fw ~ /^'l_/) || ($bw ~ /^amar_/ && $fw ~ /^me_/)) { assegna(campo, "45", end) } else if ($fw ~ /^Mamone_/ || ($bw ~ /^?_/ && $fw ~ /^molte_/) || ($bw ~ /^;_/ && ($fw ~ /^tanto_/ || $fw ~ /^le_/ || $fw ~ /^,_/ || $fw ~ /^ci_/)) || ($bw ~ /^:_/ && ($fw ~ /^avete_/ || $fw ~ /^[ls]e_/ || $fw ~ /^d[ia]_/ || $fw ~ /^altra_/ || $fw ~ /^non_/ || $fw ~ /^,_/ || $fw ~ /^neuno_/ || $fw ~ /^tant[e']_/ || $fw ~ /^l[ia]_/ || $fw ~ /^conosco_/ || $fw ~ /^quella_/ || $fw ~ /^saria_/ || $fw ~ /^tu_/))) { assegna(campo, "47", end) } else { assegna(campo, "51", end) } } # (2) Regola vera e propria # # Regola per la disambiguazione esterna di 'perch' # else if (campo ~ /^perch_/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" nf++ if ($bw ~ /^;_/ && $fw ~ /^'l_/) { assegna(campo, "47", end) } else if (($bw ~ /^,_/ && $fw !~ /^facesse_/ && $fw !~ /^villana_/ && $fw !~ /^vedea_/) || ($bw ~ /^[Ee]_/ && $fw ~ /^piangi_/)) { assegna(campo, "45", end) } else { assegna(campo, "51", end) } } # (2) Regola vera e propria # # Regola per la disambiguazione esterna di 'Perch' # else if (campo ~ /^Perch_/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" ffw = fw ffw++ nf++ if (($bw ~ /^[\?\.]_/ && $fw ~ /^non_/) || ($bw ~ /^-_/ && $fw ~ /^dite_/) || ($bw ~ /^._/ && $fw ~ /^domande_/) || ($bw ~ /^_/ && ($fw !~ /^tu_/ && $fw !~ /^se_/) || ($fw ~ /^non_/ && $ffw ~ /^battete_/)) || $fw ~ /^se'_/ || $fw ~ /^m'_/) { assegna(campo, "45", end) } else if ($fw ~ /^sacciate_/ || ($fw ~ /^la_/ && $ffw ~ /^Fede_/) || ($bw ~ /^\._/ && $fw ~ /^l'_/ && $ffw ~ /^uno_/) || ($bw ~ /^_/ && ($fw ~ /^tu_/ || $fw ~ /^se_/))) { assegna(campo, "51", end) } else { assegna(campo, "47", end) } } # (2) Regola vera e propria # # Regola per la disambiguazione esterna di 'Perch' # else if (campo ~ /^Perch_/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" nf++ if ($bw ~ /^_/ && ($fw ~ /^semo_/ || $fw ~ /^s_/)) { assegna(campo, "45", end) } else { assegna(campo, "51", end) } } # (2) Regola vera e propria # # Regola per la disambiguazione esterna di 'perk' # else if (campo ~ /^perk_/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" nf++ if ($bw ~ /^e_/ || $fw ~ /^non_/ || $fw ~ /^stai_/) { assegna(campo, "45", end) } else { assegna(campo, "51", end) } } # (2) Regola vera e propria # # Regola per la disambiguazione esterna di 'cui' # else if (campo ~ /^cui_/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" ffw = fw ffw++ nf++ if ($fw ~ /^e_/ || $fw ~ /^dolenti_/ || $fw ~ /^vole_/ || $fw ~ /^compagnia_/ || ($bw ~ /^a_/ && $fw ~ /^ne_/) || ($bw ~ /^e_/ && $fw ~ /^,_/) || ($fw ~ /^io_/ && $ffw ~ /^voglio_/)) { assegna(campo, "32", end) } else if ($bw ~ /^Per_/ || $bw ~ /^Or_/ || $fw ~ /^date_/ || $fw ~ /^convegna_/ || $fw ~ /^od_/ || ($bw ~ /^a_/ && ($fw ~ /^,_/ || $fw ~ /^avea_/ || $fw ~ /^_/)) || ($bw ~ /^con_/ && $fw ~ /^l'_/) || ($fw ~ /^fosse_/ && $ffw ~ /^lo_/) || ($fw ~ /^la_/ && ($ffw ~ /^mia_/ || $ffw ~ /^dico_/))) { assegna(campo, "35", end) } else { assegna(campo, "36", end) } } # (2) Regola vera e propria # # Regola per la disambiguazione esterna di "cu'" # else if (campo ~ /^cu'_/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" ffw = fw ffw++ nf++ if (($fw ~ /^liete_/) || ($bw ~ /^a_/ && $fw ~ /^io_/ && $ffw ~ /^dicer_/)) { assegna(campo, "32", end) } else { assegna(campo, "36", end) } } # (2) Regola vera e propria # # Regola per la disambiguazione esterna di "chu'" # else if (campo ~ /^chu'_/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" nf++ if ($bw ~ /^domand_/) { assegna(campo, "35", end) } else { assegna(campo, "36", end) } } # (2) Regola vera e propria # # Regola per la disambiguazione esterna di "ch'" # else if (campo ~ /^ch'_/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" nf++ bbw = bw bbw-- ffw = fw ffw++ if ($bw ~ /,3[07],/ || $bw ~ /,6[45],/ || $bw ~ /,76,/ || ($bw ~ /,32,/ && $bw !~ /^altrui_/) || ($bw ~ /,2[016],/ && $bbw !~ /11[12345678]/ && $bbw !~ /12[1234]/ && $bbw !~ /21[12345678]/ && $bbw !~ /22[1234]/ && $bbw !~ /31[12345678]/ && $bbw !~ /32[1234]/) || (($bw ~ /^[,;]_/ || $bw ~ /,3[027],/) && $bbw ~ /,2[016],/)) { assegna(campo, "36", end) } else { assegna(campo, "che,51", end) } } # (2) Regola vera e propria # # Regola per la disambiguazione esterna di 'che' # else if (campo ~ /^che_/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" nf++ bbw = bw bbw-- ffw = fw ffw++ if ($bw ~ /lem=per,/ || $bw ~ /,3[07],/ || $bw ~ /,6[45],/ || $bw ~ /,76,/ || ($bw ~ /,32,/ && $bw !~ /^altrui_/) || ($bw ~ /,2[016],/ && $bbw !~ /11[12345678]/ && $bbw !~ /12[1234]/ && $bbw !~ /21[12345678]/ && $bbw !~ /22[1234]/ && $bbw !~ /31[12345678]/ && $bbw !~ /32[1234]/) || (($bw ~ /^[,;]_/ || $bw ~ /,3[027],/) && $bbw ~ /,2[016],/)) { assegna(campo, "36", end) } else { assegna(campo, "che,51", end) } } # (2) Regola vera e propria # # Regola per la disambiguazione esterna degli imperativi # quando seguiti da grafoclitici # else if (campo ~ /,118,/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" nf++ if ($fw ~ /^/) { assegna(campo, "118", end) } else { assegna(campo, "111", end) } } # (2) Regola vera e propria # # Regola per la disambiguazione esterna dei numerali # else if (campo ~ /^IJ_/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" nf++ if ($bw ~ /^Damaso_/) { assegna(campo, "secondo", end) } else { assegna(campo, "due", end) } } else if (campo ~ /^IIJ_/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" nf++ if ($bw !~ /,21,/) { assegna(campo, "tre", end) } else { assegna(campo, "terzo", end) } } else if (campo ~ /^IIIJ_/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" nf++ if ($bw !~ /,21,/) { assegna(campo, "quattro", end) } else { assegna(campo, "quarto", end) } } else if (campo ~ /^VIJ_/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" nf++ if ($bw !~ /,21,/) { assegna(campo, "sette", end) } else { assegna(campo, "settimo", end) } } else if (campo ~ /^VIIJ_/ && campo ~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" nf++ if ($bw !~ /,21,/) { assegna(campo, "otto", end) } else { assegna(campo, "ottavo", end) } } else if (campo ~ /,64,/) { if (campo ~ /$/) end = "" else end = "" nf++ if ($bw ~ /lem=lo,60/) { sub (/;5/, "", campo) print campo } else { print campo } } # # (2) Regola vera e propria # # Regole per la disambiguazione interna del nome proprio quando preceduto da articolo. # else if (campo !~ /\);\(/ && campo ~ /,21,/ && campo ~ /,4;5,6;7,/ && $bw ~ /,60,/ && $bw ~ /,4,6,/ && $bw !~ /\);\(/) { nf++ sub (/;5/, "", campo) sub (/;7/, "", campo) print campo } else if (campo !~ /\);\(/ && campo ~ /,21,/ && campo ~ /,4;5,6;7,/ && $bw ~ /,60,/ && $bw ~ /,5,6,/ && $bw !~ /\);\(/) { nf++ sub (/4;/, "", campo) sub (/;7/, "", campo) print campo } else if (campo !~ /\);\(/ && campo ~ /,21,/ && campo ~ /,4;5,6;7,/ && $bw ~ /,60,/ && $bw ~ /,4,7,/ && $bw !~ /\);\(/) { nf++ sub (/;5/, "", campo) sub (/6;/, "", campo) print campo } else if (campo !~ /\);\(/ && campo ~ /,21,/ && campo ~ /,4;5,6;7,/ && $bw ~ /,60,/ && $bw ~ /,5,7,/ && $bw !~ /\);\(/) { nf++ sub (/4;/, "", campo) sub (/6;/, "", campo) print campo } else if (campo !~ /\);\(/ && campo ~ /,21,/ && campo ~ /,4;5,6;7,/ && $bw ~ /,60,/ && $bw ~ /4,6;7,/ && $bw !~ /\);\(/) { nf++ sub (/;5/, "", campo) print campo } # # (2) Regola vera e propria # # Regole per la disambiguazione interna della forma quando preceduta da articolo. # else if (campo !~ /\);\(/ && campo ~ /,4,6;7,/ && $bw ~ /,60,/ && $bw ~ /,4,6,/ && $bw !~ /\);\(/) { nf++ sub (/;7/, "", campo) print campo } else if (campo !~ /\);\(/ && campo ~ /,5,6;7,/ && $bw ~ /,60,/ && $bw ~ /,5,6,/ && $bw !~ /\);\(/) { nf++ sub (/;7/, "", campo) print campo } else if (campo !~ /\);\(/ && campo ~ /,4,6;7,/ && $bw ~ /,60,/ && $bw ~ /,4,7,/ && $bw !~ /\);\(/) { nf++ sub (/6;/, "", campo) print campo } else if (campo !~ /\);\(/ && campo ~ /,5,6;7,/ && $bw ~ /,60,/ && $bw ~ /,5,7,/ && $bw !~ /\);\(/) { nf++ sub (/6;/, "", campo) print campo } # # (2) Regola vera e propria # # Regole per la disambiguazione interna dell'aggettivo quando preceduto da articolo. # else if (campo !~ /\);\(/ && campo ~ /,26,/ && campo ~ /,4;5,6,/ && $bw ~ /,60,/ && $bw ~ /,5,6,/ && $bw !~ /\);\(/) { nf++ sub (/4;/, "", campo) print campo } else if (campo !~ /\);\(/ && campo ~ /,26,/ && campo ~ /,4;5,7,/ && $bw ~ /,60,/ && $bw ~ /,5,7,/ && $bw !~ /\);\(/) { nf++ sub (/4;/, "", campo) print campo } else if (campo !~ /\);\(/ && campo ~ /,26,/ && campo ~ /,4;5,6,/ && $bw ~ /,60,/ && $bw ~ /,4,6,/ && $bw !~ /\);\(/) { nf++ sub (/;5/, "", campo) print campo } else if (campo !~ /\);\(/ && campo ~ /,26,/ && campo ~ /,4;5,7,/ && $bw ~ /,60,/ && $bw ~ /,4,7,/ && $bw !~ /\);\(/) { nf++ sub (/;5/, "", campo) print campo } # # (2) Regola vera e propria # # Regola per la disambiguazione interna dell'aggettivo quando seguito da nome. # else if (campo !~ /\);\(/ && $fw !~ /\);\(/ && campo ~ /,26,/ && campo ~ /,4;5,6,/ && $fw ~ /,20,0,5,6;7,/) { nf++ sub (/4;/, "", campo) print campo } # # (2) Regola vera e propria # # Regole per la disambiguazione interna dell'aggettivo quando preceduto da nome. # else if (campo !~ /\);\(/ && $bw !~ /\);\(/ && campo ~ /,26,/ && campo ~ /,4;5,6,/ && $bw ~ /,20,0,4,6,/) { nf++ sub (/;5/, "", campo) print campo } else if (campo !~ /\);\(/ && $bw !~ /\);\(/ && campo ~ /,26,/ && campo ~ /,4;5,6,/ && $bw ~ /,20,0,5,6,/) { nf++ sub (/4;/, "", campo) print campo } else if (campo !~ /\);\(/ && $bw !~ /\);\(/ && campo ~ /,26,/ && campo ~ /,4;5,7,/ && $bw ~ /,20,0,4,7,/) { nf++ sub (/;5/, "", campo) print campo } else if (campo !~ /\);\(/ && $bw !~ /\);\(/ && campo ~ /,26,/ && campo ~ /,4;5,7,/ && $bw ~ /,20,0,5,7,/) { nf++ sub (/4;/, "", campo) print campo } else if (campo !~ /\);\(/ && $bw !~ /\);\(/ && campo ~ /,26,/ && campo ~ /,4,6;7,/ && $bw ~ /,20,0,4,6,/) { nf++ sub (/;7/, "", campo) print campo } # # (2) Regola vera e propria # # Regola per la disambiguazione interna del nome quando preceduto da aggettivo. # else if (campo !~ /\);\(/ && $bw !~ /\);\(/ && campo ~ /,20,/ && campo ~ /,5,6;7,/ && $bw ~ /,26,0,4;5,6,/) { nf++ sub (/;7/, "", campo) print campo } else { nf++ print campo } } }