美文网首页搜索引擎搜索算法NLP
搜索引擎之同义词、近义词、上位词挖掘

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

作者: 正鸿2k | 来源:发表于2019-03-10 23:42 被阅读3次

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

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

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

    相关文章

      网友评论

        本文标题:搜索引擎之同义词、近义词、上位词挖掘

        本文链接:https://www.haomeiwen.com/subject/ipjakftx.html