-
Notifications
You must be signed in to change notification settings - Fork 0
/
query.py
86 lines (66 loc) · 2.43 KB
/
query.py
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
from xml.etree.ElementTree import Element, SubElement, Comment, tostring, ElementTree
from math import log10
import argparse
import os
parser = argparse.ArgumentParser(description="Programa para realizar consultas sobre un indice y archivo base. Si estos archivos no coinciden el resultado es inconsistente")
parser.add_argument('-base', dest='base', required=True, metavar='archivo_base.xml', type=str, help='nombre del archivo xml base con los documentos dentro de la carpeta "bases".\n ejemplo: -base 2000.xml')
parser.add_argument('-index', dest='index', required=True, metavar='archivo_indice.txt', type=str, help='nombre del archivo txt con los indices de las palabras de la base ingresada dentro de la carpete "indices".\n ejemplo: -index 2001_index.txt ')
args = parser.parse_args()
base_root = "bases/"
index_root = "indices/"
base_path = os.path.join(base_root, args.base)
index_path = os.path.join(index_root, args.index)
# Cargar documentos y obtener el numero total
base = open(base_path, 'r')
tree = ElementTree()
tree.parse(base)
base.close()
root = tree.getroot()
N = len(root) # numero documentos
# Cargar el index
index_file = open(index_path, 'r', encoding='utf-8')
index = index_file.read().split()
index_dic = {}
for line in index:
line = line.split('=')
docs = line[1].split('/')
index_dic[str(line[0])] = {}
for doc in docs:
value = doc.split(',')
tmp_dic = {str(value[0]): value[1]}
index_dic[line[0]].update(tmp_dic)
index_file.close()
while True:
print("Ingrese su consulta:")
query = input()
query = query.casefold().split()
# ranking de los documentos
rank = {}
for doc in root:
rank[doc.get('id')] = 0
for word in query:
if index_dic.get(word):
idf_word = log10(N / len(index_dic[word]))
# print(idf_word, word)
for doc in index_dic[word]:
tdf = float(index_dic[word][doc])
w = tdf*idf_word
rank[doc] = rank[doc] + w
# print(index_dic[word][doc])
# Busqueda documento mas relevante
ranking_result = 0
id_doc = []
for doc in rank:
if rank[doc] >= ranking_result:
ranking_result = rank[doc]
id_doc.append(doc)
for doc in root:
if doc.get('id') in id_doc:
year = doc.find('year').text
month = doc.find('month').text
day = doc.find('day').text
print("Archivo: {}\nFecha: {}/{}/{}".format(doc.get('url'), year, month, day))
print("Doc:{} / Rank:{}\n------------".format(doc.get('id'), ranking_result))
print("ingrese 's' para salir")
if input() == "s":
break