智能聊天机器人实现(源码+解析)

来源:互联网 发布:免费cms系统哪个好 编辑:程序博客网 时间:2024/04/27 16:44

ps:本文对我很有帮助感谢原作者 Colin丶

原文连接;http://blog.csdn.net/hitwhylz/article/details/38462417

前言:


之前写了一篇  《美女图片采集器 (源码+解析)》 得到了众多朋友的支持, 发现这样系列的教程还是挺受欢迎的, 也激励我继续写下去。

也在那一篇文章中提过, 美女图片采集只是我先前那个完整APP中的一个功能罢了, 还有其他几个比较好玩的尚未开源, 之后有时间会逐一写篇教程。

今天带来的是智能聊天机器人实现(源码+解析), 和上一篇教程一样, 当你没有女朋友的时候, 可以用它来打发时间。这里的API是图灵机器人提供的, 实现一个十分强大的机器人。

具体功能包括:

• 支持聊天对话、智能问答
• 拥有笑话、天气、公交等丰富功能
• 支持自然语言处理及语义理解
• 数十亿知识库数据,应有尽有


运行效果:


                                   

源码下载:


源码已经传到git上了, 欢迎下载学习。 

下载链接: https://github.com/colin1994/tulingIOS


源码解析:


一。仿微信界面


这个小demo的界面是仿微信的。只不过是简化版的, 包括表情, 语音什么的, 都省略了。

对于界面这一块, 我这里不多做介绍, 因为这并不是本教程主要内容。毕竟, 这个界面到自己实际项目中的时候, 肯定是需要自定义的。

这里简要介绍一下。

该界面分成两部分: 

1. UITableView:显示聊天列表, 其中, 左边的是机器人回答, 右边是自己的提问。

另外, 列表的每个cell, 由头像和文字组成。 这个cell是自定义的, 详细可以自己查看源码。

列表添加:

[objc] view plaincopy
  1. //add UItableView  
  2.     self.tableView=[[UITableView alloc]initWithFrame:CGRectMake(044self.view.frame.size.widthself.view.frame.size.height-88) style:UITableViewStylePlain];  
  3.     [self.tableView registerClass:[ChartCell class] forCellReuseIdentifier:cellIdentifier];  
  4.     self.tableView.separatorStyle=UITableViewCellSeparatorStyleNone;  
  5.     self.tableView.allowsSelection = NO;  
  6.     self.tableView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"chat_bg_default.jpg"]];  
  7.     self.tableView.dataSource=self;  
  8.     self.tableView.delegate=self;  
  9.     [self.view addSubview:self.tableView];  

2. KeyBordVIew:自定义的UIView, 用来显示自定义的键盘视图。

键盘添加:

[objc] view plaincopy
  1. //add keyBorad  
  2. self.keyBordView=[[KeyBordVIew alloc]initWithFrame:CGRectMake(0self.view.frame.size.height-44self.view.frame.size.width44)];  
  3. self.keyBordView.delegate=self;  
  4. [self.view addSubview:self.keyBordView];  


另外, 键盘涉及弹出和收起操作操作, 这个需要在视图载入之前, 注册通知, 响应相关操作。

1.注册通知

[objc] view plaincopy
  1. //注册通知, 键盘收起, 弹出  
  2. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardShow:) name:UIKeyboardWillShowNotification object:nil];  
  3. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardHide:) name:UIKeyboardWillHideNotification object:nil];  

2.响应操作
[objc] view plaincopy
  1. //键盘弹出响应  
  2. -(void)keyboardShow:(NSNotification *)note  
  3. {  
  4.     CGRect keyBoardRect=[note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];  
  5.     CGFloat deltaY=keyBoardRect.size.height;  
  6.       
  7.     [UIView animateWithDuration:[note.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^{  
  8.           
  9.         self.view.transform=CGAffineTransformMakeTranslation(0, -deltaY);  
  10.     }];  
  11. }  
  12.   
  13. //键盘收起响应  
  14. -(void)keyboardHide:(NSNotification *)note  
  15. {  
  16.     [UIView animateWithDuration:[note.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^{  
  17.         self.view.transform = CGAffineTransformIdentity;  
  18.     }];  
  19. }  


二。图灵key获取


用过一些第三方API的都知道, 通常我需要先注册成为它的用户, 才能获取对应的key, 以便调用API。

图灵也不例外, 你需要先注册成为图灵用户, 然后有相关教程, 教你如何获取自己的key, 以及正确的URL。这里就不重复了。图灵机器人官网链接

例如, 我这个demo里面的key是:6c2cfaf7a7f088e843b550b0c5b89c26

对应的API是:http://www.tuling123.com/openapi/api?key=6c2cfaf7a7f088e843b550b0c5b89c26&&info=%@

所以, 你只要把这里的key替换成你自己的就可以了。



三。图灵API的使用


这里使用了第三方网络请求库ASI 和 json格式数据解析库JsonKit

在导入ASI的时候, 如果你的项目是ARC, 那么, 请将对应的文件设置成支持ARC即可。 (-fno-objc-arc)

另外, 要导入一些框架

SystemConfiguration.framework
MobileCoreServices.framework
CFNetwork.framework
libz.dylib


接着就能利用ASI调用图灵API,再利用jsonkit解析返回的数据了。

具体实现如下:

[objc] view plaincopy
  1. //每当编辑完问题后  
  2. //1. 显示自己的问题 messageType=1  
  3. //2. 调用API,返回结果  
  4. -(void)KeyBordView:(KeyBordVIew *)keyBoardView textFiledReturn:(UITextField *)textFiled  
  5. {  
  6.       
  7.     //显示自己的问题  
  8.     ChartCellFrame *cellFrame=[[ChartCellFrame alloc]init];  
  9.     ChartMessage *chartMessage=[[ChartMessage alloc]init];  
  10.       
  11.     chartMessage.icon=@"icon01.png";  
  12.     chartMessage.messageType=1;  
  13.     chartMessage.content=textFiled.text;  
  14.     cellFrame.chartMessage=chartMessage;  
  15.       
  16.     [self.cellFrames addObject:cellFrame];  
  17.     [self.tableView reloadData];  
  18.       
  19.     //滚动到当前行  
  20.     [self tableViewScrollCurrentIndexPath];  
  21.       
  22.     //利用用户问题, 查询结果  
  23.       
  24.     //API请求格式。 具体格式见图灵官网  
  25.     //6c2cfaf7a7f088e843b550b0c5b89c26 替换成你申请的key即可  
  26.     NSString* urlString = [NSString stringWithFormat:@"http://www.tuling123.com/openapi/api?key=6c2cfaf7a7f088e843b550b0c5b89c26&&info=%@", textFiled.text];  
  27.       
  28.     //NSUTF8StringEncoding编码。 避免中文错误  
  29.     urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
  30.     //调用API  
  31.     NSURL *url = [NSURL URLWithString:urlString];  
  32.     testRequest = [ASIHTTPRequest requestWithURL:url];  
  33.     [testRequest setDelegate:self];  
  34.     [testRequest startAsynchronous];  
  35.       
  36.     textFiled.text=@"";  
  37.     myTextField = textFiled;  
  38. }  
  39.   
  40. #pragma mark - 返回机器人回答  
  41. //调用API完毕, 返回图灵回答结果  
  42. //1. 收起键盘  
  43. //2. 显示回答内容  
  44. - (void)requestFinished:(ASIHTTPRequest *)request  
  45. {  
  46.       
  47.     //收起键盘  
  48.     [myTextField resignFirstResponder];  
  49.       
  50.     // 当以文本形式读取返回内容时用这个方法  
  51.     // 解析返回的json数据  
  52.     NSString *responseString = [request responseString];  
  53.     self.testDic = [responseString objectFromJSONString];  
  54.     self.testArr = [testDic objectForKey:@"text"];  
  55.       
  56.       
  57.     //显示回答内容  
  58.     ChartCellFrame *cellFrame=[[ChartCellFrame alloc]init];  
  59.     ChartMessage *chartMessage=[[ChartMessage alloc]init];  
  60.       
  61.     chartMessage.icon=@"icon02.png";  
  62.     chartMessage.messageType=0;  
  63.     chartMessage.content=[NSString stringWithFormat:@"%@"self.testArr];  
  64.     cellFrame.chartMessage=chartMessage;  
  65.       
  66.     [self.cellFrames addObject:cellFrame];  
  67.     [self.tableView reloadData];  
  68.       
  69.     //滚动到当前行  
  70.     [self tableViewScrollCurrentIndexPath];  
  71.       
  72. }  
  73.   
  74. // API请求失败  
  75. - (void)requestFailed:(ASIHTTPRequest *)request  
  76. {  
  77.     NSError *error = [request error];  
  78.     NSLog(@"error --- %@",error);  
  79.       
  80.     UIAlertView *alert_ = [[UIAlertView alloc]initWithTitle:@"提示" message:@"无网络可用,请检查网络状态" delegate:self cancelButtonTitle:@"知道了" otherButtonTitles: nil nil];  
  81.     [alert_ show];  
  82. }  



0 0
原创粉丝点击