一、题目要求
在Experiment1的基础上实现最基本的Ranked retrieval model
• Input:a query (like Ron Weasley birthday)
•Output: Return the top K (e.g., K = 100) relevant tweets.
Use SMART notation: lnc.ltn
• Document: logarithmic tf (l as first character), no idf and cosine normalization
• Query: logarithmic tf (l in leftmost column), idf (t in second column),
no normalization
改进Inverted index
• 在Dictionary中存储每个term的DF
• 在posting list中存储term在每个doc中的TF with pairs (docID, tf)
选做
• 支持所有的SMART Notations
二、实验原理与数据结构
原理:
采用的的权重计算机制是Inc.Itn,即文档向量采用了对数tf的计算方法,没有采用idf因子(同时基于效率和效果的考虑)及余弦归一化方法,而此时查询向量采用了对数tf计算方法,id权重因子及归一化方法
数据结构
- 首先设置共同需要的全局变量,postings(id,tf)、document_frequency(词出现的文档总数)、docunment_numbers(文档总数)、
document_lengths(每个id对应的文档长度)、avdl(文档平均长度) - 预处理
首先是对数据集tweets的预处理,与实验一预处理类似,首先将我们需要的tweetid text三部分主要信息,对这三部分信息进行去除无用词、词干还原等操作返回更新后的doc
对询问数据集queries进行预处理,将需要的queries提取出来,并将处理后的数据集存入queries字典,方便提取查询,对处理后的query统计词频、总文档数、词出现的query数、query的长度等信息,读入每一行时记录每一个query的长度,存入query_lengths,在遍历不同的词时统计词频存入postings1(id,tf),此处的id人为设定,从0开始标号,再输出到文件中q-Invertedtf.txt,遍历完所有的prequeries行后,对postings1进行遍历,统计每个词出现的文档数存入query_frequency,再输出到文件中q-Inverteddtf.txt,处理后的数据如图所示
对文档进行统计词频、总文档数、词出现的文档数、文档的长度等信息,读入每一行时记录每一篇文档的长度,存入document_lengths,在遍历不同的词时统计词频存入postings(id,tf),再输出到文件中Invertedtf.txt,遍历完所有的tweets行后,对postings进行遍历,统计每个词出现的文档数存入document_frequency,再输出到文件中Inverteddtf.txt,处理后的数据如图所示
- 权重计算
对输入的query进行上述的预处理过程,更新query总数query_numbers,对于query采用公式ltn,对于document,更新query总数query_numbers,采用公式lnc
l(logarithm) = 1 +
log
(
t
f
t
,
d
)
\log(tf_{t,d})
log(tft,d)
t(idf) =
l
o
g
(
N
d
f
t
)
log(\frac{N}{df_t})
log(dftN)
n(none) = 1
c(cosine) =
1
w
1
2
+
w
2
2
+
.
.
.
+
w
n
2
\frac{1}{\sqrt{w_1^2+w_2^2+...+w_n^2}}
w12+w22+...+wn21
代码实现
- 查找函数
首先对输入的query进行分词去重词干还原等操作,为了避免遍历所有的tweet,先提取出有相关性的tweetid,tweet中包含查询的关键词之一便可认为相关,之后对权重计算返回的相似性结果进行降序排序,输出前10个最有相关性的结果
代码实现
三、实验结果
首先是对预处理后的queries进行排序输出前10个最相关的文档之后就可以手动输入自己想要查询的内容,结果如下
对预处理后的queries结果
对自己输入查询结果
例如输入:Ron Weasley birthday
从结果中可以看到有多少条是与我们输入的查询是相关的,并且可以看到最相关的10个的tweetid
四、反思与总结
- 进行查询权重机制时,发现返回的结果中有负值,这是不正确的,经过排查检错,发现只是定义了文档总数,但是在处理完tweets数据集后没有对其进行更新,导致错误。
- 在返回的查询相似度结果排序中,我们应该选择降序排序,输出相似度最大的前10个,所以在调用函数sort后应该将sort后的结果reverse后再输出
- 经过这次实验对文档权重和查询权重机制有了更深的了解,还要继续学习,减少错误