作者:阿里云用户啊里新人
需求:基本实现智能聊天!
最近在开发一款机器人,希望实现基本的聊天功能,词库是有的,但是如果是做完全匹配这个出来的效果很悲催,
比如词库:你好,回答是:哈哈,很好啊.
如果问:你好?,这时候词库没有就无法回答。
一直在考虑怎么实现,当看到阿里的opensearch之后就感觉:这个就是我想要的
之前没有研究过,只听过搜索引擎,所以我是这块的小白。感觉很高大上,什么分词啊,匹配啊。。。专业名词我就不用了因为我不专业哈哈
按照惯例依然附上一张 实现效果图:
准备工作
1 既然是公测自然的要申请公测资格这个就不多说了。现在申请还是比较容易的。
2 然后就是去看看他的帮助文档了。opensearch的帮助文档相对其他产品的帮助文档要详细很多。包括快速入门,详细说明,相信小白跟着文档就可以慢慢弄明白。
3 既然是java sdk 体验那么肯定就是下载 java sdk了。很简单在下载中心直接下载就可以了。(下载中心在控制台,这个貌似和别的公测产品不一样)
这里就不贴好多图了。建议去看一下文档非常详细的。
开始体验
既然是要应用到我的应用,当然要在本地测试一下,
opensearch是对外网的,所以来说不止针对阿里云的用户可以使用,只要你有搜索的需求都可以使用
首先当然是新建一个项目,当然你也可以直接在你的项目中直接测试。
然后将sdk导入项目。
(以上感觉都是都废话哈啊哈)
在做下步之前最好吧这个文档看一下 点击这里
我们会用到的几个类文件就在这里了,
其中包括几个主要操作,
创建应用,设置应用
以上两个操作建议在控制台直接修改,这样更直观,包括设置主键,多表。搜索项等等。这里参考 官方文档吧。我没有使用sdk常见应用。(用最短的时间实现功能才是我的需求)
上传数据,更新数据
应用创建完毕肯定要上传数据的,这里阿里提供了一个很好的地方就是根据你设置的数据可是生成几个模板,你可以下载,然后看一下应该组装为什么样子的。
我的数据格式很简单
搜索体验,简单就好!
只有一张主表,三个字段,id主键,wen:问话,用来搜索。 da:回答,用来回答的内容,不会建立索引。
- //看到实例化的方法有好几个,但是别的不知道怎么实现
- //这里实例化的时候我使用的是这个方法,因为的是阿里云的账号,从控制台获取 key secret就可以了。剩下两个一个我填空,一个是固定值
- CloudsearchClient cc = new CloudsearchClient(key, secret, null, KeyTypeEnum.ALIYUN);
- CloudsearchDoc cd=new CloudsearchDoc("test",cc);//这里两个参数一个是应用名,一个是客户端
- Map fields=new HashMap<String, Object>();
- fields.put("id", "1");
- fields.put("wen", "你好么");
- fields.put("da", "哈哈,很好");
- //以上是按照自己的数据结构添加
- cd.add(fields);//添加一条数据
- //这里需要说的是,可以添加多条,然后一起提交
- cd.push("main");//发送数据
上传文档其实很简单,我使用了最简单的实现。
我上传了词库8000多条。
搜索
然后就是搜索的实现了
- //看到实例化的方法有好几个,但是别的不知道怎么实现
- //这里实例化的时候我使用的是这个方法,因为的是阿里云的账号,从控制台获取 key secret就可以了。剩下两个一个我填空,一个是固定值
- CloudsearchClient cc = new CloudsearchClient(key, secret, null, KeyTypeEnum.ALIYUN);
- String resultJson = "";
- String resultDa = "";
- try {
- CloudsearchSearch search = new CloudsearchSearch(cc);
- List<String> indexList = new ArrayList<String>();
- indexList.add("duihua");// 这里是简历应用的名字
- search.addIndex(indexList);//将应用索引加入,这里是可以加入多个的
- search.setQueryString("default:‘你吃饭了么?‘");//搜索制定的次
- search.setFormat("json");//返回格式,我还是比较喜欢json
- resultJson = search.search();
- } catch (MalformedURLException e1) {
- e1.printStackTrace();
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- System.out.println(resultJson);
只有以上这几行就实现了搜索功能功能。
这就基本实现了我的功能是不是好简单。几行代码实现了一个高大上的搜索引擎,以前是想都不敢想的。
体验总结
当然也是有些问题,就是目前搜索的召回是全匹配,感觉不太好,一下是图
这里第三个搜索竟然是没有结果的,这这这!!怎么可以,这个问题在论坛已经提问了 连接 ,官方回答是马上就会上这个功能,表示很期待。
弄到这里,难道我的聊天计划要泡汤了!!?》??怎么可以!!
认真了的查看了一下文档,在群里询问了大拿,搜索语法支持或操作,default:‘你吃饭‘|‘了么‘ 这种实现就可以实现或的召回!
那么问题来了!! 这个分词怎么搞!!阿里云没有专门的分词接口啊!!!只能去去搜!!
免费的分词api,百度第一条就是,很幸福的去测试了。可以用大家需要也可以试试
http://5.tbip.sinaapp.com/api.php?str=%E6%98%8E%E5%A4%A9%E6%98%9F%E6%9C%9F%E5%A4%A9&type=str
这个是在sae上部署的。(后来很悲催的发现,竟然有频率限制,稍微快一些就609.。。我去) 只好放弃。
继续寻找百般努力之下终于又找到一个
http://www.xunsearch.com/scws/api.php
经过测试,这个可以用。。
然后就是集成到我的机器人了
效果你们也看到了机器人的集成就不贴了哈哈。反正是现在实现了功能。
另外在体验的过程中,感觉有个地方很是高大上,需要一定的基础才能搞定,那就是排序的算法问题,
opensearch支持复杂的算法,实现你不同的排序需求,
目前这块还没有搞定,感觉需要一个慢慢的了解过程,不过目前的默认模式已经基本满足我的需求。
建议&意见
1,关于非全部匹配的召回,希望可以尽快上线。
2,是否可以开放分词接口,
3,排序算法上是否可以有更多的文档给予一定的讲解,很多人这方面还是比较弱的
4,文档的管理不知道是否可以做一个展示,比如我有8000调数据,是否可以有个地方让我看到都添加了什么数据。
5,opensearch 应该是支持外部网站使用的,但是在文档上没有体现,我在实例化的时候就出现了一些问题,建议这块做一些说明。
原文地址:http://bbs.aliyun.com/read/179921.html
参加活动:http://promotion.aliyun.com/act/aliyun/freebeta/