Repository navigation
Expand file tree
/
Copy pathBooleanRetrieval.py
More file actions
124 lines (94 loc) · 3.69 KB
/
Copy pathBooleanRetrieval.py
File metadata and controls
124 lines (94 loc) · 3.69 KB
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
import sys
import re
import os
invertedList = {}
docNameToIDMap = {}
# This function returns a set containing individual tokens in the
# file passed to the function.
def tokenize(file):
tokenSet = set()
for line in file:
line = line.lower()
tokens = re.sub('[^0-9a-zA-Z]+', ' ', line).split()
for token in tokens:
tokenSet.add(token)
return tokenSet
# This function gets called continuously for each document and builds
# the inverted list (dict) containing the token to the documentID set
def buildIndex(tokenSet, docID):
global invertedList
for token in tokenSet:
if token in invertedList:
invertedList[token].add(docID)
else:
invertedList[token] = set([docID])
# This function gets called at the beginning and builds a map from
# document name to document ID.
def buildDocIndex():
global docNameToIDMap
fileList = []
if len(sys.argv) > 1:
datasetDirectory = sys.argv[1]
else:
datasetDirectory = "nsf award abstracts"
for root, dirs, files in os.walk(os.getcwd()+"//"+datasetDirectory):
for singleFile in files:
if str(singleFile).endswith("txt"):
fileList.append(singleFile)
docID = 1
for singleFile in fileList:
docNameToIDMap[singleFile] = docID
docID = docID + 1
# This function processes the user query.
def processUserQuery():
global invertedList
global docNameToIDMap
userQuery = ""
while True:
print " "
userQuery = raw_input("Input your query : ")
userQuery = userQuery.lower()
if str(userQuery) == "exit":
print "Exiting program...Have a nice day!"
break
queryTokenList = re.sub('[^0-9a-zA-Z]+', ' ', userQuery).split()
postingList = []
setIntersection = set()
for token in queryTokenList:
if invertedList.get(token) != None:
postingList.append(invertedList[token])
if len(postingList) == 0:
print "Sorry, No Matches found :("
continue
setIntersection = set.intersection(*postingList)
if len(setIntersection) == 0:
print "Sorry, No Matches found :("
continue
print str(len(setIntersection)) + " occurrences found."
invertedDocMap = {v:k for k,v in docNameToIDMap.items()}
matchedDocumentsList = []
for docID in setIntersection:
matchedDocumentsList.append(invertedDocMap[docID])
for document in matchedDocumentsList:
print document
def main():
global docNameToIDMap
global invertedList
print "Please wait while the index is generated.."
buildDocIndex()
if len(sys.argv) > 1:
datasetDirectory = sys.argv[1]
else:
datasetDirectory = "nsf award abstracts"
# Each file in the directory is traversed and the inverted list is built.
for root, dirs, files in os.walk(os.getcwd()+"//"+datasetDirectory):
for singleFile in files:
if str(singleFile).endswith("txt"):
textFile = open(root+"//"+str(singleFile), 'r')
tokenSet = tokenize(textFile)
buildIndex(tokenSet, docNameToIDMap.get(str(singleFile)))
textFile.close()
print "Index built! You may enter your queries now!"
processUserQuery()
if __name__ == '__main__':
main()