In Homework 2, you will be implementing indexing and searching techniques for Boolean retrieval described in Lectures 2 and 3.
Your indexing script,
index.py, should be called in this format:
$ python index.py -i directory-of-documents -d dictionary-file -p postings-file
Documents to be indexed are stored in directory-of-documents. In
this homework, we are going to use the Reuters training data set
provided by NLTK. Depending on where you specified the directory for
NLTK data when you first installed the NLTK data (recall that the
installation is triggered by
nltk.download()), this data
set is located under a path like:
On sunfire, recall that we installed the NLTK python module and its corpora under the class UNIX account. So the Reuters training data is here:
Recall that the dictionary is commonly kept in memory, with
pointers to each postings list, which is stored on disk. This is
because the size of dictionary is relatively small and consistent,
while the postings can get very large when we index millions of
documents. At the end of the indexing phase, you are to write the
dictionary-file and the postings into
postings-file. For example, the following command writes
the dictionary and postings into
$ python index.py -i /home/course/cs3245/nltk_data/corpora/reuters/training/ -d dictionary.txt -p postings.txt
Although you can use any file names as you like, in this homework
please follow the above command to use
postings.txt, so that our marking script can easily
locate the files.
In order to collect the vocabulary, you need to apply tokenization
and stemming on the document text. You should use the NLTK tokenizers
nltk.word_tokenize()) to tokenize sentences and words,
and the NLTK Porter stemmer (
class nlkt.stem.porter) to do
stemming. You need to do case-folding to reduce all words to lower
You also need to implement skip pointers in the postings lists. Implement the method described in the lecture, where math.sqrt(len(posting)) skip pointers are evenly placed on the a postings list. Although implementing skip pointers takes up extra disk space, it provides a shortcut to efficiently merge two postings lists, thus boosting the searching speed.
Here is the command to run your searching script,
$ python search.py -d dictionary-file -p postings-file -q file-of-queries -o output-file-of-results
postings-file are the
output files from the indexing phase. Queries to be tested are stored
file-of-queries, in which one query occupies one
line. Your answer to a query should contain a list of document IDs
that match the query in increasing order. In the Reuters corpus, the
document IDs should follow the filenames (that is, your indexer should
assign its document ID 1 to the filename named "1"; also note that
while Reuters doc IDs are unique integers, they are not necessary
sequential). For example, if three documents 12, 40 and 55 are found
in the search, you should write "12 40 55" into
output-file-of-results in one line. When no document is
found, you should write an empty line. The results in
output-file-of-results should correspond to the queries
Your program should not read the whole postings-file into
memory, because in practice, this file may be too large to fit into
memory when we index millions of documents. Instead, you should use
the pointers in the dictionary to load the postings lists from the
postings-file. Make sure you use the
read I/O functions that come from python's IO
library for this.
The operators in the search queries include:
The operators will always be in UPPER CASE (lower case "and"s, "or"s
and "not"s simply won't occur in your data (but you should probably
bulletproof your code anyways). You can safely assume that there is
no nested parentheses, for example, the query
(a AND (b OR
c)) will not occur. However, there only a light restriction on
the length of the query (won't be over 1024 characters but can be
long). Note that parentheses have higher precedence than
NOT, which has a higher precedence than
which has a higher precedence than
OR are binary operators, while
NOT is a
unary operator. Below is an illustration of a valid example query:
bill OR Gates AND (vista OR XP) AND NOT mac
While indexing is an off-line phase, searching is designed to be real-time (the extreme example is Google Instant), thus efficiency is very important in searching. In this homework, we won't be evaluating based on how fast your program can index a list of documents (the preprocessing), but we will test the efficiency of your searching program (runtime speed), as well as its accuracy.
postings.txt. Please do not include the Reuters data.
You are also asked to answer the following essay questions. These are to test your understanding of the lecture materials. Note that these are open-ended questions and do not have gold standard answers. A paragraph or two are usually sufficient for each question. You may receive a small amount of extra credit if you can support your answers with experimental results.
word_tokenize()? Can you propose rules to further refine these results?
You are allowed to do this assignment individually or as a team of two. There will be no difference in grading criteria if you do the assignment as a team or individually. updated For the submission information below, simply replace any mention of a matric number with the two matric numbers concatenated with a separating dash (e.g., A000000X-A000001Y).
For us to grade this assignment in a timely manner, we need you to adhere strictly to the following submission guidelines. They will help me grade the assignment in an appropriate manner. You will be penalized if you do not follow these instructions. Your matric number in all of the following statements should not have any spaces and any letters should be in CAPITALS. You are to turn in the following files:
README.txt: this is a text only file that describes any information you want me to know about your submission. You should not include any identifiable information about your assignment (your name, phone number, etc.) except your matric number and email (we need the email to contact you about your grade, please use your firstname.lastname@example.org address, not your email alias). This is to help you get an objective grade in your assignment, as we won't associate matric numbers with student names.
ESSAY.txtthat contains your answers to the essay questions.
These files will need to be suitably zipped in a single file called
<matric number>.zip. Please use a zip archive and
not tar.gz, bzip, rar or cab files. Make sure when the archive unzips
that all of the necessary files are found in a directory called
<matric number>. Upload the resulting zip file to the IVLE
workbin by the due date: 3 Mar 2017,
11:59:59 pm SGT. There absolutely will be no extensions to the
deadline of this assignment. Read the late policy if you're not sure
about grade penalties for
The grading criteria for the assignment is tentatively:
Disclaimer: percentage weights may vary without prior notice.
read(). You must use these operations when coding
search.py, and not rely on other modules (e.g.,
linecache. Please look through the documentation or web pages for these.
<) but you can safely ignore then; you do not have to process these in any special way for this assignment.
-i) are correctly interpreted (add trailing slash if needed). Check that your output is in the correct format (docIDs separated by single spaces, no quotations, no tabs).