社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Elasticsearch

当Elasticsearch遇见智能客服机器人

IT大咖说 • 8 年前 • 1259 次点击  


摘要

本次分享主要会介绍一下ES是如何帮我们完成NLP的任务的。在做NLP相关任务的时候,ES的相似度算法并不足以支撑用户的搜索,需要使用一些与语义相关的方法进行改进。但是ES的很多特性对我们优化搜索体验是非常有帮助的。

内容来源:2017年6月10日,趋势科技个人消费者部机器学习工程师杨文俊在“Elastic Meetup 南京”进行《Elasticsearch辅助的智能客服机器人》演讲分享。IT 大咖说作为独家视频合作方,经主办方和讲者审阅授权发布。

阅读字数:1605 | 4分钟阅读

嘉宾演讲视频回放:t.cn/RQAEw96

简介-Dr.cleaner/Dr.X系列产品

我们主要服务的项目是MAC上的APP——Dr.cleaner以及Dr.X系列产品。

Dr.cleaner在多个国家、地区的清理类MAC APP中排名第一,日活接近百万。

幸福的烦恼:客服

多语言、跨时区:我们的APP在国内可能还不是非常出名,它的目前的客户基本都在海外,其中美国是主要客户,同时也有其它国家跟地区的用户。

数量跟不上:随着用户数的急剧增加,客服的数量跟不上用户数的增长。

解决方案:客服机器人

客服机器人首要能解决产品相关的问题,其次要能解决MAC/IOS相关的技术问题,多语言的问题需要通过翻译API翻译成英语再尝试给出解决方案。

知识库的构成

任何智能客服如果没有足够的知识库支撑,即使它的算法再强大也不行。所以我们把很多MAC相关的网站抓下来塞进我们的数据库中。

各种爬虫

StackExcangeApple分论坛(公开数据源)、Apple Discussion、Mac world、WikiHow…

文档搜索

当用户问题出现的时候,我们如何从文档知识库中找出我们需要的东西?我们之前尝试过直接使用ES,但是距离语义还是太远了,效果并不好。



WMD也有明显缺点,它的算法复杂度非常高,计算速度很慢。WMD不是银弹,即使WMD之后也可能会得到一些不太好的结果。


我们的知识库会先经过ES过滤一层。原始的知识库大概是几十万级别,如果直接用WMD计算的话速度会非常慢。ES在一定程度上保证了它的字面差得不会那么离谱,当字面比较相近的时候它还是能匹配出一些东西。



ES具体操作


这个是最原始的mapping,我们基于这个mapping一步步去做优化。

优化:BM25 or TFIDF

采用BM25之后,当一个词的出现频率越高,到一定的阈值之后,它的影响是非常小的。

我们做了一个实验,修改了mapping,分别使用BM25 or TFIDF。从知识库中随机选取100个问题和10个回答,让ES进行查询,然后对比两边的结果。


我们一共进行了10轮,每轮会有100个回答。如上图可见,两个算法的重复度大概是91%。

根据实验得出,BM25的作用还是比较明显的,最终我们采用了BM25去做相似度的算法。


优化:拼写检查与纠错


我们的方案:Term Suggester + Custom Analyzer


使用Term Suggester

支持直接输入一句话:How to replace macbookk SSD?


Term Suggester自身调整

设定最小出现次数为3,修改了”string_distance”,把它改为”jarowinkler”。它默认的相似度是基于编辑距离的一些定制化,编辑距离默认会输出整数。


改进方法

增加用户行为数据的支撑。Google的算法很大一部分就是有用户行为数据支撑。

“瞻前顾后”,从我们的角度来说,要考虑前后两个词的关系。

优化:输入标准化


解决方案

首先使用Gensim生成备选词组,然后使用规则过滤出比较精确的候选词组。当我们获得一个正确的词组后,可以根据候选词组生成常见的错误写法。最后再实时处理用户输入和批量处理ES存储的知识库。

规则

规则就是纯英文字符,去掉数字。主要是品牌名和版本号。

POS Tagging + 词性过滤


WHY?

WMD的计算强度比较大,如果我们在输入词中能把一些不重要的词去掉,就可以降低WMD的计算强度。

在我们的一些知识库中,它的表达方式不一样。但重要的词换一个表达方式,能够提高准确率。

解决方案

当前我们的解决方案用Python NLTK进行分析过滤,输出每个词的词性,ES存储结果。

我们更为推荐的是使用ES分析、过滤、存储一条龙解决方案,但是这种解决方案需要自己写一个ES的Pos插件。

推荐方案的优点

性能:Java实现的东西一般来说要比纯Python的快,特别是在比较消耗CPU资源的时候。

简单:逻辑不需要在ES和Python两边同时维护。

节省空间:NLTK的模型文件也比较大,多个Docker镜像就意味着占用多个内存、磁盘。


优化:同义词

基于Word2vec的同义词

人为地定义同义词很难,我们是基于Word2vec生成“同义词”。


查询改写方案

我们的同义词方案是通过同义词进行查询改写。


其它一些优化

LTR:Learning to Rank

基于Machine Learning的重排序,模型按照预测的点击概率进行重新排序。



我今天的分享就到这里,谢谢大家!



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/g3tPzigOWQ
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/5248