全文搜索怎么给查询语句与文档相关性打分

朴素想法

用户输入一个查询query,query由若干词(term)组成,文档也由若干词(term)组成。那么怎么评判查询和文档的相关性的高低。

很朴素简单的想法就是文档中包含的term与查询query中包含的term,两者越多相同的则说明越相关。比如query为”animal cat”,文档一内容为”cat dog bird animal”,文档二内容为”cat dog bird tiger”,则认为query与文档二的相关性比文档一的高。

词权重

现在缺少词权重,比如一个文档中cat出现次数为2,而dog次数为1,那么cat的权重应该高一些。比如cat在10个文档出现和在1个文档出现也有不同的权重。

一般来说,可以由两方面来影响某文档某term的权重:
1. 该文档词频(term frequency):该文档出现该term的次数,tf越大说明越重要。
2. 文档词频(document frequency):包含该term的文档数,df越大说明越不重要,说明它更大众。

于是某个term的权重可定为:

wt=tf∗log(totalDocdf)

VSM

向量空间模型(VSM)是一个计算俩文本相似性的经典算法。

  1. 将文档和query中term的并集看成是n维空间,每个term是一维。
  2. 将文档中term的权重看成一个n维向量,不存在的term看成权重为0。
  3. 同样将query看成是n维空间,每个term是一维。
  4. 同样将query的term的权重看成一个n维向量,不存在的term看成权重为0。

文档权重向量和query权重向量之间的夹角越小则认为相关性越大。于是,

sim(q,d)=q⋅d∥q∥×∥d∥=∑ni=1wi,qwi,d∑ni=1w2i,q√∑ni=1w2i,d√

干扰项

  • 表单符号,一般标点符号没有价值,去掉。
  • 停词,停词没有特别的意义,一般不能成为搜索的关键词,比如”the”,”that”,”this”等。

去掉这些干扰项可以让VSM降维,提升计算效率和准确度。

文档权重

对于某些文档可能相对重要点,有些文档没这么重要,这时需要额外的权重来表示。于是相关性得分,

score(q,d)=∑ni=1wi,qwi,d∑ni=1w2i,q√∑ni=1w2i,d√×boost

比如文档一的权重设为1.1,文档二的权重设为1.0,则通过这个权重系数可以向整体分数表达出来。

标准化

前面计算词权重时存在一个问题,文档出现某term次数越多则说明它的权重越大,那么是不是可以说一个包含了1000个term的文档出现了2次cat,就比一个包含了10个term的文档出现了1次cat权重大?于是需要引入标准化来解决这个问题,

wt=tf∗log(totalDocdf)∗1totalTerm√

通过标准化后减少了文档长度的影响。

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================
欢迎关注:

时间: 2024-10-26 04:53:06

全文搜索怎么给查询语句与文档相关性打分的相关文章

SQL Server 全文搜索 配置、查询初体验

原文:SQL Server 全文搜索 配置.查询初体验 一.使用SQL Server全文搜索配置 要使用SQL Server的全文搜索服务,需要进行如下配置. 1.开启全文搜索服务: 2.开启数据库的全文索引功能: --开启数据库的全文搜索功能 EXEC sp_fulltext_database 'enable'; 3.创建全文索引目录: --创建全文索引目录 CREATE FULLTEXT CATALOG IndexCatalog ON FILEGROUP [PRIMARY] IN PATH

可以搜索到DedeCms后台文章列表文档id吗?或者快速定位id编辑文章

我们在建站时有的时候发现之前的文章有错误了,要进行修改,但又不知道文章名,只知道大概的文章id,那么可以搜索到DedeCms后台文章列表文档id吗?或者快速定位文章id方便修改? 第一种方法:复制下面的链接地址,直接修改文章id(aid=1183这个数字),就进入文章编辑页面了 http://www.*.com/dede/archives_do.php?aid=1183&dopost=editArchives 第二种方法:后台那边添加搜索文档id功能,打开文件/dede/content_list

Solr全文搜索与MySQL查询性能比较

测试数据量:10407608Num Docs: 10407608 在项目中一个最常用的查询,查询某段时间内的数据,SQL查询获取数据,30s左右 SELECT * FROM `tf_hotspotdata_copy_test` WHERE collectTime BETWEEN '2014-12-06 00:00:00' AND '2014-12-10 21:31:55'; 对collectTime建立索引后,同样的查询,2s,快了很多. Solr索引 Solr查询,同样的条件,72ms "st

Word搜索指定位置的所有DOC文档

  Dim Adoc As String, PsDoc As Document On Error Resume Next ChDrive "C" '设置当前驱动器盘符 ChDir "C:Documents and SettingsMy DocumentsTemp" '进入指定目录 Adoc = Dir("*.doc") Application.ScreenUpdating = False Do While Adoc <> "

PostgreSQL SQL 语言:全文搜索

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权.1. 介绍 全文搜索(或者文本搜索)提供了确定满足一个查询的自然语言文档的能力,并可以选择将它们按照与查询的相关度排序.最常用的搜索类型是找到所有包含给定查询词的文档并按照它们与查询的相似性顺序返回它们.查询和相似性的概念非常灵活并且依赖于特定的应用.最简单的搜索认为查询是一组词而相似性是查询词在文档中的频度. 文本搜索操作符已经在数据库中存在很多年了.PostgreSQL对文本数据类型提供了~.~*.LIKE和ILIK

对JavaScript的全文搜索实现相关度评分的功能的方法

  这篇文章主要介绍了对JavaScript的全文搜索实现相关度评分的功能的方法,采用了一个名为Okapi BM25的算法,文中亦有介绍,需要的朋友可以参考下 全文搜索,与机器学习领域其他大多数问题不同,是一个 Web 程序员在日常工作中经常遇到的问题.客户可能要求你在某个地方提供一个搜索框,然后你会写一个类似 WHERE title LIKE %:query% 的 SQL 语句实现搜索功能.一开始,这是没问题,直到有一天,客户找到你跟你说,"搜索出错啦!" 当然,实际上搜索并没有&q

详细讲解PostgreSQL中的全文搜索的用法_数据库其它

开发Web应用时,你经常要加上搜索功能.甚至还不知能要搜什么,就在草图上画了一个放大镜. 搜索是项非常重要的功能,所以像elasticsearch和SOLR这样的基于lucene的工具变得很流行.它们都很棒.但使用这些大规模"杀伤性"的搜索武器前,你可能需要来点轻量级的,但又足够好的搜索工具. 所谓"足够好",我是指一个搜索引擎拥有下列的功能:     词根(Stemming)     排名/提升(Ranking / Boost)     支持多种语言     对拼

如何设计高效合理的MySQL查询语句_Mysql

MySQL查询语句大家都在用,但是应该如何设计高效合理的MySQL查询语句呢?下面就教您MySQL查询语句的合理设计方法,分享给大家学习学习. 1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率.现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构.索引的使用要恰到好处,其使用原则如下: ●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引. ●在频繁进行排序或分组(即进行group by或order by操作)的列上

mongodb数据常用查询语句笔记

这节来说说如何检索mongodb数据.首先向文档中插入一些数据. 1. 插入数据  代码如下 复制代码 > use ttlsa_com switched to db ttlsa_com > db.mediaCollection.insert({ "Type" : "Book", "Title" : "Definitive Guide to MongoDB, the", "ISBN" : &quo