Práctica
A partir de una pequeña base de documentos, construir un sistema de recuperación de información prototipo que implemente un modelo vectorial con esquema de pesado tf/idf.
Se proporcionan 10 docs de texto y 2 consultas textuales de ejemplo. Es necesario implementar el código necesario para calcular los valores de similaridad de cada documento con respecto a cada una de las consultas. La medida de similaridad documento-consulta a calcular es la del producto interno de los respectivos vectores. Esto es, para el documento dj y la consulta qk:
sumatorio (wij * wik)
donde:
Los pesos estarán calculados según el siguiente esquema tf/idf :
wij= (raw tf i) * log (N/ni)
donde:
análogamente para los pesos de la consulta:
wik= (raw tf k) * log (N/ni)
donde:
Una vez calculados todos los valores de similaridad, será necesario producir un listado ordenado por similaridad para cada una de las consultas:
Q1:
D7 3.70000
D2 2.56700
...............
(hasta completar los 10 docs)
Indicaciones:
Si bien la fórmula del sumatorio está planteada para todos los términos i existentes en el vocabulario (todos los términos distintos que aparezcan en cualquiera de los textos de documentos y consultas), dado un documento dj y una consulta qk, el sumatorio puede reducirse a la suma de los términos que figuren en el texto de documento y consulta (todos los demas wij*wik dan cero, por ser al menos uno de los operandos igual a 0).
Estrategia sugerida:
1) Tomar el texto de la consulta e ir extrayendo sus términos. Para cada término obtener el número de veces que aparece en el texto de la consulta (raw tf k). También para cada término de la consulta, recorrer los 10 ficheros de documentos y calcular ni (número de textos en los que figura el término al menos una vez).
2) Recorrer secuencialmente cada uno de los documentos. Extraer uno a uno sus términos. Para aquéllos términos
que figuren también en la consulta calcular el número de veces que aparecen en el texto del documento (raw tf i).
Una vez hecho esto, ya podemos calcular el valor wij * wik para el término en cuestión. Acumular estos valores para todos los términos que figuran en la consulta.3) una vez tenemos todas las similaridades doc-consulta, construir el ranking ordenado por valor de similaridad.
Nota importante: Obviamente, en un sistema real de RI esta estrategia no es válida pues es muy costoso computacionalmente tener que revisar toda la base de documentos para calcular similaridades. En una situación realista se habría construido un fichero invertido al que se accede por término, de modo que los documentos donde figura el término están accesibles de modo directo sin tener que recurrir a un recorrido secuencial de toda la base de documentos.
Evaluación del rendimiento ("retrieval precision"):
Suponiendo que para q1 los documentos relevantes son d1, d2 y d3 y para q2 los documentos relevantes son d4 y d5, determinar si el procesamiento de stopwords mejora el rendimiento en la recuperación para cada una de las consultas.
Funciones de librería útiles (C):
fopen, fclose: abrir y cerrar ficheros de texto.
fgets: leer una linea del fichero de texto.
fscanf/sscanf: útil para ir obteniendo las palabras que hay en el fichero o en una línea.