15
16:- module(wn_gen_prox_equations, [
17 wn_gen_ontology_file/3, 18 wn_gen_prox_equations_list/3, 19 wn_auto_gen_prox_equations/4 20 ]
21 ). 22
23:- use_module(wn_sim_measures). 24:- use_module(wn_utilities). 27
28
30
31
38wn_gen_ontology_file(ListOfListOfWords, File, Measure) :-
39 file_name_extension(_, Extension, File),
40 ((Extension = ont) -> File_ont = File;
41 (Extension = '') -> file_name_extension(File, ont, File_ont)
42 ),
43 (exists_file(File_ont) ->
44 write('The file '), write(File), write(' or '), write(File_ont), write(' does exists.'), nl
45 ;
46 (member(Measure, [path, wup, lch, res, lin, jcn, hso, lesk, vector, yar]) ->
47 wn_gen_prox_equations_list(ListOfListOfWords, Measure, Equations),
48 open(File_ont, write, OutputStream),
49 write(OutputStream,'%% PROXIMITY EQUATIONS'), nl(OutputStream),
50 write_equations(Equations, OutputStream),
51 close(OutputStream)
52 ;
53 write(Measure), write(' is not a similarity or relatedness measure.'), nl
54 )
55 ).
56
59write_equations([], _).
60write_equations([sim(W1,W2,D)|Equations], OutputStream) :-
61 concat_atom([W1,'~', W2, '=', D, '.'], ProxEqu),
62 write(OutputStream,ProxEqu), nl(OutputStream),
63 write_equations(Equations, OutputStream).
64
65
78
79wn_auto_gen_prox_equations([:- directive(wn_gen_prox_equations, [Measure, Auto])], Rules, InEquations, OutEquations) :-
80 \+ is_list(Auto),
81 atoms_functors_in_term(Rules, AllAtoms, AllFunctors),
82 exception_words(ExceptionWords),
83 ordsets:ord_subtract(AllAtoms, ExceptionWords, Atoms),
84 ordsets:ord_subtract(AllFunctors, ExceptionWords, AllValidFunctors),
85 bpl_predicates(AllValidFunctors, Functors, Predicates),
86 !,
87 wn_gen_prox_equations_list([Atoms, Functors, Predicates], Measure, NewEquations),
88 lists:append(InEquations, NewEquations, OutEquations).
89
90wn_auto_gen_prox_equations(_Directives, _Rules, Equations, Equations).
91
92
95exception_words([
96 ':-',
97 true 98 ]).
99
100
101
115
116wn_gen_prox_equations_list(ListOfListOfWords, Measure, Equations) :-
117 wn_gen_prox_equations_list(ListOfListOfWords, Measure, Equations, []).
118
126
127wn_gen_prox_equations_list([], _Measure) -->
128 [].
129
130wn_gen_prox_equations_list([ListOfWords|ListOfListOfWords], Measure) -->
131 wn_gen_prox_equations(ListOfWords, Measure),
132 wn_gen_prox_equations_list(ListOfListOfWords, Measure).
133
134
135wn_gen_prox_equations([], _Measure) -->
136 [].
137
138wn_gen_prox_equations([Word|ListOfWords], Measure) -->
139 wn_gen_prox_equations(ListOfWords, Word, Measure),
140 wn_gen_prox_equations(ListOfWords, Measure).
141
142
143wn_gen_prox_equations([], _Word1, _Measure) -->
144 [].
145
146wn_gen_prox_equations([Word2|ListOfWords], Word1, Measure) -->
147 {gen_prox_equation(Measure, Word1, Word2, Equation),
148 !},
149 [Equation],
150 wn_gen_prox_equations(ListOfWords, Word1, Measure).
151
152wn_gen_prox_equations([_Word2|ListOfWords], Word1, Measure) --> 153 wn_gen_prox_equations(ListOfWords, Word1, Measure).
154
155
160
161gen_prox_equation(Measure, Word1:Type1:Sense1, Word2:Type2:Sense2, Equation) :-
162 atom(Word1),
163 atom(Word2),
164 valid_word_type(Type1),
165 valid_word_type(Type2),
166 number(Sense1),
167 number(Sense2),
168 !,
169 gen_prox_equation_aux(Measure, Word1:Type1:Sense1, Word2:Type2:Sense2, Equation).
170
171gen_prox_equation(Measure, Word1, Word2, Equation) :-
172 atom(Word1),
173 atom(Word2),
174 !,
175 gen_prox_equation_aux(Measure, Word1:Type:1, Word2:Type:1, Equation).
176
177gen_prox_equation(_Measure, Word1, Word2, _Equation) :-
178 format('ERROR: Incorrect pattern for ~p and/or ~p. Expected either plain words or patterns Word:Type:Sense, where Type is in {n,v} and Sense is a number.', [Word1, Word2]),
179 fail.
180
181
182gen_prox_equation_aux(Measure, Pattern1, Pattern2, sim(Word1, Word2, NormalizedDegree)) :-
183 wn_measure_module_goal(Measure, Module, MeasureGoalName),
184 MeasureGoal =.. [MeasureGoalName, Pattern1, Pattern2, Degree],
185 Module:MeasureGoal,
186 measure_max_value(Measure, Max),
187 NormalizedDegree is Degree/Max,
188 Pattern1 = Word1:_:_,
189 Pattern2 = Word2:_:_.
190
191
194
195valid_word_type(n).
196
197valid_word_type(v).
198
199
207
208wn_measure_module_goal(path, wn_sim_measures, wn_path).
209wn_measure_module_goal(wup, wn_sim_measures, wn_wup).
210wn_measure_module_goal(lch, wn_sim_measures, wn_lch).
211wn_measure_module_goal(res, wn_ic_measures, wn_res).
212wn_measure_module_goal(jcn, wn_ic_measures, wn_jcn).
213wn_measure_module_goal(lin, wn_ic_measures, wn_lin).
214wn_measure_module_goal(yarm, wn_rel_measures, wn_yarm).
215
216
221
222measure_max_value(path, 1).
223measure_max_value(wup, 1).
224measure_max_value(lch, 3.6888794541139363).
225measure_max_value(res, 1) :- 226 nl, write('WARNING: Normalization is not checked.'), nl.
227measure_max_value(jcn, 1) :- 228 nl, write('WARNING: Normalization is not checked.'), nl.
229measure_max_value(lin, 1).
231measure_max_value(hso, 16).
232measure_max_value(yarm, 1)