搜索引擎算法之同义词、近义词、上位词挖掘

在搜索引擎中,我们会碰到大量的同义词需求。用户在描述同一个东西的时候,会有各种各样的描述。

      在电商搜索环境中,同义词分成好几类:

     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、面向检索信息的同义词挖掘

你可能感兴趣的:(搜索引擎,搜索算法)