Lucene的打分机制Word文档下载推荐.docx
- 文档编号:16412559
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:8
- 大小:17.71KB
Lucene的打分机制Word文档下载推荐.docx
《Lucene的打分机制Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Lucene的打分机制Word文档下载推荐.docx(8页珍藏版)》请在冰豆网上搜索。
1.
使用IKAnalyzer对ccer下的18652左右的网页进行了索引建立和查询系统的建立,索引建立的过程大概持续了10分钟,CPU使用率持续100%。
下面是索引建立之后的文件。
Index文件(调用了optimize之后的结果)
实现代码如下。
(附件中)
(我们做的是将目标的URL和所得的分数显示出来)
查询结果如下:
(1)搜“北京大学”
ReadNews.asp?
NewsID=14870.14996947
readview.asp?
reviewID=2296&
amp;
NewsID=2496
0.14321162
NewsID=8395
0.14157297
NewsID=41730.14049698
NewsID=18900.14018208
NewsID=34500.13792434
reviewID=2958&
NewsID=3020
0.13510498
NewsID=60090.13157436
NewsID=28080.13154271
NewsID=15870.12664454
18292pages(s)found(in63milliseconds)
我看了下网页中的内容,搜索结果中,第一个网页有39处匹配,文档内容也较长。
第二个网页有3处匹配,文档内容很短。
第三个网页有27处匹配,文档内容较长。
。
(2)
第二次搜索是针对第一次搜索结果中,排在第三位的网页中的内容。
网页中有一个获得全国三好学生的学生名字,叫“曾垚”。
试下看看结果。
NewsID=83950.73862696
NewsID=84480.10303292
NewsID=10894
0.10303292
news.asp?
alllistpage=91
0.09587039
NewsID=10557
NewsID=68890.09587039
6pages(s)found(in31milliseconds)
果然,第一个匹配的网页是第一次搜索的第三个网页,结果还不错。
2.
通过阅读相关文档和源代码,Lucene的Ranking算法中,包括score的计算和相似度分析。
Lucene将信息检索中的Booleanmodel(BM)和VectorSpaceModel
(VSM)联合起来,实现了自己的评分机制。
VSM模型如下:
计算某个查询q的文档d得分如下(摘自API文档注释):
其中每个因子的分析如下:
1)
在Lucene的实现中,使用了
2)
反映有多少个文档包含了该term,文档数越多,该因子的值越小,反之越大。
计算idf的常用方法为3)
查询时期t的加权,或者由t.setBoost(intboost)来指定
4)
压缩几个索引期间的加权和长度因子。
计算公式如下:
其中的因子解释如下:
Documentboost:
文档加权。
在索引创建过程中写入了索引中。
用doc.setBoost()
Fieldboost:
字段加权,在索引创建过程中写入了索引中。
field.setBoost()
lengthNorm(field):
由字段(Field)内的Token的个数来计算此值,字段越短,评分越高,在做索引的时候由
Similarity.lengthNorm计算。
5)评分因子,是基于文档中出现查询项的个数。
越多的查询项在一个文档中,说明些文档的匹配程序越高。
6)
查询的标准查询,使不同查询之间可以比较。
此因子不影响文档的排序,因为所有有文档都会使用此因子。
这个因子是在查询的时候计算的。
而sumOfSquareWeights的计算由下面来得到:
(注:
以上部分摘自Lucene的API文档的英文部分,自己进行了理解和翻译)
在Lucene中计算的具体过程分析如下:
在Lucene的Ranking计算过程中,包括了Query、Weight、Score、Similarity,
Collector几个不同的类。
文档匹配阶段主要调用Searcher对象的search方法,在search方法内部,通过直接或间接调
用,search(Weight
weight,Filterfilter,Collector
collector)方法。
通过阅读源代码,使用search的时候都将得到一个Weight对象(第一个的search方法显示调用了Query的
createWeight方法来创建一个Weight对象),Weight对象会创建一个Scorer对象,Scorer对象来进行score函数的调用
并将结果保存在Collector对象中。
如下:
publicvoidsearch(Queryquery,
Collectorresults)
throws
IOException{
search(createWeight(query),null,results);
}
@Override
publicvoid
search(Weightweight,Filterfilter,Collector
collector)
throwsIOException{
if
(filter==null){//没有使用Filter对象的时候
for(inti=0;
i&
lt;
subReaders.length;
i++){//遍历每个subReader,但在indexSearcher中,只有一个reader
collector.setNextReader(subReaders[i],docStarts[i]);
Scorerscorer=weight.scorer(subReaders[i],
!
collector.acceptsDocsOutOfOrder(),
true);
//创建了一个scorer对象
if(scorer!
=null){
scorer.score(collector);
//将结果保存在collector中,以便后边使用
}
else{
i++){//searcheachsubreader
searchWithFilter(subReaders[i],weight,filter,
collector);
publicWeight
weight(Searchersearcher)throwsIOException{
Queryquery
=searcher.rewrite(this);
Weight
weight=query.createWeight(searcher);
float
sum=weight.sumOfSquaredWeights();
norm=getSimilarity(searcher).queryNorm(sum);
(Float.isInfinite(norm)||Float.isNaN(norm))
norm=1.0f;
weight.normalize(norm);
//归一化
returnweight;
在源代码中可以看出(没有列出),在IndexReader中的subReaders数组中存放的只有原reader,没有其他的reader,那么
docStarts数组中也是一个只包含一个0的长度为1的数组。
构造Weight对象,通过调用scorer函数来构造Score对象,得到所有符合要
求的文档序列。
IDF的计算:
(在DefaultSimilarity类中)
publicfloat
idf(intdocFreq,intnumDocs){
return
(float)(Math.log(numDocs/(double)(docFreq+1))
+1.0);
TF的计算:
(在DefaultSimilarity中)
public
floattf(floatfreq){
return(float)Math.sqrt(freq);
}
得到Boost:
(在Query类中。
虽然在Fieldable接口和Document类中也有setBoost方法,但是还是建议在Query中调用,
因为在Fieldable和Document中定义boost的话,会一同写到index中,想改变boost会变得困难。
如果确实想提高一个文档或文档
中某个Field的分值,可以同index一起写到索引文件中)
publicfloatgetBoost(){returnboost;
}//Query类中的方法
3.
Lucene的Ranking算法的结果主要有Score和Similarity来进行计算,所以要改进Ranking算法,要从这两个方面入手。
思路:
网页的重要性
对网页的链接分析得到。
网页的链接分析主要根据外部链接网页的数量和链接网页的质量,网页内容的主题相关性等内容,确定网页重要性。
来改变Score的计算结果。
关键词匹配程度:
根据关键字匹配的算法,对基本的检索理论进行改进,针对不同位置、不同格式、不同形式的关键词,进行综合计算,最终得到每个文档与检索相关的匹配程度。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Lucene 打分 机制
![提示](https://static.bdocx.com/images/bang_tan.gif)