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

今天带来的是智能聊天机器人实现(源码+解析), 和上一篇教程一样, 当你没有女朋友的时候, 可以用它来打发时间。这里的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(0, 44, self.view.frame.size.width, self.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(0, self.view.frame.size.height-44, self.view.frame.size.width, 44)];  
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。这里就不重复了。

三、图灵API的使用
这里使用了第三方网络请求库ASI 和 json格式数据解析库 JsonKit。
在导入ASI的时候, 如果你的项目是ARC, 那么, 请将对应的文件设置成支持ARC即可。 (-fno-objc-arc)
另外, 要导入一些框架
SystemConfiguration.framework
MobileCoreServices.framework
CFNetwork.framework
libz.dylib


接着就能利用ASI调用图灵API,再利用jsonkit解析返回的数据了。
具体实现如下:
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.	} 

猜你喜欢

转载自turing-gn.iteye.com/blog/2377519