搜索引擎算法之同義詞、近義詞、上位詞挖掘

在搜索引擎中,我們會碰到大量的同義詞需求。用戶在描述同一個東西的時候,會有各種各樣的描述。

      在電商搜索環境中,同義詞分成好幾類:

     1. 品牌同義詞:nokia=諾基亞,Adidas=阿迪達斯

     2. 產品同義詞:投影儀≈投影機,電話≈cell phone; automobile 和car。

     3.舊詞和新詞:自行車  -> 腳踏車

     4.南方用詞和北方用詞:番茄-> 西紅柿。

     5.傳統的同義詞:儲物櫃和收納櫃。

     6.錯別字同義詞:瑜伽和瑜珈(錯誤寫爲斜王旁)

       對應英文來說,還有詞幹提取,如單複數、動詞原形和ing形式;英文還有一個特殊的現象,例如兩個單詞可以分開寫,也可以合併在一起,例如keychain和key chian(鑰匙鏈),boyfriend 和boy friend。

       近義詞就比較多了: 包括size 大碼≈大號;短褲和熱褲;邊疆和邊疆。

      上位詞:蘋果手機上位詞 是手機。

       反義詞:寬鬆和修身。當我們做query改寫的時候,改寫千萬不能改寫出反義詞。

 

       如果我們仔細觀察,我們會發現有的詞可以互相替換,有些詞是隻能單向替換(換一個方向就不對了,例如周杰倫可以替換爲周董,但是周董只能在一定情況下替換爲周董)。

如何挖掘得到同義詞呢?

        我們可以從用戶搜索詞、商品標題、搜索和點擊來獲取。最根本的來源還是商家對商品標題的優化,聰明的商家會把同義詞堆疊在標題中,以期望獲取到更多的流量。

        從點擊日誌上看,如果w1和w2是同義詞,那麼搜索w1和搜索w2,理論上會有大量的共同點擊的商品x1、x2、x3等等。

         標題商品標題得到大量的語料,例如投影儀和投影機,拉桿箱(draw bar box)和旅行箱(luggage)。

 

       通過統計或者word2vec訓練詞的相關性,找到高相關度的詞。統計這些詞在標題中共同出現次數,即w1和w2的共現次數。

以下代碼查看word2vec的效果


fromgensim.test.utilsimportcommon_texts,get_tmpfile

fromgensim.modelsimportWord2Vec

model_path="./data/word2vec_en_50d.model"

model=Word2Vec.load(model_path)

model.wv['computer']

Out[6]:

array([-0.48867282, -0.10507897, -0.23138586, -0.10871041,  0.1514824 ,

      -0.01487145, -0.385491  ,  0.01792672, -0.32512784, -0.9063424 ,

      -0.5428677 ,  0.6565156 ,  0.02183418,  0.07939139,  0.03485253,

        0.319492  , -0.27633888,  0.52685845, -0.0582791 , -0.4844649 ,

        0.249212  ,  0.8144138 , -0.03233343, -0.36086813,  0.34835583,

      -0.07177112,  0.0828275 ,  0.6612073 ,  0.74526566, -0.12676844,

      -0.08891173, -0.08520225, -0.04619604,  0.13580324,  0.183159  ,

        0.15528682,  0.01727525, -0.43599448, -0.2579532 , -0.23192754,

      -0.32965428,  0.09547858,  0.00419413, -0.06285212,  0.18150753,

      -0.21699691,  0.60977536, -0.06555454,  0.35746607, -0.06610812],

      dtype=float32)

In[13]:

model.wv.similarity('case','cover')    # case 和cover在描述手機殼的時候基本是同義詞

Out[13]:

0.8538678

In[22]:

defget_top_sim(word):

similary_words=model.wv.most_similar(word,topn=10)

forw,sinsimilary_words:

print(word,"=",w,s)

get_top_sim('case')

case = holder 0.8879926800727844

case = clamshell 0.887456476688385

case = tablet 0.8748524188995361

case = storage 0.8703626990318298

case = carrying 0.8672872185707092

case = hardcase 0.8580055236816406

case = carring 0.8558304309844971

case = seal 0.8552369475364685

case = cover 0.8538679480552673

case = stand 0.8476276993751526

 

        通過word2vec,我們可以找出原始詞和最相似的10個單詞,然後我們統計origin 和substitute(原始詞和替代詞)在標題中的共現次數,通過這種挖掘,我們找到大量的候選詞對,這種詞通過人工review可以作爲同義詞的候選。

       對這種情況稍微做一些擴展,我們就能得到同義query到同義query之間的對應關係。


        統計分析上位詞,統計每個商品類目下的產品詞,出現次數top n的產品詞w,對應到商品的類目詞c,那麼w -> c很可能 就是一個上位詞關係。

人工詞表

       在維護詞表的時候,我們一定不能忘記人工詞表。人工詞表的維護必須要有後臺工具。

我們如何應用人工詞表:

        1、在商品標題對應的索引詞中做同義詞擴展,當不用不管用同義詞的哪一個來搜索的時候都可以搜索到。

        2、在QueryProcess模塊中,對詞做同義詞擴展、做近義詞改寫,改寫出來的近義詞的權重要比原始詞的權重更小。在改寫中,我們還會遇到一個問題,Q(分詞爲w1,w2,w3)改寫成q1(w1,w2)和q2(w2,w3)的時候,我們會遇到q1和q2分別和Q如何計算相關性的問題。

         3、當query 做同義詞改寫的時候,需要一些詞做context(上下文)。如“周董的新歌”可以修改爲“周杰倫的新歌”,但是“周董的公司”就未必是周杰倫的公司了。

 

參考文獻:

1、搜索引擎同義詞反饋機制【百度搜索研發部】

2、https://www.docin.com/p-1136208118.html

3、面向檢索信息的同義詞挖掘

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章