『壹』 基於谷歌距離的語義相似度為多少時可確定兩者為同義詞
詞語的語義相似度計算主要有兩種方法 :
一類是通過語義詞典,把有關詞語的概念組織在一個樹形的結構中來計算;
另一類主要是通過詞語上下文的信息,運用統計的方法進行求解。
1. 語義相似度
Dekang Lin認為任何兩個詞語的相似度取決於它們的共性(Commonality)和個性(Differences),然後從資訊理論的角度給出了定義公式:
其中,分子表示描述A,B共性所需要的信息量;分母表示完整地描述A,B所需要的信息量。
其中,Sl,S2表示兩個義原,S表示離它們最近的共同祖先,p(s)是該結點的子結點個數(包括自己)與樹中的所有結點個數的比值。
劉群、李素建以基於實例的機器翻譯為背景,認為語義相似度就是兩個詞語在不同的上下文中可以互相替換使用而不改變文本的句法語義結構的程度。兩個詞語,如果在不同的上下文中可以互相替換且不改變文本的句法語義結構的可能性越大,二者的相似度就越高,否則相似度就越低。
對於兩個詞語W1,W2,如果記其相似度為Sim(W1,W2) ,其詞語距離為Dis(W1,W2),根據劉群、李素建的公式:
其中a是一個可調節的參數。n的含義是:當相似度為0.5時的詞語距離值。
詞語距離和詞語相似度是一對詞語的相同關系特徵的不同表現形式,如果兩個概念之間的語義距離越近,就認為它們越相似,因此二者之問可以給出一個簡單對應關系:
其中,Dis(Wl,W2)為樹中W1,W2所代表的結點在樹中的距離,k為比例系數。
一般地說,相似度一般被定義為一個0到1之間的實數。特別地,當兩個詞語完全一樣時,它們的相似度為1;當兩個詞語是完全不同的概念時,它們的相似度接近於0
2. 語義相似度的計算方法
詞語距離有兩類常見的計算方法,一種是根據某種世界知識(Ontology)或分類體系(Taxonomy)來計算,一種利用大規模的語料庫進行統計。
2.1 根據分類體系計算詞語語義距離的方法
該方法又稱基於樹的語義相似度研究方法,基於樹的語義相似度計算的演算法大體上分為兩種:一是基於距離的語義相似性測度;二是基於信息內容的語義相似性測度。一般是利用一部語義詞典(如Wordnet,Hownet),語義詞典都是將所有的片語織在一棵或幾棵樹狀的層次結構中。在一棵樹狀圖中,任何兩個結點之間有且只有一條路徑。於是,這條路徑的長度就可以作為這兩個詞語概念間語義距離的一種度量;而且隨著概念所處結點越深,其所包含的語義信息越豐富,越能准確地決定概念的性質,它們對語義相似度起著決定作用。
2.1.1 基於樹狀層次計算語義相似度的基本思想
例如,在圖1(取自Wordnet本體中的一小部分)中,boy和girl之間的最短路徑是boy—male—person—female—girl,最小路徑長度為4。而teacher和boy之間的最小路徑長度為6。因此,girl比teacher在語義上更接近於boy。該測度演算法在基於Wordnet的語義網中獲得了較好的計算結果。
2.1.2 基於《知網Hownet》的語義相似度計算
由於《知網Hownet》中詞語不是組織在一個樹狀的層次體系中,而是一種網狀結構;同時藉助義原和符號對概念進行描述。對於兩個漢語詞語Wl和W2,如果W1有個n義項(概念):Sll,S12,…,S1n,W2有個m義項(概念):S21,S22,…,S2m,劉群、李素建認為W1和W2的相似度是各個概念的相似度之最大值,也就是說:
為了更加精確地計算出詞語的語義相似度,在《知網》中對一個實詞的描述可以表示為一個特徵結構,該特徵結構含有以下四個特徵:
*第一基本義原描述:其值為一個基本義原,將兩個概念的這一部分的相似度記為Siml(Sl,S2);
*其它基本義原描述:對應於語義表達式中除第一基本義原描述式以外的所有基本義原描述式,其值為一個基本義原的集合,將兩個概念的這一部分的相似度記為Sim2(S1,S2);
*關系義原描述:對應於語義表達式中所有的關系義原描述式,其值是一個特徵結構,對於該特徵結構的每一個特徵,其屬性是一個關系義原,其值是一個基本義原,或一個具體詞。將兩個概念的這一部分的相似度記為Sim3(S1,S2);
*關系符號描述:對應於語義表達式中所有的關系符號描述式,其值也是一個特徵結構,對於該特徵結構的每一個特徵,其屬性是一個關系義原,其值是一個集合,該集合的元素是一個基本義原,或一個具體詞。將兩個概念的這一部分的相似度記為Sim4(S1,S2)。
通過以上分析,可知在實際的《知網》結構中,由於各個義原所處的層次不一樣,因而它們對詞語相似度的影響程度也不一樣,也就是說部分相似性在整體相似性中所佔的權重是不一樣的,權重(百分比)用β表示,於是,在知網中,概念的整體相似度可以記為:
其中,β(1≤i≤4)是可調節的參數,且有:β1+β2+β3+β4=1,β1≥β2≥P3≥β4。後者反映了Siml(Sl,S2)到Sim4(Sl,S2)對於總體相似度所起到的作用依次遞減。由於第一獨立義原描述式反映了一個概念最主要的特徵,所以應該將其權值定義得比較大,一般應在0.5以上。在以上計算中,最後求加權平均時,各部分取相等的權值。這樣,就把兩個詞語之間的相似度問題歸結到了兩個概念之間的相似度問題。
2.2 利用大規模的語料庫進行統計
基於語料庫的詞語相似度研究大都採用了上下文語境的統計描述方法,即認同這樣一個論斷:詞語的上下文可以為詞語定義提供足夠信息。詞語向量空間模型是目前基於統計的詞語相似度計算策略使用比較廣泛的一種,演算法復雜度也能夠實現的模型。該模型事先選擇一組特徵詞,然後計算這一組特徵詞與每一個詞的相關性(一般用這組詞在實際的大規模語料中以該詞在上下文中出現的頻率來度量),於是對於每一個詞都可以得到一個相關性的特徵詞向量,然後利用這些向量之間的相似度作為這兩個詞的相似度。
由計算機自然語言處理專家RudiL.Cilibrasi和Paul M.B.Vitanyi[2007.12]提出的語義相似度計算方法,該方法理論基礎涉及資訊理論、壓縮原理、柯爾莫哥洛夫復雜性、語義WEB、語義學等,基本思想是把Intemet作為一個大型的語料庫,以Google(對其它的搜索引擎如網路同樣適用)作為搜索引擎,搜索返回的結果數作為計算的數值依據,其計算公式如下:
其中,NGD(Normalized Google Distance,介於0與1之間)表示標准谷歌距離(以此衡量語義相似性大小),f(x),f(y)分別表示含概念x,y的網頁數,f(x,y)表示同時含有概念的網頁數,N表示Google引用的互聯網上的網頁總數。
可以以一次實驗來說明,假設用Google搜索詞語'horse'返回46700000(記為f(x))條結果,搜索詞語'rider'返回結果數為12200ooo(記為f(y)),搜索同時含'horse,rider'的網頁數是2630ooo(記為f(x,y)),Google共引用的網頁數是N=8058044651,代入上述公式求得:
NGD(horse,rider)≈0.443
3. 兩類主要語義相似度計算方法的比較
『貳』 else演算法是什麼意思
Else演算法是一種用於解決二分查找、二叉樹搜索等問題的演算法。跟其他演算法不同的是,Else演算法的核心在於對於不符合特定條件的情況進行處理。它的特點在於,當一個條件不滿足時,它並不會直接停止執行,而是會利用其他條件繼續運行下去,直到找到正確的結果為止。因此,Else演算法在處理一些較為復雜的問題時,非常有用。
Else演算法廣泛應用在計算機科學的各個領域,比如圖像處理、人工智慧、計算機視覺等。在自然語言處理中,Else演算法被用來處理不確定的語言構成,比如當需要找到某個單詞時,如果沒有找到,便會利用上下文、同義詞等條件來進行判斷和推測。在圖像識別中,Else演算法便可利用像素點特徵等條件來完成對物體實體的識別。
Else演算法的優勢在於它的多功能性、實用性和適應性。它可以在不同的領域被靈活應用,具有較好的適應性。然而,Else演算法也存在一些潛在的劣勢,比如由於它是基於條件分支的,那麼對於復雜的問題,它的時間復雜度會呈指數級增長,效率不高。同時,當需要遍歷的數據量過大時,Else演算法的空間復雜度也會增加,帶來較大的執行成本。
『叄』 有贊搜索引擎實踐(演算法篇)
註:轉自於 有贊
在上篇文章(工程篇)中, 我們介紹了有贊搜索引擎的基本框架. 搜索引擎主要3個部件構成. 第一, hadoop集群, 用於生成大規模搜索和實時索引; 第二, ElasticSearch集群, 提供分布式搜索方案; 第三, 高級搜索集群, 用於提供商業搜索的特殊功能.
商業電商搜索由於搜索的特殊性, 獨立的ElasticSearch集群是無法滿足多樣的演算法需求的, 我們在搜索的各個部件上都有相應的演算法插件, 用於構建商業電商搜索引擎的演算法體系.
創建索引過程從原始數據創建倒排索引的過程. 這個過程中我們對商品(doc)進行分析, 計算商品靜態分, 並對商品進行相似度計算. 商品的靜態分對於提升搜索引擎質量起到至關重要的作用, 相當於網頁搜索的pagerank, 想像一下如果沒有pagerank演算法, 網頁搜索的質量會有多麼差. 在電商搜索中, 最常見的問題是相似商品太多, 必須在建立索引過程中就對商品間的相似度進行預計算, 以便在檢索過程中進行有效去重.
創建索引的過程如下.
step 1. 計算每個doc的靜態分
step 2. 計算兩兩doc的相似度
step 3. 根據相似度和其他信息對數據進行分庫
step 4. 建立ES索引
檢索過程是搜索引擎接收用戶的query進行一系列處理並返回相關結果的過程. 商業搜索引擎在檢索過程中需要考慮2個因素: 1) 相關性 2) 重要性.
相關性是指返回結果和輸入query是否相關, 這是搜索引擎基本問題之一, 目前常用的演算法有BM25和空間向量模型. 這個兩個演算法ElasticSearch都支持, 一般商業搜索引擎都用BM25演算法. BM25演算法會計算每個doc和query的相關性分, 我們使用Dscore表示.
重要性是指商品被信賴的程度, 我們應該吧最被消費之信賴的商品返回給消費者, 而不是讓消費之自己鑒別. 尤其是在商品充分競爭的電商搜索, 我們必須賦予商品合理的重要性分數, 才能保證搜索結果的優質. 重要性分, 又叫做靜態分, 使用Tscore表示.
搜索引擎最終的排序依據是:
Score = Dscore * Tscore
即綜合考慮靜態分和動態分, 給用戶相關且重要的商品.
檢索的過程大致抽象為如下幾個步驟.
step 1. 對原始query進行query分析
step 2. 在as中根據query分析結果進行query重寫
step 3. 在as中使用重寫後的query檢索es
step 4. 在es查詢過程中根據靜態分和動態分綜合排序
step 5. 在as中吧es返回的結果進行重排
step 6. 返回結果
下面幾章闡述幾個重點技術.
在電商搜索引擎裡面商品的靜態分是有網頁搜索裡面的pagerank同等的價值和重要性, 他們都是doc固有的和查詢query無關的價值度量. pagerank通過doc之間的投票關系進行運算, 相對而言商品的靜態分的因素會更多一些. 商品靜態計算過程和pagerank一樣需要解決如下2個問題: 1. 穩定性. pagerank可以保證一個網站不會因為簡單鏈接堆砌可以線性提升網站的排名. 同樣, 商品靜態分的計算不可以讓商品可以通過增加單一指標線性增加分值(比如刷單對搜索引擎的質量的影響).
2. 區分度. 在保證穩定性的基礎上商品靜態分要有足夠的區分度可以保證同樣搜索的條件下, 排在前面的商品的質量比排在後面的商品的質量高.
我們假設商品的靜態分有3個決定性因素, 1.下單數, 2. 好評率 3. 發貨速度
靜態分我們使用Tsocre表示, Tscore可以寫成如下形式:
Tscore = a * f(下單數) + b * g(好評率) + c * h(發貨速度)
a,b,c是權重參數, 用於平衡各個指標的影響程度. f,g,h是代表函數用於把原始的指標轉化成合理的度量.
首先, 我們需要尋找合理的代表函數.
z-score 標准化方法
這種方法非常不穩定, 假設一個奇異點是第二大的值的1000倍, 會讓大部分的值都集中在0~0.01, 同樣失去了歸一化的目的.
(圖三: log-zscore歸一化)
最後, 選擇合適的權重 經過log-zscore歸一化以後, 我們基本上吧f,g,h的表示的代表函數說明清楚. Tscore = a f(下單數) + b g(好評率) + c*h(發貨速度), 下一步就是確定a,b,c的參數. 一般有兩個方法:
a) 專家法. 根據我們的日常經驗動態調整權重參數;
b) 實驗法. 首先在專家的幫助下賦一個初始值, 然後改變單一變數的方法根據abtest的結果來動態調整參數.
商品標題去重在電商搜索中起到重要作用, 根據數據, 用戶通過搜索頁購買商品80%選擇搜索的前4頁. 商品標題的重復會導致重要的頁面沒有含金量, 極大降低了搜索的購買率.
舉個例子:
Title1:美味/香蕉/包郵/廣東/高州/香蕉/banana//無/催熟劑/
Title2:美味/香蕉/廣東/高州/香蕉//非/粉蕉/包郵/
首先, 進行特徵向量化
這里用到 "bag of word" 技術, 將詞彙表作為空間向量的維度, 標題的每個term的詞頻作為這個feature的值. 以這個例子來說. 這個詞彙的維度為: 美味(0), 香蕉(1), 包郵(2), 廣東(3), 高州(4), banana(5),無(6), 催熟劑(7),非(8),粉蕉(9) 位置: 0,1,2,3,4,5,6,7,8,9
Title1: 1,2,1,1,1,1,1,1,0,0
Title2: 1,2,1,1,1,0,0,0,1,1
這個每個title都用一個固定長度的向量表示.
再次, 計算兩兩相似度
相似度一般是通過計算兩個向量的距離實現的, 不失一般性, 在這里我們使用1-cosine(x,y)來表示兩個向量的距離. 這是一個"All Pair Similarity"的問題, 即需要兩兩比較, 復雜度在O(n^2). 在商品量巨大的時候單機很難處理. 我們給出兩種方法用於實現"All Pair Similarity".
方法一: spark的矩陣運算.
方法二: map-rece 線性方法. 這個方法參考論文"Pairwise Document Similarity in Large Collections with MapRece". 可以實現幾乎線性的時間復雜度. 相對於矩陣運算在大規模(10億以上)pair similarity 運算上面有優勢. 這個方法簡單的描述如下: 首先, 按照倒排索引的計算方式計算每個term到doc的映射. 比如3個doc:
轉化為倒排格式, 這個需要一次mapper rece
然後, 對於value只有一個元素的過濾掉, 對於value大於2個doc的兩兩組合:
最後, 對於輸出進行聚合,value為重復次數和兩個doc乘積開根號的比.
對於2個title1, title2, 如果X(title1, title2) > 0.7 則認為title1和title2相似, 對於相似的兩個doc, 靜態分大的定義為主doc, 靜態分小的定義為輔doc. 主doc和輔doc分別建庫.
區別於網頁搜索(網頁搜索直接將輔doc刪除), 我們將主doc和輔doc分別建庫. 每一次搜索按比例分別搜主庫和輔庫, 並將結果融合返回. 這樣可以保證結果的多樣性.
店鋪去重和商品標題去重有點不同. 由於電商特定場景的需要, 不希望搜索結果一家獨大, 這樣會引發強烈的馬太效應. 店鋪去重不能使用如上的方法進行. 因為上面的方法的主要依據是文本相似, 在結果都相關的前提下, 進行適當的取捨. 但是店鋪去重不是這樣的特性.
設想一下, 如果我們根據店鋪是否相同, 把同一店鋪的商品分到主庫和從庫中, 如下圖所示.
A和B代表不同的店鋪.
在搜索香蕉的時候, 的確可以控制A店鋪結果的數量, 但是在搜索"梨"的時候就錯誤的吧B店鋪的梨排在前面了(假設A:梨比B:梨靜態分高).
搜索的過程每個桶平均分攤搜索任務的25%, 並根據靜態分合並成一頁的結果. 這樣同一保證結果的相對順序, 又達到了店鋪去重的目的.
如上圖所示, 搜索"香蕉", 雖然A店鋪有10個滿足需求的結果, 但是每頁搜索醉倒只有5個結果可以展示.
上面介紹了幾個建立索引過程中幾項技術, 檢索過程中的關鍵技術有很多. 其中最著名的是query分析技術. 我們使用的query分析技術主要包括核心詞識別, 同義詞拓展, 品牌詞識別等等. query分析技術大部分都是NLP研究范圍, 本文就不詳細闡述很多理論知識. 我們重點介紹同義詞拓展技術. 這個技術一般都需要根據自己的商品和和用戶日誌特定訓練, 無法像分詞技術和品牌詞識別一樣有標準的庫可以適用.
同義詞拓展一般是通過分析用戶session日誌獲取. 如果一個用戶輸入"蘋果手機"沒有得到想要的結果, 他接著輸入"iphone", 我們在"蘋果手機"和"iphone"之間創建一個轉移關系. 基於統計, 我們可以把用戶query創建一個相互聯系的權重圖.
用戶輸入query "蘋果手機", 根據query分析, "蘋果手機"有 "iphone" 0.8, "iphone 6" 0.5 兩個同義詞. 0.8和0.5分別表示同義的程度. 我們想要"蘋果手機", "iphone", "iphone 6" 3個query同時輸入, 並且按照同義的程度對不同的query賦予不同的權重. ElasticSearch提供的BoostingQuery可以支持這個需求. 參考: https://www.elastic.co/guide/en/elasticsearch/guide/current/ boosting query_clauses.html
原始query:
改寫後的Query
其他比如核心詞識別, 歧義詞糾正等方法差不多, 本文不做詳細闡述.
商業電商搜索演算法另外兩個重要技術, 一個是類目體系建立和應用,另一個是個性化技術. 這個兩項技術我們還處在探索階段. 類目體系我們主要使用機器學習的方法進行訓練, 個性化主要通過用戶畫像進行Query改寫來實現. 等我們上線有效果在與大家分享.
搜索演算法是一個非常值得一個電商產品持續投入的技術. 一方面我們技術人員要有良好的技術背景, 可以借鑒很多成熟的技術, 避免重復造輪子; 另一方面, 每個產品的搜索都有自身的特點, 需要深入研究產品的特性給出合理的解決方案. 本文給出的案例都具有代表性, 靈活的運用搜索的各方面的技術. 另外, 商業搜索非常看重投入產出比, 我們也需要在眾多方案中尋找捷徑. 比如我們在做類目體系時候, 沒有投入大量的人力資源用於標注數據, 而是通過爬蟲爬取其他電商的數據進行參考, 從而節省了80%的人力資源. 由於筆者能力有限, 文中的方案不保證是問題的最優解, 如果有指正, 請聯系筆者( [email protected] ).