在搜索引擎中,我们会碰到大量的同义词需求。用户在描述同一个东西的时候,会有各种各样的描述。
在电商搜索环境中,同义词分成好几类:
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、https://www.docin.com/p-1136208118.html
3、面向检索信息的同义词挖掘