自然语言处理实战笔记——2.简单的聊天机器人

实战练习——简单的聊天机器人

  • 计算机眼中的语言
  • 一个简单的聊天机器人
  • 拓展
    • 另一种方法

计算机眼中的语言

要让计算机学会语言处理,最关键的是明白计算机怎么理解咱们的语言,计算机眼中只有0101的语言,比如我输入"Lil ghost",计算机会觉得这是0101 0010 0000(当然应该是对应字符的ASCII码,我随便写了一串,其实是小鬼生日的BCD码),计算机自然会根据输入的01位串和之前存入计算机的01位串对比,一个一个比较,其实我们已经构建了一个FSM(有限状态自动机)

自然语言处理实战笔记——2.简单的聊天机器人_第1张图片

其实正则表达式也是一种FSM(关于正则表达式学习可以参考我另一篇博客,这篇博客还没写hhh),这也提供了一种NLP的一种方法——基于模式,在聊天机器人中,其实我们就是构建基于人类语言的正则语法,让计算机识别问题后能够做出相应的回应

我们不能让计算机仅仅能识别常量,否则它连Hi和Hello都会认为这是两个意思,回想正则表达式,我们用元字符代替了一系列字符,其实就是增加变体的一种方式

一个简单的聊天机器人

现代的聊天机器人可以通过文本学习自动构建语言体系,我们这里仅仅使用基于模式的方法,即构建正则表达式

  1. 打声招呼——基础问候语
import re  # 导入正则表达式的包

# 定义模式串
r = '(hi|hello|hey)([ ]*)([a-z]*)'
s = "Hey!What'up!This is AKA happy virus Lil ghost."
try:
    # 这里只能输出Hey,因为匹配串中没有设置!
    m = re.match(r, s, re.I)
    # 返回结果是一个对象,若匹配成功,使用group函数以
    # 字符串形式输出
    # 若匹配失败,返回None,引发异常
    print(m.group())
    print("你好,我的小鬼")

except:
    print("输错了就见不到小鬼")

2.更复杂的正则表达式

import re

r = r"[^a-z]*(yo|Hello|hey|(Good[ ])?(morn[gin']{0,3}|afternoon|even[ing']{0,3}))"\
    r"[\s,:!]([a-z]{1,20})"

greeting = re.compile(r, flags=re.I)
a = greeting.match('Hello!Rosa')
b = greeting.match("Good morning,Lil ghost")
print(a.group())
print(b.group())

原来英文中说个good morning有这么多方法。。。我还以为是我不知道的元字符。。。

就有人会问了,构造聊天机器人难道需要我们把每个可能的情况都那样列出来吗?(其实我列上边那个就看了好久好久)要是这样的话真的是“人工“智能,所以后续我们会加入通过机器学习实现文本识别

拓展

  • 经典心智计算理论:假定NLP可以通过一系列处理的有限逻辑规则集来完成

另一种方法

基于模式匹配的NLP方法缺点显而易见,那如何通过统计或机器学习构建聊天机器人呢?

  1. 输入一个ghost,如何让计算机知道这是ghost呢?前面提到过计算机会进行二进制的逐位匹配,看来如果我们建立一个足够大的匹配表,单词和二进制位串一一匹配,计算机就能知道我们要说明的单词
  2. 我们用百度搜索或者搜狗输入法时,一旦有轻微的输入错误,计算机会弹出可能的纠错结果,这种实现基于两个词之间的联系,比如我们按照位串数目构建两个词的联系,那计算机就会认为bad和bar是接近的意思,我们必须根据单词的意义构建两个单词之间的距离,使计算机实现纠错功能
  3. 我们先介绍如何实现词频统计,输入一个文档后,计算机通过分词将文档划分为一个个位向量,然后根据已有的单词词库,将单词一个个放入对应单词的词库中,最终计算机会输出一个分量为各个单词出现次数的向量。如图所示
    自然语言处理实战笔记——2.简单的聊天机器人_第2张图片
  4. 以上是我们构建的第一个向量空间,之后我们会根据不同的语言处理需求构造不同的向量空间和词模型

你可能感兴趣的:(自然语言处理,人工智能,正则表达式,python,机器学习,自然语言处理)