-
Notifications
You must be signed in to change notification settings - Fork 0
/
WordSpotting.java
415 lines (334 loc) · 26.2 KB
/
WordSpotting.java
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
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.*;
/*Esta clase leera un arhivo el cual contendra los predicados. Estos se guardaran en un mapa para que al momento
* de interpretar el programa pueda obtener un valor de lo interpretado
************************************************************************************************************/
public class WordSpotting {
/***************************** sobrecargando el metodo buscarIntencion ***************************************
buscan la intencion en el mapa por medio de una llave la cual el usuario ingresara al preguntarle ¿cual es la
* expresion esperada?*/
/*########################
* String expectativa : es la expectativa que introduce el usuario al momento de preguntarle
* String[]argUsuario : son los argumentos obtenidos al momento que el usuario ingresa la expectativa ejemplo: nombre(x,y)-> se guarda [x,y] en el arreglo
* HashMap<String,Object> PredArg : son los argumentos por cada predicado obtenidos en el archivo que el usuario requiera usar ejem: adivina.txt
* String intencion : el la cadena que el usuario escribe ejemplo : me llamo abel
* HashMap<String,Object> mapaDePredicados : este mapa contiene todos los predicados asi como sus valores del archivo con el cual inicia el programa
*/
public static String buscarConExp(String expectativa,String[]argUsuario,HashMap<String,Object> PredArg,String intencion,HashMap<String,Object> mapaDePredicados){
String llaveExp = null;
boolean activo = true;
boolean sinArg = true;
boolean entendi = false;
String[] nArg = {"1"} ;
int nArgPred;
String[] argumentos = null;
String intencionResultado = null;
String resultado = "";
HashMap<String,Object> mapaDeExp = new HashMap<String,Object>();
HashMap<String,Object> mapaDeArg = new HashMap<String,Object>();
Pattern expReg;
Matcher encontrado;
try {
mapaDeArg = (HashMap<String,Object>)mapaDePredicados.get(expectativa);//obtenemos el mapa que corresponden a los argumentos que a su vez contienen las expresiones regulares
argumentos = (String[])PredArg.get(expectativa);//obtenemos el arreglo de argumentos para la expectativa
System.out.print("argumentos entendidos por el programa:");
for(String arg: argumentos){
System.out.print(arg+" ");
}
System.out.print("\n");
if(argUsuario.length <= argumentos.length){ //evalua si los argumentos concuerdan con el archivo
for(int i = 0; i<argUsuario.length;i++){ //controla la busqueda de argumentos
mapaDeExp = (HashMap<String,Object>)mapaDeArg.get(argumentos[i]);
Iterator recorreSegundo = mapaDeExp.entrySet().iterator();
while (recorreSegundo.hasNext()) {
Map.Entry j = (Map.Entry)recorreSegundo.next();
llaveExp = (String)j.getKey();
expReg = Pattern.compile(llaveExp);
encontrado = expReg.matcher(intencion);
if(encontrado.find()){
//entendi = true;
intencionResultado = (String)j.getValue();
if(intencionResultado.equals("mismo"))
intencionResultado = encontrado.group();
if(activo){
resultado=resultado+intencionResultado; //para que no empiece con ,
activo=false;
}
else
resultado = resultado+","+intencionResultado;
break;
}
}
//******* evalua si contiene todos los argumentos ******
nArg = resultado.split(",");
nArgPred = argumentos.length;
if(nArg.length == nArgPred) entendi = true;
//********************************
}
if(entendi){
if(!argumentos[0].equals("0")) //evaluamos que tenga argumentos para modificar la variable
resultado = expectativa+"("+resultado+")"; //falta definir que busque que tenga todos los argu
}
else
resultado = "noEntendi";
}
else
System.out.println("no coindicen los argumentos ingresados con los especificados en el archivo"); //si los argumentos no concuerda con el programa no se ejecuta lo demas
}catch(RuntimeException r){
System.out.println("\nexpecativa no encotrada en el mapa: "+r);
System.exit(1);
}
return resultado;
}
/**********************************************************************************************************************
HashMap<String,Object> PredArg): mapa de cada de los arguementos obtenidos en el archivo****************/
public static String buscarSinExp(String intencion,HashMap<String,Object> mapaDePredicados,HashMap<String,Object> PredArg){ //falta definir el nombre del metodo
HashMap<String,Object> mapaDeArg= new HashMap<String,Object>();
HashMap<String,String> mapaDeValores= new HashMap<String,String>();
Pattern expReg;
Matcher encontrado;
String llaveRegExp;
String intencionResultado = "";
String predicado;
String resultados = "";
String[] tokens;
String argMapa;
String[] argsPred;
ArrayList<String> predEnc = new ArrayList(); //utilizado para los predicados encontrados
String[] tmp2;
String tmp1;
boolean bandera = false;
boolean completo;
Iterator i = mapaDePredicados.entrySet().iterator();
while (i.hasNext()){ //recorre el mapa de predicados, tenemos acceso a los predicados
Map.Entry a = (Map.Entry)i.next();
mapaDeArg = (HashMap<String,Object>)a.getValue(); //obtenemos el mapa de argumentos
predicado = (String)a.getKey(); //obtenemos el predicado
Iterator j = mapaDeArg.entrySet().iterator(); //creamos el nuevo indice
while (j.hasNext()){ //recorremos el mapa de argumentos, aqui tenemos acceso a los argumentos de los predicado
Map.Entry b = (Map.Entry)j.next();
mapaDeValores = (HashMap<String,String>)b.getValue(); //obtenemos el mapa de valores asociadas a cada argumento
Iterator k = mapaDeValores.entrySet().iterator();//creamos un nuevo indice
while (k.hasNext()){ //recorremos el mapa de valores, aqui tenemos acceso a las expresiones regulare
Map.Entry c = (Map.Entry)k.next();
llaveRegExp = (String)c.getKey();
expReg = Pattern.compile(llaveRegExp);
tokens=intencion.split(" "); //descomponemos la oracion por palabras
for(String token:tokens){
encontrado = expReg.matcher(token);
if(encontrado.find()){ //encontramos el valor
intencionResultado = (String)c.getValue();
if(intencionResultado.equals("mismo")) //si contiene el valor de mismo extrae la cadena de la intencion
intencionResultado = encontrado.group();
//*******************seccion de prueba*****************
if(!predEnc.contains(predicado))// evalua si contiene el valor para no agregarlo nuevamente
predEnc.add(predicado); //guardamos los predicados en los cuales se encontro el valor
argMapa = (String)b.getKey(); //obtenemos la llave como argumento
argsPred = (String[])PredArg.get(predicado); //obtenemos el arreglo de argumentos de ese predicado
for(int l = 0;l < argsPred.length;l++){ //buscamos coincidencias en el arreglo de argumentos con el argumento del valor encontrado
if(argsPred[l].equals(argMapa)){ // si existe ese argumento del valor en el arreglo de arguementos
argsPred[l] = intencionResultado; //sustituimos el argumento con su valor
}
PredArg.put(predicado,argsPred); //lo reeplazamos en el mapa de argumentos
}
//*****************************************************
}
}
}
} //MAPA DE ARGUMENTOS
}
if(!predEnc.isEmpty()){
//recorre el array list y asociar sus valores con el mapa de predicados,argumentos para posteriormente imprimirlos
Iterator m = predEnc.iterator();
System.out.println("predicados relacionados");
while(m.hasNext()){
completo = true; //reestablecemos la bandera a su valor original
tmp1 = m.next().toString(); //obtenemos el valor de la lista de predicados encontrados
tmp2 = (String[])PredArg.get(tmp1); //obtenemos sus agrumentos asociados a ese predicado
//***********busqueda de argumentos completos*********
for(String arg: tmp2){
if(arg.length()== 1){
completo = false;
break;
}
}
//*****************************************************
if(completo){
System.out.print(tmp1+"("); //imprimimos ese predicado
for(String n: tmp2){ //recorremos los argumentos
if(bandera == false){//estos ifś sirven como formato de impresion de los argumentos
System.out.print(n);
bandera = true;
}
else
System.out.print(","+n);
}
bandera = false; // para concatenar las comas a partir del segundo argumento
System.out.print(")\n");
}
}
}
else{ System.out.println("noEntendi");}
return resultados;
}
/*************************************Este metodo leer el archivo y lo convierte en una cadena*****************************************/
public static String leer(String ruta){
File archivo = new File(ruta);
String linea=null;
String texto="";
int tamTexto;
if(archivo.exists()){
try{
FileReader caracter = new FileReader(archivo);
BufferedReader lector = new BufferedReader(caracter);
while((linea=lector.readLine())!= null)
texto += linea +"\n";
}catch(IOException e){
System.out.println("ha ocurrido un error al leer el archivo");
System.exit(1);
}
}
else System.out.println("no se encontro el archivo");
tamTexto = texto.length();
texto = texto.substring(0,tamTexto - 1);//eliminamos el ultimo salto de linea generado por este metodo
if(texto.endsWith(";")){
texto = texto.substring(0,tamTexto - 2); //eliminamos el ultimo ; ya que esto nos provocaria error al procesarse posteriormente
}
return texto;
}
/************************este metodo convierte la cadena mandada en un conjunto de cadenas en un arreglo*********/
public static String[] separadorDePredicadosIntenciones(String texto){
String[] intenciones = texto.split(";");
return intenciones;
}
/*************************Este metodo genera el primer mapa en donde contendra cada una de los predicandos la llave contendra
* los el predicado y el valos contendra los posibles valores para los argumentos de los predicados*****/
public static HashMap<String,String> mapaDeIntenciones(String[] intenciones,HashMap<String,Object> mapaDeArgumentos){
String[] predicado = null;
HashMap<String,String> mapaDeIntenciones= new HashMap<String,String>();
Pattern ExpReg=Pattern.compile("^\n"); //busca la intencion que comience con salto de linea
Matcher encontrado;
for(String intencion: intenciones){
encontrado = ExpReg.matcher(intencion);
if(encontrado.find()){
intencion=intencion.replaceFirst("^\n+","");//eliminamos los saltos de linea que tiene al inicio las intenciones
intencion=intencion.replaceFirst("\n$","");//eliminamos los saltos de linea que tiene al final las intenciones
}
predicado = intencion.split("\n"); //separamos por salto de linea y obtenemos el predicado
WordSpotting.posicionArg(predicado[0],mapaDeArgumentos);
if(predicado[0].contains("("))
predicado=predicado[0].split("\\(");//eliminamos los argumentos
mapaDeIntenciones.put(predicado[0],intencion);
}
return mapaDeIntenciones;
}
/******************************Este metodo genera un nuevo mapa, en la llave contenemos el predicando y en el valor ponemos el mapa anterior
* con todos los valores para las expresiones regulares******************************************************/
public static HashMap<String,Object> mapaPorCampos(HashMap<String,String> mapaDeIntenciones){
HashMap<String,Object> mapaFinal = new HashMap<String,Object>();
String[] DivEnDos = null;
// String[] ValorPorArg = null;
String[] DivEnCampos = null;
String[] separador = null;
String[] pre_arg = null; //variable agregada
String expresiones = "";
String idExpresion=null;
Iterator recorre = mapaDeIntenciones.entrySet().iterator();
while (recorre.hasNext()) {
HashMap<String,Object> mapaDeArgumentos = new HashMap<String,Object>(); //variable agregada
Map.Entry e = (Map.Entry)recorre.next();
expresiones = (String)e.getValue();//contiene las expresiones + el predicado
idExpresion = (String)e.getKey(); //solo contiene los argumentos sin predicado
pre_arg = expresiones.split("\n"); //dividimos el predicado de lo demas
for(int i=1;i<pre_arg.length;i++){ //comenzamos en 1 ya que no trataremos con los predicados
HashMap<String,String> mapaDeExpReg = new HashMap<String,String>();
if(pre_arg[i].contains("=")){
DivEnDos = pre_arg[i].split("=");
DivEnCampos = DivEnDos[1].split(":");
mapaDeArgumentos.put(DivEnDos[0],mapaDeExpReg); //mapa en donde cada argumento se le asigna un expresion regular
}
else{
DivEnCampos = pre_arg[i].split(":");
mapaDeArgumentos.put("0",mapaDeExpReg); //mapa en donde cada argumento se le asigna un expresion regular
}
for(String campo: DivEnCampos){
separador = campo.split(",");
if(campo.contains(","))
mapaDeExpReg.put(separador[0],separador[1]);
else
mapaDeExpReg.put(campo,"mismo");
}
mapaFinal.put(idExpresion,mapaDeArgumentos);
}
}
return mapaFinal;
}
public static void posicionArg(String llave,HashMap<String,Object> mapaDeArgumentos){
String argumentos = null;
String[] posArg = null; //posicion de los argumentos
String[] cero = {"0"}; //variable utilizada cuando no tengamos argumentos
String[] predicado = null;
//compilamos el patron
Pattern patron = Pattern.compile("\\((.*)\\)");//obtenemos todo lo que se encuentre dentro de ()
// creamos el Matcher a partir del patron, la cadena como parametro
Matcher encaja = patron.matcher(llave);
if(encaja.find()){
argumentos = encaja.group(1);
posArg = argumentos.split(","); //separamos los argumentos
predicado=llave.split("\\(");//eliminamos los argumentos
mapaDeArgumentos.put(predicado[0],posArg);//para los predicados con argumentos
}
else
mapaDeArgumentos.put(llave,cero); //para los predicados sin argumentos
}
public static String ObtenerPredicado(String llave){
String[] predicado = null;
predicado=llave.split("\\(");//eliminamos los argumentos
return predicado[0];
}
public static String[] ObtenerposicionArg(String llave){
String argumentos = null;
String[] cero = {"0"}; //variable utilizada cuando no tengamos argumentos
String[] argumentos_usuario;
Pattern patron = Pattern.compile("\\((.*)\\)");//obtenemos
// creamos el Matcher a partir del patron, la cadena como parametro
Matcher encaja = patron.matcher(llave);
if(encaja.find()){
argumentos = encaja.group(1);
argumentos_usuario = argumentos.split(",");
}
else
argumentos_usuario = cero;
return argumentos_usuario;
}
//##################################################seccion de impresion de mapas para la opcioh verbose###################################33
public static void imprimeMapa(HashMap mapa){
Iterator i = mapa.entrySet().iterator();
while (i.hasNext()){
Map.Entry e = (Map.Entry)i.next();
System.out.println("llave:"+e.getKey() + " valor:" + e.getValue());
System.out.println("##################################################");
}
}
public static void imprimeMapaArg(HashMap mapa){
String[] argumentos;
System.out.println("MAPA DE ARGUMETOS");
Iterator i = mapa.entrySet().iterator();
while (i.hasNext()) {
Map.Entry a = (Map.Entry)i.next();
System.out.print("llave:"+a.getKey() + " valor:");
argumentos = (String[])a.getValue();
for(String arg: argumentos)
System.out.print(" "+arg+" ");
System.out.println("");
System.out.println("#########################################################################################################");
}
}
}