这一篇文章与我们的NLP理论知识无关,甚至都没有用得上什么NLP方面的高深算法知识,但是这却是市场上各种助手类工具的一个简化版.基本的逻辑和基本的功能都相仿,这一篇文章我希望能够结合这个小例子,梳理下现在的”人工智障”
现如今市场上的巨头早已经模块化和平台化.我们普通的设计人员只需要想好自己的使用需求乖乖交钱调用就好.一个很典型的就是:
打开他们的开发文档来看,
DuerOS开放平台 | 资源中心 dueros.baidu.com
很多层面是真的”人工智能”,因为很多就是我们人工给定的…
而我们真正的自然语言处理的技术,更多地是用在了如何提升语音识别率这上边,距离智能客服真正理解你还是任重道远.
现在我们来用简单的python代码来实现一个简单的人工小机器人,其主要的功能有以下几个:
1:陪你聊天
2:训练聊天
3:时间查询
4:日历查询
5:单词查询
6:天气查询
问题来了,要做一个”人工智障”我们首先得知道会用到哪些学到的知识点:
- 字典:存储机器人的相关对话内容,让机器人有相关的“记忆”
- 循环(嵌套循环):一直去响应我们对应的问题
- 判断: 执行流程操作
这些都是python3中的最简单的基本操作.话不多说,直接上代码:
1:聊天部分
这一个部分因为没有使用到数据库,所训练的问题在一次之后再运行就没有了,相比之下大公司因为有足够的数据量和计算量,可以对语言助手收集的内容进行学习处理,因此效果提升的很明显.我们可以简单的把dict看成是一个数据库,训练小助手可以看做向助手的数据库里增加问题.
import time
import calendar
import baidu_translate
import weather
dict = {
"你好":"你好",
"很高兴见到您" : "我也很能高兴见到你",
"你喜欢吃什么水果 " : "我喜欢橘子",
"你今年多大了" : "18岁了",
"你很漂亮" : "谢谢",
"现在的时间": time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()),
"这个月的阳历" : calendar.month(2018,3),
}
flag = ('A')
work = True
print('你好,我是你的人工智障小助手\n')
print('让我们一起聊聊天吧\n')
while flag == 'A' or 'B':
flag = input("A:陪我聊天,B:训练我聊天,C:给我翻译,D:天气,E:结束\n")
if flag == "B":
question = input("请输入你想问的\n")
answer = input("请输入问题的答案\n")
dict[str(question)] = str(answer)
print("学习成功\n")
print("现在我已经学会了%d个问题\n"%len(dict))
continue
elif flag =="A":
if len(dict) == 0:
print("现在我还不会回答任何问题,请让我先学习:\n")
continue
chat_world = input('谢谢你跟我聊天,你想对我说点什么?\n')
for key in sorted(dict.keys()):
if str(chat_world) == key:
work = True
print(dict[key])
break
else:
work = False
if work ==False:
print("sorry,这个问题我回答不上来\n")
work = True
elif flag == 'E':
print("好的,我们下次再聊\n")
break
else:
continue
elif flag == 'C':
baidu_translate.translate(input("请输入你想翻译的语句!\n"))
elif flag == 'D':
weather.weather_tool()
2:翻译工具
这个翻译爬虫是我之前在弄百度翻译爬虫的时候写的,现在正好用的到,就跟我们通常用一些语言助手,我们说一个自己不认识的英语单词,告诉小助手,助手其实也是将这个单词提交给其单词查询的接口,接口给小助手回复后,小助手在回复给你.
from urllib import request, parse
import json
def translate(content):
url = "http://fanyi.baidu.com/sug"
data = parse.urlencode({"kw": content}) # 将参数进行转码
headers = {
'User-Agent': 'Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10'
}
req = request.Request(url, data=bytes(data, encoding="utf-8"), headers=headers)
r = request.urlopen(req)
# print(r.code) 查看返回的状态码
html = r.read().decode('utf-8')
# json格式化
html = json.loads(html)
# print(html)
for k in html["data"]:
print(k["k"], k["v"])
3:天气模块
天气模块因为我没有购买天气提供商的API,所以这里就只提供了简单的模拟登陆的信息爬取,具体的有兴趣的可以进行细化:
这里最关键的是101010100,代表北京
其他的城市的代码可以参照网上的资料
import requests
def weather_tool():
r = requests.get('http://www.weather.com.cn/data/sk/101010100.html')
r.encoding = 'utf-8'
print (r.json()['weatherinfo']['city'],"风向:", r.json()['weatherinfo']['WD'],"温度:", r.json()['weatherinfo']['temp'],)
总结:
在用户不熟悉的场景下,咱们的”人工智障小助手”面对稍微专业一点的服务,就会遇到知识图谱的问题。简单来讲,”人工智障小助手”要做推荐的前提是对推荐的内容得先有了解。好比,要向一位不懂酒的用户推荐一款威士忌,那就不能依赖这位用户自己提出的问题(很可能提不出要求),而得依赖“懂行”的自己对威士忌的理解的方方面面来引导用户做合适他的选择。一个助理显然无法拥有所有服务所需的知识图谱。
从知识图谱的结构来看,是相对可被结构化。一个服务可以以各种方式被拆解成很多个方面,但大量的方面在当前是没有结构化数据的(比如我们没有每家餐厅的“营业面积”的数据);甚至很多方面无法用结构化数据来表达(比如每家餐厅有否“适合浪漫约会”的环境)。
因此,就算有了强大的NLP,还需要全面的知识图谱(结构化数据)和处理并传递非结构化数据的能力——而这两点,在目前是无解的。
而在这个路上,我们还需要走更远