白话Elasticsearch24- 深度探秘搜索技术之TFIDF算法/向量空间模型算法/lucene的相关度分数算法
文章目錄
- 概述
- boolean model
- TF/IDF
- TF: term frequency
- IDF:inversed document frequency
- length norm
- vector space model向量空間模型
- lucene的相關(guān)度分?jǐn)?shù)算法
- boolean model
- lucene practical scoring function
- query normalization factor
- query coodination
- field level boost
概述
繼續(xù)跟中華石杉老師學(xué)習(xí)ES,第24篇
課程地址: https://www.roncoo.com/view/55
boolean model
類似and這種邏輯操作符,先過濾出包含指定term的doc
query “hello world” --> 過濾 --> hello / world / hello & world
bool --> must/must not/should --> 過濾 --> 包含 / 不包含 / 可能包含
doc --> 不打分?jǐn)?shù) --> 正或反 true or false --> 為了減少后續(xù)要計算的doc的數(shù)量,提升性能
TF/IDF
單個term在doc中的分?jǐn)?shù)
query: hello world --> doc.content doc1: java is my favourite programming language, hello world !!! doc2: hello java, you are very good, oh hello world!!!hello對doc1的評分
TF: term frequency
找到hello在doc1中出現(xiàn)了幾次,1次,會根據(jù)出現(xiàn)的次數(shù)給個分?jǐn)?shù)
一個term在一個doc中,出現(xiàn)的次數(shù)越多,那么最后給的相關(guān)度評分就會越高
IDF:inversed document frequency
找到hello在所有的doc中出現(xiàn)的次數(shù),3次
一個term在所有的doc中,出現(xiàn)的次數(shù)越多,那么最后給的相關(guān)度評分就會越低
length norm
hello搜索的那個field的長度,field長度越長,給的相關(guān)度評分越低; field長度越短,給的相關(guān)度評分越高
最后,會將hello這個term,對doc1的分?jǐn)?shù),綜合TF,IDF,length norm,計算出來一個綜合性的分?jǐn)?shù)
hello world --> doc1 --> hello對doc1的分?jǐn)?shù),world對doc1的分?jǐn)?shù) --> 但是最后hello world query要對doc1有一個總的分?jǐn)?shù) --> vector space model
vector space model向量空間模型
多個term對一個doc的總分?jǐn)?shù)
hello world --> es會根據(jù)hello world在所有doc中的評分情況,計算出一個query vector,query向量
hello這個term,給的基于所有doc的一個評分就是2
world這個term,給的基于所有doc的一個評分就是5
[2, 5]
query vector
doc vector,3個doc,一個包含1個term,一個包含另一個term,一個包含2個term
3個doc
doc1:包含hello --> [2, 0]
doc2:包含world --> [0, 5]
doc3:包含hello, world --> [2, 5]
會給每一個doc,拿每個term計算出一個分?jǐn)?shù)來,hello有一個分?jǐn)?shù),world有一個分?jǐn)?shù),再拿所有term的分?jǐn)?shù)組成一個doc vector
畫在一個圖中,取每個doc vector對query vector的弧度,給出每個doc對多個term的總分?jǐn)?shù)
每個doc vector計算出對query vector的弧度,最后基于這個弧度給出一個doc相對于query中多個term的總分?jǐn)?shù)
弧度越大,分?jǐn)?shù)月底; 弧度越小,分?jǐn)?shù)越高
如果是多個term,那么就是線性代數(shù)來計算,無法用圖表示
lucene的相關(guān)度分?jǐn)?shù)算法
我們boolean model、TF/IDF、vector space model
深入講解TF/IDF算法,在lucene中,底層,到底進(jìn)行TF/IDF算法計算的一個完整的公式是什么?
boolean model
query: hello world
"match": {"title": "hello world" }"bool": {"should": [{"match": {"title": "hello"}},{"natch": {"title": "world"}}] }普通multivalue搜索,轉(zhuǎn)換為bool搜索,boolean model
lucene practical scoring function
practical scoring function,來計算一個query對一個doc的分?jǐn)?shù)的公式,該函數(shù)會使用一個公式來計算
score(q,d) = queryNorm(q) · coord(q,d) · ∑ ( tf(t in d) · idf(t)2 · t.getBoost() · norm(t,d) ) (t in q)score(q,d) score(q,d) is the relevance score of document d for query q.
這個公式的最終結(jié)果,就是說是一個query(叫做q),對一個doc(叫做d)的最終的總評分
- queryNorm(q) is the query normalization factor (new).
queryNorm,是用來讓一個doc的分?jǐn)?shù)處于一個合理的區(qū)間內(nèi),不要太離譜,舉個例子,一個doc分?jǐn)?shù)是10000,一個doc分?jǐn)?shù)是0.1,你們說好不好,肯定不好
- coord(q,d) is the coordination factor (new).
簡單來說,就是對更加匹配的doc,進(jìn)行一些分?jǐn)?shù)上的成倍的獎勵
The sum of the weights for each term t in the query q for document d.
- ∑:求和的符號
∑ (t in q):query中每個term,query = hello world,query中的term就包含了hello和world
query中每個term對doc的分?jǐn)?shù),進(jìn)行求和,多個term對一個doc的分?jǐn)?shù),組成一個vector space,然后計算嗎,就在這一步
- tf(t in d) is the term frequency for term t in document d.
計算每一個term對doc的分?jǐn)?shù)的時候,就是TF/IDF算法
-
idf(t) is the inverse document frequency for term t.
-
t.getBoost() is the boost that has been applied to the query (new).
-
norm(t,d) is the field-length norm, combined with the index-time
field-level boost, if any. (new).
query normalization factor
queryNorm = 1 / √sumOfSquaredWeightssumOfSquaredWeights = 所有term的IDF分?jǐn)?shù)之和,開一個平方根,然后做一個平方根分之1,主要是為了將分?jǐn)?shù)進(jìn)行規(guī)范化 --> 開平方根,首先數(shù)據(jù)就變小了 --> 然后還用1去除以這個平方根,分?jǐn)?shù)就會很小 --> 1.幾 / 零點幾分?jǐn)?shù)就不會出現(xiàn)幾萬,幾十萬,那樣的離譜的分?jǐn)?shù)
query coodination
獎勵那些匹配更多字符的doc更多的分?jǐn)?shù)
Document 1 with hello → score: 1.5
Document 2 with hello world → score: 3.0
Document 3 with hello world java → score: 4.5
Document 1 with hello → score: 1.5 * 1 / 3 = 0.5
Document 2 with hello world → score: 3.0 * 2 / 3 = 2.0
Document 3 with hello world java → score: 4.5 * 3 / 3 = 4.5
把計算出來的總分?jǐn)?shù) * 匹配上的term數(shù)量 / 總的term數(shù)量,讓匹配不同term/query數(shù)量的doc,分?jǐn)?shù)之間拉開差距
field level boost
權(quán)重相關(guān)的設(shè)置,權(quán)重越大,相關(guān)度分?jǐn)?shù)越高
總結(jié)
以上是生活随笔為你收集整理的白话Elasticsearch24- 深度探秘搜索技术之TFIDF算法/向量空间模型算法/lucene的相关度分数算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 白话Elasticsearch23-深度
- 下一篇: 白话Elasticsearch26-深度