这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记。
本篇笔记总结了先有的一些搜索引擎项目中的相关搜索模块的实现方式,以及自己实验后的效果,并介绍了本项目中采用的实现方案以及后续改进方向。
明确功能:
- 输入:用户输入的搜索文本query
- 输出:相关搜索的推荐query(短语或者句子)
先有实现方案调研(不全面)
luence suggest api
- lucene的提示功能需要针对suggest的内容建立suggest索引,根据实际业务定义建立索引的数据来源,索引顺序,索引权重等(如一个用于搜索商品数据的搜索引擎就可以根据商品名字段建立suggest索引)。
- 是给一个词 然后在这个词后面补上词(需要对索引里面每一个word指定小批量补全词语)
- 需要预先对每一个word生成一个补全词的list
词向量匹配
Word2Vec
- 直接计算每个搜索词的词向量,然后计算各个词向量之间的相似性,就可以算出每个词应该推荐的词了。
- 最好是需要利用自己的数据库来训练模型吗 这样推荐词在数据库中才有对应的索引与文档 ?? 用扩展词表训练word2vec模型,根据实体词表分别得到实体词对应的最相似扩展词
对数据库构建词向量
-
然后query生成词向量去匹配
-
存在速度问题
字节跳动---字节跳动上市:
- 通过同义句是得不到的 是扩充 而且还要根据前面的语义进行扩充-------遍历字节跳动关键词的query库
构建平行语料
- 对每一个索引word 读取它的文本list前10个doc 对doc分词 并存储其对应的query(分词得到list 确定关键词位置 并加上前后一个关键词组成query????)
- 用户输入query----提取关键词---查找对应query
同义句生成
-
eda(其实就是同义词替换、插入、交换和删除) 论文《Easy data augmentation techniques for boosting performance on text classification tasks》
-
中文实现的demo,github项目zhanlaoban/eda_nlp_for_Chinese,地址:github.com/zhanlaoban/…
-
word2vec、词典同义词替换
-
不同于1中使用synonyms工具查找同义词,可以使用gensim的词向量,找出某个词最相似的词作为同意词。
-
还可以使用同义词典机械查找,词典可用fighting41love/funNLP,
github地址:github.com/fighting41l…
多次翻译
query扩展/同义词扩展 startWith库
关联图
- 如果文本语料数据够多,可以对关键词建图,关键词可以看作图节点,在多篇文章里都共同出现过的高频词之间可以连一条边,从而构建出一个关联图(老师提示的实现方案)
纯工程实现方案
-
用户输入query-----搜索逻辑得到query的doc_id_list
-
读取list的前10个doc_id 并对这10个doc进行文档解析
- 对query解析得到关键词
- IDF算法(word对应文档数 总文档数 可读取word_temp表)
- 或者NLP模型推理
- 对query解析得到关键词
-
关键词和其后一个位置的分词拼接 组成new_query(会存在很多语义错误)
- 返回10个new_query的list