Neil Zhu,簡(jiǎn)書(shū)ID Not_GOD,University AI 創(chuàng)始人 & Chief Scientist第焰,致力于推進(jìn)世界人工智能化進(jìn)程。制定并實(shí)施 UAI 中長(zhǎng)期增長(zhǎng)戰(zhàn)略和目標(biāo)妨马,帶領(lǐng)團(tuán)隊(duì)快速成長(zhǎng)為人工智能領(lǐng)域最專(zhuān)業(yè)的力量挺举。
作為行業(yè)領(lǐng)導(dǎo)者,他和UAI一起在2014年創(chuàng)建了TASA(中國(guó)最早的人工智能社團(tuán)), DL Center(深度學(xué)習(xí)知識(shí)中心全球價(jià)值網(wǎng)絡(luò))烘跺,AI growth(行業(yè)智庫(kù)培訓(xùn))等湘纵,為中國(guó)的人工智能人才建設(shè)輸送了大量的血液和養(yǎng)分。此外滤淳,他還參與或者舉辦過(guò)各類(lèi)國(guó)際性的人工智能峰會(huì)和活動(dòng)梧喷,產(chǎn)生了巨大的影響力,書(shū)寫(xiě)了60萬(wàn)字的人工智能精品技術(shù)內(nèi)容,生產(chǎn)翻譯了全球第一本深度學(xué)習(xí)入門(mén)書(shū)《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》铺敌,生產(chǎn)的內(nèi)容被大量的專(zhuān)業(yè)垂直公眾號(hào)和媒體轉(zhuǎn)載與連載汇歹。曾經(jīng)受邀為國(guó)內(nèi)頂尖大學(xué)制定人工智能學(xué)習(xí)規(guī)劃和教授人工智能前沿課程,均受學(xué)生和老師好評(píng)偿凭。
相關(guān)度打分的基本理論
源地址
Lucene使用Boolean模型來(lái)尋找匹配的文檔产弹,還有稱(chēng)之為Practical Document Frequency的公式來(lái)計(jì)算相關(guān)度。這個(gè)公式使用了TF/IDF和向量空間模型笔喉,額外加入了更為現(xiàn)代的特性諸如coordination因子取视、字段長(zhǎng)度正規(guī)化和term或者查詢(xún)語(yǔ)句的boost硝皂。
不要被這些東西嚇到常挚!這些概念都不如名稱(chēng)看上去復(fù)雜。盡管這部分涉及不少算法稽物、公式和數(shù)學(xué)模型奄毡,但這是為正常人準(zhǔn)備的。理解算法本身并不如理解影響最終結(jié)果的因子那么重要贝或。
boolean model
布爾模型應(yīng)用在查詢(xún)中的AND
吼过、OR
和NOT
條件來(lái)查找所有匹配的文檔。查詢(xún)“full AND text AND search AND (elasticsearch OR lucene)
”只會(huì)包含那些包含所有full, text, and search, 和elasticsearch或lucene咪奖。
這個(gè)過(guò)程既簡(jiǎn)單又快速盗忱。通常用來(lái)排除任何不滿(mǎn)足這個(gè)查詢(xún)的文檔。
TF/IDF
一旦我們有了匹配的文檔羊赵,他們需要進(jìn)行相關(guān)度排名趟佃。不是所有文檔都包含所有term,一些term比另外一些更加重要昧捷。整個(gè)文檔的相關(guān)度分?jǐn)?shù)(部分)依賴(lài)于每個(gè)查詢(xún)term中的那些出現(xiàn)在文檔中的term的權(quán)重闲昭。
一個(gè)項(xiàng)的權(quán)重有三個(gè)決定因素,我們?cè)谑裁词窍嚓P(guān)度中已經(jīng)介紹過(guò)了靡挥。下面的公式供感興趣的人們參考序矩,不過(guò)也不必須真的記住。
term-frequency
在這片文檔中term出現(xiàn)的頻率如何跋破?出現(xiàn)得越多簸淀,term的權(quán)值越高。一個(gè)包含了5個(gè)相同term的出現(xiàn)的字段肯定比只有一個(gè)出現(xiàn)的字段的相關(guān)度更高毒返。TF定義如下:
tf(t in d) = \sqrt(frequency)
文檔d中的term t的tf是出現(xiàn)次數(shù)的平方根
如果你不管出現(xiàn)的次數(shù)租幕,而只關(guān)注其是否出現(xiàn),那么你可以通過(guò)字段的mapping來(lái)修改這項(xiàng)設(shè)定:
PUT /my_index
{
"mappings": {
"doc": {
"properties": {
"text": {
"type": "string",
"index_options": "docs"
}
}
}
}
}
將index_options
設(shè)置為docs
將會(huì)關(guān)閉tf和term位置饿悬。使用這個(gè)mapping的不會(huì)計(jì)算一個(gè)term出現(xiàn)多少次令蛉,也不會(huì)對(duì)phrase或者近似查詢(xún)有多大幫助。那些設(shè)置為not_analyzed
的字符串字段默認(rèn)使用這個(gè)設(shè)置。
IDF
在整個(gè)文檔集合中這個(gè)term出現(xiàn)了多少次珠叔?出現(xiàn)得越多蝎宇,其權(quán)值越低。諸如and
和the
這樣的term對(duì)于相關(guān)性貢獻(xiàn)值極低因?yàn)樗麄兂霈F(xiàn)在了幾乎所有的文檔中祷安,而那些不太常見(jiàn)的term如elasticsearch
和hippopotamus
會(huì)幫助我們定位到最有趣的文檔姥芥。IDF按照下面的方式定義:
idf(t) 1 + \log ( numDocs / (docFreq + 1))
term t的IDF是索引中的文檔數(shù)量除上包含t的文檔的數(shù)量的對(duì)數(shù)
字段長(zhǎng)度范數(shù)(field length norm)
這個(gè)field多長(zhǎng)?字段長(zhǎng)度越短汇鞭,權(quán)值更高凉唐。如果一個(gè)term出現(xiàn)在短的字段中,諸如title
字段霍骄,更可能台囱,那個(gè)字段的內(nèi)容是關(guān)于這個(gè)項(xiàng)而不是如果同樣的term出現(xiàn)在一個(gè)更大的body
字段中。這個(gè)字段長(zhǎng)度范數(shù)按照下面的公式計(jì)算:
norm(d) = \sqrt(numTerms)
字段長(zhǎng)度范數(shù)(norm)是在文檔中的term的樹(shù)木的平方根读整。
盡管字段長(zhǎng)度范數(shù)對(duì)全文檢索非常重要簿训,其他的字段常常不需要范數(shù)。
范數(shù)大概消耗索引中的每個(gè)文檔的每個(gè)string
字段一個(gè)字節(jié)米间,不管這個(gè)文檔是否包含字段本身强品。精確值not_analyzed
字符串字段默認(rèn)關(guān)閉范數(shù),但是你可以使用字段映射來(lái)關(guān)閉analyzed
字段:
PUT /my_index
{
"mappings": {
"doc": {
"properties": {
"text": {
"type": "string",
"norms": { "enabled": false }
}
}
}
}
}
這個(gè)字段的范數(shù)不會(huì)起作用屈糊。long型的字段和short的字段會(huì)被看作相同的長(zhǎng)度的榛。
對(duì)logging這樣的情況,范數(shù)沒(méi)什么作用逻锐。你所關(guān)注的是一個(gè)字段是否包含一個(gè)特定的錯(cuò)誤碼或者一個(gè)特定的瀏覽器ID夫晌。這個(gè)字段的長(zhǎng)度不會(huì)影響結(jié)果。關(guān)閉范數(shù)可顯著節(jié)省大量的內(nèi)存谦去。
整合起來(lái)
這三個(gè)因素——tf慷丽、idf和字段長(zhǎng)度范數(shù)——被計(jì)算并在索引時(shí)候存儲(chǔ)。這些一起用來(lái)計(jì)算在一個(gè)特定文檔中的單一term的權(quán)值鳄哭。
文檔 vs 字段
當(dāng)我們提到在上面的公式中出現(xiàn)的文檔時(shí)要糊,實(shí)際上我們說(shuō)的是一個(gè)在文檔中的字段。每個(gè)字段擁有自己的倒排索引妆丘,因此對(duì)于TF/IDF锄俄,字段的值是這個(gè)文檔的值。
當(dāng)我們運(yùn)行一個(gè)簡(jiǎn)單的term
查詢(xún)勺拣,并使用explain
來(lái)查看具體的解釋?zhuān)銓⒖吹綄?duì)權(quán)值起到作用的因子是我們上面解釋的那些:
PUT /my_index/doc/1
{ "text" : "quick brown fox" }
GET /my_index/doc/_search?explain
{
"query": {
"term": {
"text": "fox"
}
}
}
上面查詢(xún)獲得的結(jié)果如下:
weight(text:fox in 0) [PerFieldSimilarity]: 0.15342641 --------------1
result of:
fieldWeight in 0 0.15342641
product of:
tf(freq=1.0), with freq of 1: 1.0 --------------2
idf(docFreq=1, maxDocs=1): 0.30685282 --------------3
fieldNorm(doc=0): 0.5 --------------4
1. 在這個(gè)文檔中的此字段的term“fox”的最終的打分奶赠,內(nèi)部Lucene doc ID為0
2. term fox在此文檔中的文本字段出現(xiàn)一次
3. 在這個(gè)索引中的所有文檔的此字段中的`fox`的`IDF`
4. 該字段的字段長(zhǎng)度范數(shù)因子
當(dāng)然查詢(xún)通常包含不止一個(gè)term,因此我們需要一種組合多個(gè)term的權(quán)值的方式药有。為了達(dá)到這個(gè)目的毅戈,我們轉(zhuǎn)向Vector Space Model
向量空間模型
VSM提供給我們一種對(duì)一個(gè)文檔的組合多個(gè)term的查詢(xún)苹丸。輸出一個(gè)表示文檔匹配查詢(xún)的程度的單獨(dú)的分?jǐn)?shù)。為了實(shí)現(xiàn)這個(gè)目的苇经,它將文檔和查詢(xún)表示為向量赘理。
向量就是一維數(shù)組,如:[1,2,5,22,3,8]
扇单。
在向量空間模型中商模,向量中的每個(gè)數(shù)字是一個(gè)term的權(quán)值,使用tf/idf計(jì)算出來(lái)的蜘澜。
盡管
tf/idf
是計(jì)算term權(quán)值的默認(rèn)方式施流,但這并不是唯一的方式。其他的模型諸如Okapi-BM25
也是可以在ES中使用的鄙信。tf/idf因?yàn)楸旧砗?jiǎn)單瞪醋,可以高效地得到高質(zhì)量的搜索結(jié)果,經(jīng)受住了時(shí)間的考驗(yàn)扮碧。
假設(shè)我們有一個(gè)對(duì)“happy hippopotamus”的查詢(xún)趟章。像happy
這樣的尋常word肯定權(quán)值很低,而hippopotamus
權(quán)值很高慎王。假設(shè)happy
的權(quán)值為2而hippopotamus
有權(quán)值5。我們可以畫(huà)出一副二維向量——[2,5]
——從原點(diǎn)(0,0)
出發(fā)到達(dá)(2,5)
的向量宏侍。
現(xiàn)在假設(shè)我們有三個(gè)文檔:
- “I am happy in summer”
- “After Christmas I’m a hippopotamus”
- “The happy hippopotamus helped Harry”
我們可以對(duì)每個(gè)文檔創(chuàng)建一個(gè)相似的向量赖淤,包含了每個(gè)出現(xiàn)在文檔中的查詢(xún)term的權(quán)值——happy
和hippopotamus
,畫(huà)在同一幅圖上:
- “I am happy in summer”
- “After Christmas I’m a hippopotamus”
- “The happy hippopotamus helped Harry”
向量的一個(gè)較好的特性就是他們可以進(jìn)行比較谅河。通過(guò)計(jì)算查詢(xún)向量和文檔向量之間的角度咱旱,得到他們之間的相關(guān)度”了#可以看到文檔1和查詢(xún)之間的角度最大吐限,所以相關(guān)度非常低。文檔2好一些褂始。文檔3就是完全的匹配诸典。
實(shí)踐中,只有2維向量可以畫(huà)在一幅圖上崎苗。幸運(yùn)的是狐粱,線(xiàn)性代數(shù)——數(shù)學(xué)的一個(gè)分支,可以處理向量胆数,提供給我們工具來(lái)比較多維向量之間的角度肌蜻,也就是說(shuō)我們可以使用上面的原理來(lái)進(jìn)行相似的分析,這就可以處理超過(guò)兩個(gè)term的查詢(xún)的相關(guān)性了必尼。
想進(jìn)一步了解參見(jiàn)這里
現(xiàn)在我們已經(jīng)討論了打分的理論知識(shí)蒋搜,下面可以看看在Lucene中如何實(shí)現(xiàn)這個(gè)打分的。