信息检索:对搜索引擎性能的评价指标的小作业---pooling方法以及MAP value的计算

来源:互联网 发布:oa系统数据库表设计 编辑:程序博客网 时间:2024/05/17 09:11

最近《信息检索》课程的homework,要评价信息检索评价指标,涉及到一些小东西,比如说pooling method(缓冲池)的计算、MAP values的计算、画P-R图,于是记录下来。

先上作业:


图1:作业

评价过程:

1.pooling method

先找到自己想要输入的3个query,到4种搜索引擎,取回前30条链接。共120个url,需要找到所有相关文档,遍历所有网页,查找相关文档几乎是不可能的任务,于是,便有pooling method,人工判断四个搜索引擎的120网页是否搜到了query相关的,然后在这120个url中(对url进行去重,4个搜索引擎搜到的肯定有重复的,重复的url去掉,剩下比如104个,在104个中找),有多少个是相关的,作为总的相关数也即A+C的个数,对应着各搜素引擎在30个中搜到了多少个相关的,以判别搜索引擎的性能

图2:人工判断的搜索引擎返回的链接的相关性并存着


2.P-R图

根据P-R图判断各搜索引擎对同一query搜索返回结果的性能,用基于ranking(排名)的方法计算P、R值,遍历搜索引擎找到的链接,判断遍历到的url有多少是相关的,也即是检索到并且相关的A的个数,遍历过去,也即检索到的所有的个数A+B=1-->30(如果存了搜索引擎返回来的30条url),找到30个点,也就可以画P-R图了,实际上画出来的图会是,锯齿状的,需要做些平滑。可取同一R处多个P的最高点处,取其平均,取其XX等各种方法平滑。有了点,可以用各种方法画图了,excel,matlab,直接在代码里用python画图来的更直接。

3.计算MAP值

MAP(Mean Average Precision):单个主题的平均准确率是每篇相关文档检索出后的准确率的平均值。主集合的平均准确率(MAP)是每个主题的平均准确率的平均值。 MAP 是反映系统在全部相关文档上性能的单值指标。系统检索出来的相关文档越靠前(rank 越高),MAP就可能越高。如果系统没有返回相关文档,则准确率默认为0。
例如:假设有两个主题,主题1有4个相关网页,主题2有5个相关网页。某系统对于主题1检索出4个相关网页,其rank分别为1, 2, 4, 7;对于主题2检索出3个相关网页,其rank分别为1,3,5。对于主题1,平均准确率为(1/1+2/2+3/4+4/7)/4=0.83。对于主题 2,平均准确率为(1/1+2/3+3/5+0+0)/5=0.45。则MAP= (0.83+0.45)/2=0.64。”(参考:http://blog.sina.com.cn/s/blog_662234020100pozd.html)

4.code

#coding:utf-8'''Created on 2014年10月27日'''import codecsimport pylab as pls_file=u"D:/搜狗高速下载/k网络信息检索/IR_homework2work/query_"url_txt="_url.txt"list_query=[u"无限开关",u"命中挚爱",u"longkissgoodbye"]list_se=[u"baidu",u"bing",u"google",u"sogou"]#将3个120的url去掉重复的,比如说剩下78,82,95,并且将其存到字典中,#要保证url的相关性,存0/1,故不使用set()remove_repeat=[{},{},{}]                        #--------------------------------------------num=0for i in range(len(list_query)):                    #i,分别为0,1,2代表着具体的query    for j in range(len(list_se)):                           #j。分别代表着各种se        #print "以下是在:\"",list_se[j],"\"中搜索\"",list_query[i],"\"的结果"        s_dir=s_file+list_query[i]+"/"+list_se[j]+url_txt            #        with codecs.open(s_dir) as file_url:            text_url=file_url.readlines()        for line in text_url:                   #遍历每一行,取url及相关文档判别标志            line=line.decode("utf-8")            #------------------------------直接把整行line投到set()里去重,也行,但还是要解析-            list_01_url=line.split(" ")           #前段处理已用空格隔开0/1和url            url=list_01_url[1].strip("\n")        #去掉换行符,            #print type(url),type(remove_repeat[i])            if url in remove_repeat[i].keys():                pass            else:#将i分别为无限开关,XX,XX,的120个url去重存到remove_repeat[i]中                remove_repeat[i][url]=int(list_01_url[0])            num=num+1##去重后,相关文档的个数list_rel_url=[0,0,0]for i in range(len(remove_repeat)):    for j in remove_repeat[i].keys():        if remove_repeat[i][j]==1:            list_rel_url[i]=list_rel_url[i]+1    print "去重后剩下url分别为:",len(remove_repeat[i])print "去重后相关url分别为:",list_rel_urlprint 30*"**"#---------------------------for i in range(len(list_query)):                    #i,分别为0,1,2代表着具体的query    for j in range(len(list_se)):                           #j。分别代表着各种se        num_url=0        num_30line=0        list_R=[]        list_P=[]        list_num_url_line=[]        print "以下是在:\"",list_se[j],"\"中搜索\"",list_query[i],"\"的结果"        s_dir=s_file+list_query[i]+"/"+list_se[j]+url_txt            #        with codecs.open(s_dir) as file_url:            text_url=file_url.readlines()        for line in text_url:                   #遍历每一行,取url及相关文档判别标志            line=line.decode("utf-8")            #------------------------------直接把整行line投到set()里去重,也行,但还是要解析-            list_01_url=line.split(" ")           #前段处理已用空格隔开0/1和url            url_rel=int(list_01_url[0])            url=list_01_url[1].strip("\n")        #去掉换行符,            if url_rel==1:                      #遍历30个,遇到了1,就得到一个点,P-R图,不必画30个点,                num_url=num_url+1                num_30line=num_30line+1                R=num_url*1.0/list_rel_url[i]                P=num_url*1.0/num_30line                list_num_url_line.append(num_30line)        #将那些出现1的行数,记录下来,用来算MAP值            else:                num_30line=num_30line+1            list_R.append(R)            list_P.append(P)        #计算MAP值        print "人工判断,有",num_url,"个相关的"        print list_query[i],"在",list_se[j],"下的MAP值为:",sum([1.0/k for k in list_num_url_line])*1.0/num_url        #遍历完了30行,并且数据分别存到了list_R和list_P中,就可以开始画图了        #s_title=list_query[i].decode('utf-8')        #pl.title(s_title)                        #在图片中,没发显示中文,乱码了吗        pl.xlabel(u"Recall")        pl.ylabel(u"Precision")        pl.plot(list_R,list_P,label=list_se[j])        pl.legend()    pl.savefig(s_file+list_query[i]+"/"+list_query[i]+"_PR.png")    #需要放到show()前面,不然存下来的图片为空白    pl.show()       #待画好了四张图,再展示出来    print 30*"**"

5.结果:

图3:“命中挚爱”的PR-图

6.小感想

最后计算MAP值,出来的结果不科学。搜狗居然赢了,吓尿了~!发现是其相关文档少了,反而成为了优势。另外的话,数据量太少了,只有30个,数据量少的时候用MAP判断搜索引擎的性能可能不太好。还有关于曲线平滑的问题,在后面的高于前面,这一点也是不太合理,也没深入分析~,~.......


1 0
原创粉丝点击