Alan Hou的个人博客

基于Pytorch热门深度学习框架 从零开发NLP聊天机器人

核心知识点

基于Pytorch热门深度学习框架 从零开发NLP聊天机器人

参考代码:https://github.com/alanhou/pytorch-chatbot

聊天机器人综合介绍

什么是聊天机器人?

聊天机器人起源发展

聊天机器人的分类

构建最简单的聊天机器人

基于规则的简单聊天机器人 nltk 库

NLP 基础

人机交互,Natural Language Processing,是 AI 重要分支之一

主要范畴

发展历程:

1950年开始

1954年 乔治城自动翻译超过60句俄文成为英文

1960年代 SHRDLU

1980年代引入机器学习

研究难点:

单词的边界界定

词义的消歧

不规范的输入

句法的模糊性

语言行为与计划

NLP 涉及知识

NTTK库

语料及词性标注

语料,即语言材料。

词性标注:给每个词或者词语打词类标签,如形容词、动词、名称等。

中文词性编码:

词性编码词性名称注 解
Ag形语素形容词性语素。形容词代码为 a,语素代码g前面置以A。
a形容词取英语形容词 adjective的第1个字母。
ad副形词直接作状语的形容词。形容词代码 a和副词代码d并在一起。
an名形词具有名词功能的形容词。形容词代码 a和名词代码n并在一起。
b区别词取汉字“别”的声母。
c连词取英语连词 conjunction的第1个字母。
dg副语素副词性语素。副词代码为 d,语素代码g前面置以D。
d副词取 adverb的第2个字母,因其第1个字母已用于形容词。
e叹词取英语叹词 exclamation的第1个字母。
f方位词取汉字“方”
g语素绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母。
h前接成分取英语 head的第1个字母。
i成语取英语成语 idiom的第1个字母。
j简称略语取汉字“简”的声母。
k后接成分
l习用语习用语尚未成为成语,有点“临时性”,取“临”的声母。
m数词取英语 numeral的第3个字母,n,u已有他用。
Ng名语素名词性语素。名词代码为 n,语素代码g前面置以N。
n名词取英语名词 noun的第1个字母。
nr人名名词代码 n和“人(ren)”的声母并在一起。
ns地名名词代码 n和处所词代码s并在一起。
nt机构团体“团”的声母为 t,名词代码n和t并在一起。
nz其他专名“专”的声母的第 1个字母为z,名词代码n和z并在一起。
o拟声词取英语拟声词 onomatopoeia的第1个字母。
p介词取英语介词 prepositional的第1个字母。
q量词取英语 quantity的第1个字母。
r代词取英语代词 pronoun的第2个字母,因p已用于介词。
s处所词取英语 space的第1个字母。
tg时语素时间词性语素。时间词代码为 t,在语素的代码g前面置以T。
t时间词取英语 time的第1个字母。
u助词取英语助词 auxiliary
vg动语素动词性语素。动词代码为 v。在语素的代码g前面置以V。
v动词取英语动词 verb的第一个字母。
vd副动词直接作状语的动词。动词和副词的代码并在一起。
vn名动词指具有名词功能的动词。动词和名词的代码并在一起。
w标点符号
x非语素字非语素字只是一个符号,字母 x通常用于代表未知数、符号。
y语气词取汉字“语”的声母。
z状态词取汉字“状”的声母的前一个字母。
un未知词不可识别词及用户自定义词组。取英文Unkonwn首两个字母。(非北大标准,CSW分词中定义)

词性标注的分类

词性标注的方法: NLTK、Jieba

分词

把句子分成词

分词难点:

分词的算法:

Jieba 分词:https://github.com/fxsjy/jieba

注:jieba 从0.4版本开始支持paddle 模式,但这里有个坑,正常安装如果使用Python 3.8及以上版本会报Could not find a version that satisfies the requirement paddlepaddle-tiny。很多人会说只支持 Python 3.7,事实上Python 3.8也可通过直接安装 paddlepaddle来使用:

TF-IDF

TF: Term frequency,衡量一个 term 在文档中出现得多频繁

$$TF(t)={(t出现在文档中的次数) \over (文档中的term总数)} $$

IDF: Inverse document frequency,衡量一个 term 有多重要

$$IDF(t) = log_e{(文档总数/含有t的文档总数)}$$

TF-IDF = TF * IDF

TF-IDF的作用:提取文本向量的特征

https://scikit-learn.org/stable/

NLP 文本处理

文本处理的方法

示例教程:https://radimrehurek.com/gensim/auto_examples/tutorials/run_word2vec.html#sphx-glr-auto-examples-tutorials-run-word2vec-py

检索类机器人

提问->检索->答案抽取

关键技术-检索匹配

关键技术-计算相似度

关键技术-分类

贝叶斯分类

什么是分类:分类就是构造一个分类器,把用户提供的数据项映射到给定类别集中的某一个类

先验概率与后验概率

$$p(A|B)={p(B|A)p(A)\over p(B)}$$

其中 p(A)是先验概率,p(B|A)为条件概率也称为似然

朴素贝叶斯:加上条件独立假设的贝叶斯方法就是朴素贝叶斯方法(Natve Bayes)

多项式模型、伯努利模型、混合模型

朴素贝叶斯的实际应用:垃圾邮件分析、文本情感分析、拼写纠错

朴素贝叶斯工程中的技巧:取对数、转换为权重、选择 topk 的关键词、分割样本、位置权重

Chatterbot

Chatterbot 是一个基于机器学习的聊天机器人引擎,构建在 Python 上,主要特点是可以自己从已有的对话中进行学习。

https://chatterbot.readthedocs.io/en/stable/

训练类 通过列表数据进行训练

训练类 使用语料库数据进行训练

训练类 指定语料范围

训练类 使用 Twitter API进行训练

生成式机器人

生成类聊天机器人

RNN LSTM语言模型

语言模型:

Language Model,最常用的 N-Gram

语言模型简单来说就是一串词序列的概率分布

语言模型的计算:

$$P(w_1,w_2,…w_T) = \prod_{t=1}^TP(w_t|w_1,…,w_{t-1})$$

语言模型的应用

语言模型的方法

RNN 存在的问题:梯度消失、梯度爆炸

RNN的结构:one to one, one to many, many to one, many to many

LSTM缓解梯度消失、缓解梯度爆炸,核心思想-细胞状态流动

$$f_t = \sigma(W_f\cdot[h_{t-1},x_t] + b_f)$$

$$i_t = \sigma(W_i\cdot[h_{t-1},x_t] + b_i)$$

$$\tilde{C}_t = \sigma(W_C\cdot[h_{t-1},x_t] + b_C)$$

$$C_t = f_t*C_{t-1}+i_t*\tilde{C}_t$$

$$o_t = \sigma(W_o[h_{t-1},x_t] + b_o)$$

$$h_t = o_t*\tanh(C_t)$$

Seq2Seq

最早应用于机器翻译

逐字翻译->基于统计学的机器翻译->循环网络和编码->解码和翻译

应用场景:

训练过程

不足:长度限制、压缩损失信息

Attention

关注序列中的一些内容

应用:机器翻译、语音识别、图像描述

分类

Pytorch 基础

Pytorch入门

使用 Lua的torch的基础上

特点:

安装使用

https://github.com/pytorch/pytorch

原理机制

数据载入

Dataset(torch.utils.data.Dataset)

DataLoader(torch.utils.data.DataLoader)

Dataloaderlter(torch.utils.data.dataloader.Dataloaderlter)

https://github.com/pytorch/vision/tree/master/torchvision/datasets

训练模型

验证测试

验证:模型置于验证模式(model.eval()),验证完成后还需要将其置回为训练模式(model.train())

测试:测试时需要自己加载模型和数据

聊天机器人发展方向

基于 Pytorch 聊天机器人代码实战

 

 

退出移动版