智能聊天功能
生活指南
在生活中,人们往往会遇到各种各样的问题,常常面临着“怎么做”的抉择。尤其是第一次尝试去做某件事情的时候,但因为没有经验而无从下手。大部分人可能会拿出手机搜索答案,或者电话询问有相关经验的人,即浪费时间,又浪费精力。
本系统提供生活指南这一功能,用户无需拿出手机打开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="学习"
,然后单独运行它,它就会返回在网站搜索到的答案。