? 在電商搜索環境中,同義詞分成好幾類:
?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的***現次數。
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、/p-1136208118.html
3、 面向檢索信息的同義詞挖掘