NLP入门:做一个简单的"人工智障"

这一篇文章与我们的NLP理论知识无关,甚至都没有用得上什么NLP方面的高深算法知识,但是这却是市场上各种助手类工具的一个简化版.基本的逻辑和基本的功能都相仿,这一篇文章我希望能够结合这个小例子,梳理下现在的”人工智障”

现如今市场上的巨头早已经模块化和平台化.我们普通的设计人员只需要想好自己的使用需求乖乖交钱调用就好.一个很典型的就是:

《NLP入门:做一个简单的
《NLP入门:做一个简单的

打开他们的开发文档来看,

DuerOS开放平台 | 资源中心dueros.baidu.com《NLP入门:做一个简单的

很多层面是真的”人工智能”,因为很多就是我们人工给定的…

《NLP入门:做一个简单的
《NLP入门:做一个简单的

而我们真正的自然语言处理的技术,更多地是用在了如何提升语音识别率这上边,距离智能客服真正理解你还是任重道远.

现在我们来用简单的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,还需要全面的知识图谱(结构化数据)和处理并传递非结构化数据的能力——而这两点,在目前是无解的。

而在这个路上,我们还需要走更远

    原文作者:云时之间
    原文地址: https://zhuanlan.zhihu.com/p/34659626
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞