這篇文章主要介紹了對(duì)JavaScript的全文搜索實(shí)現(xiàn)相關(guān)度評(píng)分的功能的方法,采用了一個(gè)名為Okapi BM25的算法,文中亦有介紹,需要的朋友可以參考下
全文搜索,與機(jī)器學(xué)習(xí)領(lǐng)域其他大多數(shù)問(wèn)題不同,是一個(gè) Web 程序員在日常工作中經(jīng)常遇到的問(wèn)題。客戶可能要求你在某個(gè)地方提供一個(gè)搜索框,然后你會(huì)寫一個(gè)類似 WHERE title LIKE %:query% 的 SQL 語(yǔ)句實(shí)現(xiàn)搜索功能。一開(kāi)始,這是沒(méi)問(wèn)題,直到有一天,客戶找到你跟你說(shuō),“搜索出錯(cuò)啦!”
當(dāng)然,實(shí)際上搜索并沒(méi)有“出錯(cuò)”,只是搜索的結(jié)果并不是客戶想要的。一般的用戶并不清楚如何做精確匹配,所以得到的搜索結(jié)果質(zhì)量很差。為了解決問(wèn)題,你決定使用全文搜索。經(jīng)過(guò)一陣枯燥的學(xué)習(xí),你開(kāi)啟了 MySQL 的 FULLTEXT 索引,并使用了更高級(jí)的查詢語(yǔ)法,如 “MATCH() … AGAINST()” 。
好了,問(wèn)題解決,完結(jié)撒花!數(shù)據(jù)庫(kù)規(guī)模不大的時(shí)候是沒(méi)問(wèn)題了。
但是當(dāng)你的數(shù)據(jù)越來(lái)越多時(shí),你會(huì)發(fā)現(xiàn)你的數(shù)據(jù)庫(kù)也越來(lái)越慢了。MySQL 不是一個(gè)非常好用的全文搜索工具。所以你決定使用 ElasticSearch,重構(gòu)代碼,并部署 Lucene 驅(qū)動(dòng)的全文搜索集群。你會(huì)發(fā)現(xiàn)它工作的非常好,又快又準(zhǔn)確。
這時(shí)你不禁會(huì)想:為什么 Lucene 這么牛逼呢?
本篇文章(主要介紹 TF-IDF,Okapi BM-25 和普通的相關(guān)性評(píng)分 )和 下一篇文章 (主要介紹索引)將為你講述全文搜索背后的基本概念。
相關(guān)性
對(duì)每一個(gè)搜索查詢,我們很容易給每個(gè)文檔定義一個(gè)“相關(guān)分?jǐn)?shù)”。當(dāng)用戶進(jìn)行搜索時(shí),我們可以使用相關(guān)分?jǐn)?shù)進(jìn)行排序而不是使用文檔出現(xiàn)時(shí)間來(lái)進(jìn)行排序。這樣,最相關(guān)的文檔將排在第一個(gè),無(wú)論它是多久之前創(chuàng)建的(當(dāng)然,有的時(shí)候和文檔的創(chuàng)建時(shí)間也是有關(guān)的)。
有很多很多種計(jì)算文字之間相關(guān)性的方法,但是我們要從最簡(jiǎn)單的、基于統(tǒng)計(jì)的方法說(shuō)起。這種方法不需要理解語(yǔ)言本身,而是通過(guò)統(tǒng)計(jì)詞語(yǔ)的使用、匹配和基于文檔中特有詞的普及率的權(quán)重等情況來(lái)決定“相關(guān)分?jǐn)?shù)”。
這個(gè)算法不關(guān)心詞語(yǔ)是名詞還是動(dòng)詞,也不關(guān)心詞語(yǔ)的意義。它唯一關(guān)心的是哪些是常用詞,那些是稀有詞。如果一個(gè)搜索語(yǔ)句中包括常用詞和稀有詞,你最好讓包含稀有詞的文檔的評(píng)分高一些,同時(shí)降低常用詞的權(quán)重。
這個(gè)算法被稱為Okapi BM25。它包含兩個(gè)基本概念 詞語(yǔ)頻率(term frequency) 簡(jiǎn)稱詞頻(“TF”) 和 文檔頻率倒數(shù)(inverse document frequency) 簡(jiǎn)寫為(“IDF”). 把它們放到一起,被稱為 “TF-IDF”,這是一種統(tǒng)計(jì)學(xué)測(cè)度,用來(lái)表示一個(gè)詞語(yǔ) (term) 在文檔中有多重要。
TF-IDF
詞語(yǔ)頻率( Term Frequency), 簡(jiǎn)稱 “TF”, 是一個(gè)很簡(jiǎn)單的度量標(biāo)準(zhǔn):一個(gè)特定的詞語(yǔ)在文檔出現(xiàn)的次數(shù)。你可以把這個(gè)值除以該文檔中詞語(yǔ)的總數(shù),得到一個(gè)分?jǐn)?shù)。例如文檔中有 100 個(gè)詞, ‘the' 這個(gè)詞出現(xiàn)了 8 次,那么 'the' 的 TF 為 8 或 8/100 或 8%(取決于你想怎么表示它)。
逆向文件頻率(Inverse Document Frequency), 簡(jiǎn)稱 “IDF”,要復(fù)雜一些:一個(gè)詞越稀有,這個(gè)值越高。它由總文件數(shù)目除以包含該詞語(yǔ)之文件的數(shù)目,再將得到的商取對(duì)數(shù)得到。越是稀有的詞,越會(huì)產(chǎn)生高的 “IDF”。
如果你將這兩個(gè)數(shù)字乘到一起 (TF*IDF), 你將會(huì)得到一個(gè)詞語(yǔ)在文檔中的權(quán)重。“權(quán)重”的定義是:這個(gè)詞有多稀有并且在文檔中出現(xiàn)的多么頻繁?
你可以將這個(gè)概念用于文檔的搜索查詢。在查詢中的對(duì)于查詢中的每個(gè)關(guān)鍵字,計(jì)算他們的 TF-IDF 分?jǐn)?shù),并把它們相加。得分最高的就是與查詢語(yǔ)句最符合的文檔。
很酷吧!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注