Lucene TFIDFSimilarity

读了Lucene打分文档之后,有必要了解一下TFIDFSimilarity中的调用堆栈。

public abstract class TFIDFSimilarity extends Similarity {

        public TFIDFSimilarity() {}


        @Override

        // overlap overlap

        // maxOverlap 

        public abstract float coord(int overlap, int maxOverlap);


        @Override

        public abstract float queryNorm(float sumOfSquaredWeights);


        public abstract float tf(float freq);


        public abstract float idf(long docFreq, long numDocs);


        public abstract float lengthNorm(FieldInvertState state);


        @Override

        public final long computeNorm(FieldInvertState state) {

                float normValue = lengthNorm(state);

                return encodeNormValue(normValue);

        }   


        public abstract float decodeNormValue(long norm);


        public abstract long encodeNormValue(float f); 


        public abstract float sloppyFreq(int distance);


        public abstract float scorePayload(int doc, int start, int end, BytesRef payload);


        @override

        public final SimScorer simScorer(SimWeight stats, AtomicReaderContext context) throws IOException {

                IDFStats idfstats = (IDFStats)stats;

                return new TFIDFSimScorer(idfstats, context.reader().getNormValues(idfstats.field));

        }   


        @Override

        public final SimWeight computeWeight(float queryBoost, CollectionStatistics collectionStats, TermStatistics... termStats) {

                return new IDFStats(collectionStats.field(), idf, queryBoost);

        }   

}

几个接口都非常清楚明白了。

两个内部类TFIDFSimScorer(继承至SimScorer)和IDFStats(继承自SimWeight),其中IDFStats的value提供value,这个value值是在提供getValueForNormalization供上层(对BooleanQuery来说)得到queryNorm后再调用normalize之后才得到的。这个value只是经过normalize的idf值,在打分时调用TFIDFSimScorer.score(int doc, float freq)会将tf乘以value,然后再乘以norm值(如果没有norm值就乘以1.0),如果为了更贴近vsm模型,norm值还是要的,不过缺点还是不够精确(精度丢失)。另外在获取normalized的idf时并没有乘以一个term boost,所以如果要区分不同field,不同term的权重,TFIDFSimilarity还有不足。按照这个score的节奏,上层的BooleanScorer只要将各个term,phrase query的score累加起来就可以。


DefalutSimilarity就是对上面的抽象方法进行实现了,注意其中有个discountOverlaps,设置是否对重复的term不做计算,lengthNorm = state.getBoost() * 1.0 / Math.sqrt(numTerms),state.getBoost()应该是field boost吧?再看sloppyFreq,则是1 / (1 + distance),scorePayload总是返回1


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自己动手写搜索引擎 1 第1章 了解搜索引擎 1 1.1 Google神话 1 1.2 体验搜索引擎 1 1.3 你也可以做搜索引擎 4 1.4 本章小结 4 第2章 遍历搜索引擎技术 5 2.1 30分钟实现的搜索引擎 5 2.1.1 准备工作环境(10分钟) 5 2.1.2 编写代码(15分钟) 6 2.1.3 发布运行(5分钟) 9 2.2 搜索引擎基本技术 14 2.2.1 网络蜘蛛 14 2.2.2 全文索引结构 14 2.2.3 Lucene 全文检索引擎 15 2.2.4 Nutch网络搜索软件 15 2.2.5 用户界面 17 2.3 商业搜索引擎技术介绍 17 2.3.1 通用搜索 17 2.3.2 垂直搜索 18 2.3.3 站内搜索 19 2.3.4 桌面搜索 21 2.4 本章小结 21 第3章 获得海量数据 22 3.1 自己的网络蜘蛛 22 3.1.1 BerkeleyDB介绍 27 3.1.2 抓取网页 28 3.1.3 MP3 抓取 29 3.1.4 RSS 抓取 30 3.1.5 图片抓取 33 3.1.6 垂直行业抓取 34 3.2 抓取数据库中的内容 36 3.2.1 建立数据视图 36 3.2.2 JDBC数据库连接 36 3.2.3 增量抓取 40 3.3 抓取本地硬盘上的文件 41 3.3.1 目录遍历 41 3.4 本章小结 42 第4章 提取文档中的文本内容 43 4.1 从HTML文件中提取文本 43 4.1.1 HtmlParser介绍 51 4.1.2 结构化信息提取 54 4.1.3 网页去噪 60 4.1.4 网页结构相似度计算 63 4.1.5 正文提取的工具FireBug 64 4.1.6 正文提取的工具NekoHTML 66 4.1.7 正文提取 68 4.2 从非HTML文件中提取文本 73 4.2.1 TEXT文件 73 4.2.2 PDF文件 73 4.2.3 Word文件 82 4.2.4 Rtf文件 82 4.2.5 Excel文件 83 4.2.6 PowerPoint文件 84 4.3 流媒体内容提取 85 4.3.1 音频流内容提取 85 4.3.2 视频流内容提取 87 4.4 抓取限制应对方法 89 4.5 本章小结 90 第5章 自然语言处理 91 5.1 中文分词处理 91 5.1.1 Lucene 中的中文分词 91 5.1.2 Lietu中文分词的使用 92 5.1.3 中文分词的原理 92 5.1.4 查找词典算法 95 5.1.5 最大概率分词方法 98 5.1.6 新词发现 101 5.1.7 隐马尔可夫模型 102 5.2 语法解析树 104 5.3 文档排重 105 5.4 中文关键词提取 106 5.4.1 关键词提取的基本方法 106 5.4.2 关键词提取的设计 107 5.4.3 从网页提取关键词 107 5.5 相关搜索 107 5.6 拼写检查 110 5.6.1 英文拼写检查 110 5.6.2 中文拼写检查 112 5.7 自动摘要 116 5.7.1 自动摘要技术 117 5.7.2 自动摘要的设计 117 5.7.3 Lucene中的动态摘要 124 5.8 自动分 125 5.8.1 Classifier4J 126 5.8.2 自动分的接口定义 127 5.8.3 自动分的SVM方法实现 128 5.8.4 多级分 128 5.9 自动聚 131 5.9.1 聚的定义 131 5.9.2 K均值聚方法 131 5.9.3 K均值实现 133 5.10 拼音转换 138 5.11 语义搜索 139 5.12 跨语言搜索 143 5.13 本章小结 144 第6章 创建索引库 145 6.1 设计索引库结构 146 6.1.1 理解 Lucene 的索引库结构 146 6.1.2 设计一个简单的索引库 148 6.2 创建和维护索引库 149 6.2.1 创建索引库 149 6.2.2 向索引库中添加索引文档 149 6.2.3 删除索引库中的索引文档 151 6.2.4 更新索引库中的索引文档 151 6.2.5 索引的合并 151 6.2.6 索引的定时更新 152 6.2.7 索引的备份和恢复 153 6.2.8 修复索引 154 6.3 读写并发控制 154 6.4 优化使用 Lucene 155 6.4.1 索引优化 155 6.4.2 查询优化 157 6.4.3 实现时间加权排序 162 6.4.4 实现字词混合索引 163 6.4.5 定制Similarity 170 6.4.6 定制Tokenizer 171 6.5 查询大容量索引 173 6.6 本章小结 174 第7章

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值