在搜索引擎中,我們會碰到大量的同義詞需求。用戶在描述同一個東西的時候,會有各種各樣的描述。
在電商搜索環境中,同義詞分成好幾類:
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(上下文)。如“周董的新歌”可以修改爲“周杰倫的新歌”,但是“周董的公司”就未必是周杰倫的公司了。
參考文獻:
2、https://www.docin.com/p-1136208118.html