1. 倒排求交
這裡涉及好幾個問題:
1. 截斷:例如query是5個詞abcdef,如果只命中f的doc也搜尋出來,那使用者看起來可能會覺得這個結果相關性太差,與自己想要的結果差太遠。所以,需要根據相關性的強弱做個截斷,只保證相關性強的結果。
2. 效能:如果命中abcdef中任何乙個term的網頁都召回,那召回的網頁的數量會非常之大,再對每個網頁計算得分、排序,效能會非常差。
基於上述2個原因,一般底層檢索時都會做倒排求交。即先取出多個倒排拉鍊,再對這多個倒排拉鍊求交集。例如上面的abcdef,先取出命中a的doc(假設有1萬個),再取出命中b的doc(假設也是1萬),那這兩個doc集合的交集,可能只有5000。一般交集的數量會遠小於並集數量。
2. 不可省詞與可省略詞
用多個term去取拉鍊求交不麻煩,難的是選幾個、選哪些term去做倒排求交。選的不好,會導致結果相關性和效能都很差。
例如query=北京的天氣怎麼樣,如果取「的」和「怎麼樣」去做倒排求交,那他們召回的數量會非常之多,計算量巨大,且召回的很多結果都沒有命中「北京」和「天氣」,結果相關性很弱。這個例子中,可以選「北京」和「天氣」去做倒排求交,這2個詞可以稱為不可省詞,「的」和「怎麼樣」是可省略詞。
具體如何選擇不可省詞?
2.1 基於idf
一種最簡單的方法是基於idf排序。
idf,逆文件頻率,描述的是乙個詞在整個庫中是高頻詞還是低頻詞。例如像「的」,「了」這樣的詞,漢語中使用的非常之多,必然會出現得非常多,它的idf就會很低。而像「倒排」這個詞,就有點偏專業小眾了,偏向於低頻詞,idf會比較大。
以「北京的天氣怎麼樣」為例,idf從大到小的排序,可能是:「北京」>「天氣」>"怎麼樣">「的」。再將idf大的選擇幾個做為不可省詞。具體選擇幾個,可以通過一些規則或經驗除錯。
基於idf的方法,優點是簡單易實現,缺點是準確率不太高,badcase較多。
2.2 基於日誌挖掘
使用者的搜尋和點選日誌,可以挖掘出很多有價值的資訊。
例如,兩個不同的query,搜尋結果幾乎一樣。則這2個query中同時出現的詞,就可能是這2個query中最重要的詞。可以理解為,2個不同query中,最重要的詞,都一樣,所以這2個query的結果相似度非常高。
例如使用者搜尋「北京天氣」和「北京天氣怎麼樣」這2個query,結果應該是高度相似的,原因就是2個query的不可省詞都是北京天氣。
另一種情況,2個不同的query,使用者的點選結果一樣。則也可以認為2個query中同時出現的詞是重要的不可省詞。
基於日誌挖掘的方法,準確率還可以,缺點是覆蓋率可能不全,使用者之前從未搜尋過的query,第一次搜尋時,不可省詞無法通過日誌挖掘出來。
2.3 基於模型
除了基於idf和日誌挖掘,也可以做乙個二分類模型,來判斷query中的每個term是否是不可省詞。
不可省詞肯定會有些共性的特徵。模型的方法最核心是特徵的設計和選取。可以想像下,乙個詞是否是不可省詞,有哪些影響的因素?例如這個詞在句子中的位置,詞性,idf,歷史搜尋次數,與前後詞的句法關係,query的句法型別等等。分類器的選擇,svm、rf等等,區別可能不是太大,更主要還是特徵。
模型可以考慮更多的特徵,但是需要人工標註一批訓練樣本,才能訓練出可用的模型。
搜尋引擎(2) 查詢理解 分詞
分詞是搜尋中最基本也是非常重要的乙個功能,正確的分詞是好的搜尋效果的必要條件。1.分詞粒度 分詞中,最主要的問題是分詞粒度問題。例如 射鵰英雄傳 下面的幾種分詞方式,哪一種最正確?最細粒度分詞 射鵰,英雄,傳 正常粒度分詞 射鵰,英雄傳 最粗粒度分詞 射鵰英雄傳 混合粒度分詞 射鵰,射鵰英雄傳,英雄...
搜尋引擎查詢技巧
而這個呢就是我要說的所謂的查詢技巧。介紹幾個有用的引數 intext,intitle,cache,define,filetype,info,inurl,link,site 以下講的都針對google 下面簡單介紹一下上述搜尋引擎查詢引數的意義和用途 除了上述的引數之外呢還有一些操作符也是很有用的,而...
Python抓取搜尋引擎聯想詞
眾所周知python可以用來寫爬蟲抓取資料。而這個例子是我學習寫的第乙個簡單的爬蟲 抓取 360搜尋引擎搜尋時的聯想詞集合。我們在使用搜尋引 擎搜尋東西時,當我們輸入乙個詞之後搜尋框下方會出現一系列聯想詞如圖所示。我們nba。如圖所示 我們將這個url輸入到位址列中網頁返回了聯想詞的集合如圖所示 c...