# # Motore di disambiguazione - Versione 2.0 # # Modulo 5: # # - disambiguazione degli articoli e di alcune forme particolari # # # 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 e interna dell'articolo determinativo # ambiguo masc./fem. sing./plu. quando seguito da "altrui" # else if (campo ~ /\(lem=lo,60,0,4,6;7,0,0\);\(lem=la,60,0,5,6;7,0,0\)/ && $fw ~ /^altrui_/) { if (campo ~ /$/) end = "" else end = "" nf++ ffw = fw ffw++ if ($fw ~ /,32,/) { gsub (/;7/, "", campo) assegna(campo, "lem=lo", end) } else if ($fw ~ /,33,/ && $ffw ~ /,4,6,/ && $ffw !~ /\);\(/) { gsub (/;7/, "", campo) assegna(campo, "lem=lo", end) } else if ($fw ~ /,33,/ && $ffw ~ /,4,7,/ && $ffw !~ /\);\(/) { gsub (/6;/, "", campo) assegna(campo, "lem=lo", end) } else if ($fw ~ /,33,/ && $ffw ~ /,5,6,/ && $ffw !~ /\);\(/) { gsub (/;7/, "", campo) assegna(campo, "lem=la", end) } else if ($fw ~ /,33,/ && $ffw ~ /,5,7,/ && $ffw !~ /\);\(/) { gsub (/6;/, "", campo) assegna(campo, "lem=la", end) } else if ($fw ~ /,33,/ && $ffw ~ /,5,6;7,/ && $ffw !~ /\);\(/) { assegna(campo, "lem=la", end) } else print campo } # # # (2) Regola vera e propria # # Regola per la disambiguazione esterna e interna dell'articolo determinativo # ambiguo masc./fem. sing./plu. quando seguito da numerale # else if (campo ~ /\(lem=lo,60,0,4,6;7,0,0\);\(lem=la,60,0,5,6;7,0,0\)/ && $fw ~ /,64,/) { if (campo ~ /$/) end = "" else end = "" nf++ assegna(campo, "lem=lo", end) } # # # (2) Regola vera e propria # # Regola per la disambiguazione esterna e interna dell'articolo determinativo # ambiguo masc./fem. sing./plu. quando seguito da nome proprio # else if (campo ~ /\(lem=lo,60,0,4,6;7,0,0\);\(lem=la,60,0,5,6;7,0,0\)/ && $fw ~ /,21,/) { if (campo ~ /$/) end = "" else end = "" nf++ assegna(campo, "lem=lo", end) } # # # (2) Regola vera e propria # # Regola per la disambiguazione esterna e interna dell'articolo determinativo # ambiguo masc./fem. sing./plu. quando seguito da "altr'" # else if (campo ~ /^l'_/ && $fw ~ /^altr'_/) { if (campo ~ /$/) end = "" else end = "" nf++ gsub (/;7/, "", campo) assegna(campo, "lem=lo", end) } # # # (2) Regola vera e propria # # Regola per la disambiguazione esterna e interna dell'articolo determinativo # ambiguo masc./fem. sing./plu. quando seguito da "altr'" # else if (campo ~ /^ll'_/ && $fw ~ /^utili_/) { if (campo ~ /$/) end = "" else end = "" nf++ gsub (/6;/, "", campo) assegna(campo, "lem=la", end) } # (2) Regola vera e propria # # Regola per la disambiguazione interna dell'articolo det. # else if (campo ~ /,60,/ && campo !~ /,39,/ && campo !~ /,37,/ && campo !~ /,77,/ && campo !~ /,56,/ && campo !~ /,45,/) { if (campo ~ /$/) end = "" else end = "" nf++ if (campo ~ /,4,6;7,/ && campo ~ /,5,6;7,/ && $fw ~ /,4,6,/) { gsub (/;7/, "", campo) assegna(campo, "60,0,4,6", end) } else if (campo ~ /,4,6;7,/ && campo ~ /,5,6;7,/ && $fw ~ /,4,7,/) { gsub (/6;/, "", campo) assegna(campo, "60,0,4,7", end) } else if (campo ~ /,4,6;7,/ && campo ~ /,5,6;7,/ && $fw ~ /,5,6,/) { gsub (/;7/, "", campo) assegna(campo, "60,0,5,6", end) } else if (campo ~ /,4,6;7,/ && campo ~ /,5,6;7,/ && $fw ~ /,5,7,/) { gsub (/6;/, "", campo) assegna(campo, "60,0,5,7", end) } else if (campo ~ /,4,6;7,/ && campo ~ /,5,6;7,/ && $fw ~ /,4,6;7,/) { assegna(campo, "60,0,4,6;7", end) } else if (campo ~ /,4,6;7,/ && campo ~ /,5,6;7,/ && $fw ~ /,5,6;7,/) { assegna(campo, "60,0,5,6;7", end) } else if (campo ~ /,4,6,/ && campo ~ /,5,6,/ && $fw ~ /,4,6,/) { assegna(campo, "60,0,4,6", end) } else if (campo ~ /,4,7,/ && campo ~ /,5,7,/ && $fw ~ /,4,7,/) { assegna(campo, "60,0,4,7", end) } else if (campo ~ /,4,6,/ && campo ~ /,5,6,/ && $fw ~ /,5,6,/) { assegna(campo, "60,0,5,6", end) } else if (campo ~ /,4,7,/ && campo ~ /,5,7,/ && $fw ~ /,5,7,/) { assegna(campo, "60,0,5,7", end) } else print campo } # (2) Regola vera e propria # # Regola per la disambiguazione esterna dell'articolo det. # ambiguo con pron. quando preceduto da preposizione else if ($bw ~ /,56,/ && $bw !~ /\);\(/ && campo ~ /,60,/ && campo ~ /,39,/) { if (campo ~ /$/) end = "" else end = "" nf++ assegna(campo, "60", end) } # # # (2) Regola vera e propria # # Regola per la disambiguazione esterna dell'artic. indeterm. masc. sing. maiuscolo # else if (campo ~ /\);\(/ && campo ~ /^Uno_/) { if (campo ~ /$/) end = "" else end = "" nf++ if ($fw ~ /^solo_/) { assegna(campo, "64", end) } else if ($fw ~ /,2[06],/) { assegna(campo, "61", end) } else { assegna(campo, "32", end) } } # # # (2) Regola vera e propria # # Regola per la disambiguazione esterna dell'articolo indeterminativo maschile singolare # basata sul controllo gen./num. con ci che segue. # else if (campo ~ /\);\(/ && campo ~ /^un_/) { if (campo ~ /$/) end = "" else end = "" nf++ if ($fw ~ /^che_/ || ($bw ~ /^ll'_/ && $fw ~ /^di_/) || ($bw ~ /^[Ll]'_/ && ($fw ~ /^[Ll]'_/ || $fw ~ /^grande_/ || $fw ~ /^se_/ || $fw ~ /^giace_/ || $fw ~ /^fugge_/ || $fw ~ /^gode_/ || $fw ~ /^,_/ || $fw ~ /^sanza_/))) { assegna(campo, "32", end) } else if ($bw ~ /^ma'_/) { assegna(campo, "64", end) } else { assegna(campo, "61", end) } } else if (campo ~ /\);\(/ && campo ~ /^uno_/) { if (campo ~ /$/) end = "" else end = "" nf++ bbw = bw bbw-- ffw = fw ffw++ ffww = ffw ffww++ if (($fw !~ /11[12345678]/ && $fw !~ /12[1234]/ && $fw !~ /21[12345678]/ && $fw !~ /22[1234]/ && $fw !~ /31[12345678]/ && $fw !~ /32[1234]/ && $fw !~ /\);\(/ && $fw ~ /,4,6,/ && $fw !~ /^Idio_/ && $bw !~ /,60,/ && $bw !~ /,61,/) || (($fw ~ /,26,/ || $fw ~ /,33,/) && $ffw ~ /,2[01],/) || ($fw ~ /,33,/ && $ffw ~ /,26,/ && $ffww ~ /,2[01],/) || $fw ~ /^cotal/ || $fw ~ /^grande_/ || $fw ~ /^molto_/ || $fw ~ /^pi_/ || $fw ~ /^s_/ || $fw ~ /^cos_/) { assegna(campo, "61", end) } else if ($bw ~ /lem=il,60,/ || $bw ~ /lem=lo,60,/ || $bw ~ /^questo_/ || $fw ~ /^che_/ || ($bw ~ /^ad_/ && $fw ~ /^d[ei]_/) || ($bw ~ /^ad?_/ && $fw ~ /^ad?_/) || ($bbw ~ /^uno_/ && $bw ~ /^ad?_/)) { assegna(campo, "32", end) } else { assegna(campo, "64", end) } } # # (2) Regola vera e propria # # Regole per la disambiguazione esterna dell'articolo indeterminativo # femminile singolare ambiguo con pronome indefinito # else if (campo ~ /\);\(/ && campo ~ /^un'_/) { if (campo ~ /$/) end = "" else end = "" nf++ if ($fw ~ /^_/ && $bw ~ /^l'_/) { assegna(campo, "32", end) } else { sub (/4;/, "", campo) assegna(campo, "61", end) } } else if (campo ~ /\);\(/ && campo ~ /^una_/) { if (campo ~ /$/) end = "" else end = "" nf++ bbw = bw bbw-- ffw = fw ffw++ # # (2) Regola vera e propria # # Regola basata sul controllo gen./num. con ci che segue. # if (($fw !~ /11[12345678]/ && $fw !~ /12[1234]/ && $fw !~ /21[12345678]/ && $fw !~ /22[1234]/ && $fw !~ /31[12345678]/ && $fw !~ /32[1234]/ && $fw !~ /\);\(/ && $fw ~ /,5,6,/ && $bw !~ /,60,/ && $bw !~ /,61,/) || (($fw ~ /,26,/ || $fw ~ /,33,/) && $ffw ~ /,2[01],/) || $fw ~ /^cotal/ || $fw ~ /^grande_/ || $fw ~ /^molto_/ || $fw ~ /^pi_/ || $fw ~ /^s_/ || $fw ~ /^cos_/) { assegna(campo, "61", end) } else if ($bw ~ /lem=la,60,/ || $bw ~ /^questa_/ || ($bw ~ /^a_/ && $fw ~ /^a_/) || ($bbw ~ /^una_/ && $bw ~ /^a_/)) { assegna(campo, "32", end) } else { assegna(campo, "64", end) } } # # (2) Regola vera e propria # # Regola per la disambiguazione esterna dell'articolo determinativo maschile plurale # basata sul controllo gen./num. con ci che segue. # else if (campo ~ /\);\(/ && campo ~ /,60,0,4,7,/ && $fw !~ /11[12345678]/ && $fw !~ /12[1234]/ && $fw !~ /21[12345678]/ && $fw !~ /22[1234]/ && $fw !~ /31[12345678]/ && $fw !~ /32[1234]/ && $fw !~ /\);\(/ && ($fw ~ /,4,7,/ || $fw ~ /,64,/)) { if (campo ~ /$/) end = "" else end = "" nf++ assegna(campo, "60,0,4,7", end) } # # (2) Regola vera e propria # # Regola per la disambiguazione esterna dell'articolo determinativo femminile plurale # basata sul controllo gen./num. con ci che segue. # else if (campo ~ /\);\(/ && campo ~ /,60,0,5,7,/ && $fw !~ /11[12345678]/ && $fw !~ /12[1234]/ && $fw !~ /21[12345678]/ && $fw !~ /22[1234]/ && $fw !~ /31[12345678]/ && $fw !~ /32[1234]/ && $fw !~ /\);\(/ && $fw ~ /,5,7,/) { if (campo ~ /$/) end = "" else end = "" nf++ assegna(campo, "60,0,5,7", end) } # # # (2) Regola vera e propria # # Regola per la disambiguazione esterna dell'articolo determinativo maschile sing./plur. # basata sul controllo gen./num. con ci che segue. # else if (campo ~ /\);\(/ && campo ~ /,60,0,4,6;7,/ && $fw !~ /11[12345678]/ && $fw !~ /12[1234]/ && $fw !~ /21[12345678]/ && $fw !~ /22[1234]/ && $fw !~ /31[12345678]/ && $fw !~ /32[1234]/ && $fw ~ /,4,6,/ && $fw !~ /,4,7,/ && $fw !~ /,5,6,/ && $fw !~ /,5,7,/) { if (campo ~ /$/) end = "" else end = "" nf++ gsub (/;7/, "", campo) assegna(campo, "60,0,4,6", end) } else if (campo ~ /\);\(/ && campo ~ /,60,0,4,6;7,/ && $fw !~ /11[12345678]/ && $fw !~ /12[1234]/ && $fw !~ /21[12345678]/ && $fw !~ /22[1234]/ && $fw !~ /31[12345678]/ && $fw !~ /32[1234]/ && $fw !~ /,4,6,/ && $fw ~ /,4,7,/ && $fw !~ /,5,6,/ && $fw !~ /,5,7,/) { if (campo ~ /$/) end = "" else end = "" nf++ gsub (/6;/, "", campo) assegna(campo, "60,0,4,7", end) } # # # (2) Regola vera e propria # # Regola per la disambiguazione esterna dell'articolo determinativo femminile sing./plur. # basata sul controllo gen./num. con ci che segue. # else if (campo ~ /\);\(/ && campo ~ /,60,0,5,6;7,/) { if (campo ~ /$/) end = "" else end = "" nf++ if ($fw !~ /11[12345678]/ && $fw !~ /12[1234]/ && $fw !~ /21[12345678]/ && $fw !~ /22[1234]/ && $fw !~ /31[12345678]/ && $fw !~ /32[1234]/ && $fw ~ /,5,6,/ && $fw !~ /,4,6,/ && $fw !~ /,4,7,/ && $fw !~ /,5,7,/) { gsub (/;7/, "", campo) assegna(campo, "60,0,5,6", end) } else if ($fw !~ /11[12345678]/ && $fw !~ /12[1234]/ && $fw !~ /21[12345678]/ && $fw !~ /22[1234]/ && $fw !~ /31[12345678]/ && $fw !~ /32[1234]/ && $fw ~ /,5,7,/ && $fw !~ /,4,6,/ && $fw !~ /,5,6,/ && $fw !~ /,4,7,/) { gsub (/6;/, "", campo) assegna(campo, "60,0,5,7", end) } else if ($fw !~ /11[12345678]/ && $fw !~ /12[1234]/ && $fw !~ /21[12345678]/ && $fw !~ /22[1234]/ && $fw !~ /31[12345678]/ && $fw !~ /32[1234]/ && $fw ~ /,5,6;7,/ && $fw !~ /\);\(/) { assegna(campo, "60,0,5,6;7", end) } else print campo } # # (2) Regola vera e propria # # Regola per la disambiguazione interna del nome quando preceduto da 'ogni'. # else if (campo !~ /\);\(/ && campo ~ /,20,/ && campo ~ /,4,6;7,/ && $bw ~ /lem=ogni,/ && $bw ~ /,4,6,/) { nf++ sub (/;7,/, ",", campo) print campo } else if (campo !~ /\);\(/ && campo ~ /,20,/ && campo ~ /,5,6;7,/ && $bw ~ /lem=ogni,/ && $bw ~ /,5,6,/) { nf++ sub (/;7,/, ",", campo) print campo } # # (2) Regola vera e propria # # Regola per la disambiguazione esterna della forma 'Santi' quando preceduto da 'Ogni'. # else if (campo ~ /\);\(/ && campo ~ /_\(lem=santo,20,0,4,7,0,0/ && $bw !~ /\);\(/ && $bw ~ /Ogni_lem=ogni,32,0,/) { if (campo ~ /$/) end = "" else end = "" nf++ assegna(campo, "20", end) } # # (2) Regola vera e propria # # Regola per la disambiguazione esterna dell'aggettivo quando preceduto da 'ogni'. # else if (campo ~ /\);\(/ && campo ~ /,26,/ && $bw ~ /=ogni,/ && $fw ~ /,20,/ && $fw !~ /\);\(/) { if (campo ~ /$/) end = "" else end = "" nf++ assegna(campo, "26", end) } else if (campo ~ /\);\(/ && $bw ~ /=ogni,/) { nf++ print campo } else if (campo ~ /\);\(/ && (campo ~ /,60,0,4,6,/ || campo ~ /,61,0,4,6,/) && $fw !~ /11[12345678]/ && $fw !~ /12[1234]/ && $fw !~ /21[12345678]/ && $fw !~ /22[1234]/ && $fw !~ /31[12345678]/ && $fw !~ /32[1234]/ && $fw !~ /\);\(/ && $fw !~ /,4,6,/ && ($fw ~ /,20,/ || $fw ~ /,21,/)) { nf++ print campo } else if (campo ~ /\);\(/ && (campo ~ /,60,0,4,7,/ || campo ~ /,61,0,4,7,/) && $fw !~ /11[12345678]/ && $fw !~ /12[1234]/ && $fw !~ /21[12345678]/ && $fw !~ /22[1234]/ && $fw !~ /31[12345678]/ && $fw !~ /32[1234]/ && $fw !~ /\);\(/ && $fw !~ /,4,7,/ && ($fw ~ /,20,/ || $fw ~ /,21,/)) { nf++ print campo } else if (campo ~ /\);\(/ && (campo ~ /,60,0,5,6,/ || campo ~ /,61,0,5,6,/) && $fw !~ /11[12345678]/ && $fw !~ /12[1234]/ && $fw !~ /21[12345678]/ && $fw !~ /22[1234]/ && $fw !~ /31[12345678]/ && $fw !~ /32[1234]/ && $fw !~ /\);\(/ && $fw !~ /,5,6,/ && ($fw ~ /,20,/ || $fw ~ /,21,/)) { nf++ print campo } else if (campo ~ /\);\(/ && (campo ~ /,60,0,5,7,/ || campo ~ /,61,0,5,7,/) && $fw !~ /11[12345678]/ && $fw !~ /12[1234]/ && $fw !~ /21[12345678]/ && $fw !~ /22[1234]/ && $fw !~ /31[12345678]/ && $fw !~ /32[1234]/ && $fw !~ /\);\(/ && $fw !~ /,5,7,/ && ($fw ~ /,20,/ || $fw ~ /,21,/)) { nf++ print campo } else { nf++ print campo } } }