智能聊天功能——生活指南篇

智能聊天功能
生活指南

在生活中,人们往往会遇到各种各样的问题,常常面临着“怎么做”的抉择。尤其是第一次尝试去做某件事情的时候,但因为没有经验而无从下手。大部分人可能会拿出手机搜索答案,或者电话询问有相关经验的人,即浪费时间,又浪费精力。
本系统提供生活指南这一功能,用户无需拿出手机打开APP去搜索,只需要唤醒“依米”,提出问题,它便会搜索答案然后通过语音的形式播放出来,用户只用听,而不需要停下手中的事情便能知道问题的答案。具体实现流程如图所示。
在这里插入图片描述
wikiHow是一个高质量的指导手册类型网站,该网站上包含了56000篇文章,旨在帮助用户学做任何事。类似我们生活指南,你不会做的事在上面总能找到答案。图是wikihow网站的首页。

https://zh.wikihow.com

在这里插入图片描述
从图中不难看出它包含了各个方面的生活指南,并且没有植入任何广告,内容质量相对较高,所以,我将选取这个网站爬取其内容,此功能开发参考了《python爬虫开发,从入门到实践》一书。获取与关键词有关的所有超链的代码如下:

1.	def get_url(keyword):  
2.	    ul=u'https://zh.wikihow.com/wikiHowTo?search='+keyword+''  
3.	    print(ul)  
4.	    res=requests.get(ul)  
5.	    res.encoding='utf-8'  
6.	    r=res.text  
7.	    soup = BeautifulSoup(r,"html.parser")  
8.	    o_urls = re.findall(r'<a href="([a-zA-Z]+://[^\s]*)"',r)  
9.	    print(o_urls[0])  
10.	    return o_urls[0]  

用户提出问题后,通过上述的requests模块获取网页,利用正则表达式获取该网页下的超链,并保存到列表o_urls中。

将网页搜索到的结果写入文件的关键代码如下:

1.	def analyze_url(url):  
2.	    url = url  
3.	    res = requests.get(url)  
4.	    res.encoding='utf8'  
5.	    soup = BeautifulSoup(res.text,"html.parser")  
6.	    print(soup.select('html>head>meta'))  
7.	    f=open("./result/question_result.txt","a+")  
8.	    f.seek(0)  
9.	    f.truncate()  
10.	    a=re.findall('>(.*?)<',str(soup.find('title')))  
11.	    f.write("依米为您找到了"+str(a))  
12.	    fsize= 0  
13.	    for step in soup.find_all(attrs={'class':'step'}):  
14.	        s=step.get_text()  
15.	        pattern=re.compile('[0-9_\u4e00-\u9fa5]+')  
16.	        s=pattern.findall(s)  
17.	        s=str(s)  
18.	        s=s.replace("\n","")              
19.	        f.write(s)            
20.	        print(s)  
21.	        fsize=fsize+len(s.encode('utf-8'))  
22.	        print(fsize)  
23.	        if fsize>5000:  
24.	            break  
25.	    f.close()  

接着再通过requests默认访问列表o_urls中的第一个超链,再利用BeautifulSoup工具解析该网页,结合正则表达式获取有效结果,由于百度语音合成有文件大小限制,我这里设置将结果写入文件的字数不超过5000个字。
用户通过说出关键词“如何”+问题,如“如何煮饭”,系统将识别成功的字符串进行处理后赋给name变量,由于BeautifulSoup只支持python3,而本系统是在python2的环境下运行的,若是通过函数传参会出现不能导入BeautifulSoup的问题,因此,我利用Python语言中os、system、sys.argv模块通过命令行的方式传参,使得在python2的环境下可通过os.system去执行携带参数的python3的文件。该功能关键代码如下:

1.	if "如何" in recognition_result:  
2.	                name=recognition_result.replace('。','')  
3.	                name=recognition_result.replace('?','')  
4.	                name=name.replace('如何','')  
5.	                try:  
6.	                    os.system('python3 wiki.py %s'% name)  
7.	                    weather.tts("./result/question_result.txt")  
8.	                    #print("!!!!!!!!!!!!!!!!!!!!")  
9.	                    os.system('mpg123 ase.mp3')  
10.	                except Exception:  
11.	                    url = baiduAPI.voiceSynthesis("抱歉主人,您问的问题无搜索结果")  
12.	                    voice.playVoice(url)  
13.	                break   

wiki.py的全部代码:

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import re
import sys
import os

def get_url(keyword):
	ul=u'https://zh.wikihow.com/wikiHowTo?search='+keyword+''
	print(ul)
	res=requests.get(ul)
	res.encoding='utf-8'
	r=res.text
	soup = BeautifulSoup(r,"html.parser")
	print(soup.prettify())
	print("_________________________________")
	h=soup.find(attrs={'class':'result_link'})
	a=re.findall('href="(.*?)"',str(h))
	print(a)
	return a[0]

def analyze_url(url):
	url = url
	print(url)
	res = requests.get(url)
	res.encoding='utf8'
	soup = BeautifulSoup(res.text,"html.parser")
	print("_________________________________")
	print(soup.select('html>head>meta'))
	print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
	f=open("./result/question_result.txt","a+")
	f.seek(0)
	f.truncate()
	a=re.findall('>(.*?)<',str(soup.find('title')))
	f.write("依米为您找到了"+str(a))
	fsize= 0
	for step in soup.find_all(attrs={'class':'step'}):
		s=step.get_text()
		pattern=re.compile('[0-9_\u4e00-\u9fa5]+')
		s=pattern.findall(s)
		s=str(s)
		s=s.replace("\n","")			
		f.write(s)			
		print(s)
		fsize=fsize+len(s.encode('utf-8'))
		print(fsize)
		if fsize>5000:
			break
	f.close()

if __name__ == '__main__': 
	keyword=sys.argv[1]
	url=get_url(str(keyword))
	analyze_url(url)

例如我想知道怎么“学习”,只需把wiki.py文件中的keyword=sys.argv[1]改为keyword="学习",然后单独运行它,它就会返回在网站搜索到的答案。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值