目录
NLP概述
NLP=NLU+NLG
NLU:语言/文本➡️语义(理解基础上所作的一些任务,如翻译)
NLG:语义➡️文本/语言(基于理解的情况做一些深层次的任务,如高阶多轮对话)
困难点
多种表达方式
贪心科技开设了NLP训练营
贪心科技新出了NLP训练营
新出的NLP训练营是贪心科技出的
一词多义
苹果
今天参观了苹果公司
现在正好是苹果收获季节
对于人来说,由于一句话有上下文,所以就知道一个词该翻译成什么。对于机器来说,一个词被翻译成不同含义的概率也是不同的,这就看算法的选择。
多模态
图片中识别文字
应用场景
问答系统
语料库(每一轮的对话)➡️知识库(语料的正确回答)
知识库训练好以后,新的问题进来就可以通过知识库获取答案
知识库是通过了专家的检验,目的是增加可信度
情感分析
股票价格预测、舆情控制、产品评论、事件监测
流程
输入语句➡️特征工程➡️模型➡️情感值
输入语句➡️深度学习模型➡️情感值
特征工程约等于表示学习,在进入模型之前,人工的通过一些规律、规则、处理转化成更好的表达问题本质的特征的过程
比如一段话(影评)中,提取出形容词来分析情感,又或是将这句话中单词的长度,是否出现演员的名字、电影类别、账号注册时间这些丢入模型中训练而不是把整个句子丢入模型,这样工程量是不一样的
人工智能的目的就是减少人为干预,但作为计算机学生不是用,而是设计,所以我们要干预的越多越好
机器翻译
复杂的句子在不同翻译软件上翻译出来的结果是不一样的
自动摘要
通过大文本去提取重点
信息抽取
非结构化的一个结构中提取结构化的东西。比如一个邮件中,抽取其中内容中的事件、日期、开始时间、结束时间、地点
对话系统
测试多轮对话效果,上下文对话效果
Pipeline(流程)
原始文本➡️分词➡️清洗➡️标准化➡️特征提取➡️建模
原始文本:网页文本、新闻、报告
清洗:无用标签、特殊符号、停用词
标准化:Stemming(词干化)、Lemmatization
特征提取:tf-idf、word2vec
建模:相似度算法、分类算法
词干化:比如卡死了,卡顿,卡得要死,动不了都是表示性能问题,词干化就是说既然它表示的都是同一个东西,就把它统一成一样的
文本预处理
分词
中文分词:jieba,lac
英文分词:nltk
最大匹配分词算法:
前向最大匹配和后向最大匹配
例子:他说的确实在理
词典:他 说 的 的确 确实 在理 实在 理
前向最大匹配:他 说 的确 实在 理
后向最大匹配:他 说 的 确实 在理
共同缺点:没有考虑一整句话的含义
基于语言模型的分词
输入➡️生成所有可能的分割➡️选择其中最好的
例子:他说的确实在理
词典:他 说 的 的确 确实 在理 实在 理
每个词出现的概率都是相同的,而选择其中最好的就是一个概率问题
条件概率模型(贝叶斯全概率公式)
-
P(H|D)=P(D|H)*P(H)
H:假设,D:观测
例如:湿度D,下不下雨H,P(H|D)表示在D下H发生的概率
例子详见 07NLP文本表示[上] 55:40-1:04:10 -
s=w1,w2,…,wk
s表示句子,w表示词
P(s)=P(w1)P(w2|w1)…P(wk|w1,w2,…wk-1)
在第一个例子中相当于考虑的是两个词的情况下,如果是一段话第二个例子(不止两个词)中,我们还需要考虑第三个词,也就是在w1,w2存在的情况下w3的概率,相当于是P(w3|w1,w2),以此类推
当句子较长时,这样就会造成语言模型过大,且末尾的概率多半都是0,反而没有区分度,由此衍生两大模型
unigram model(考虑一个单词)
P(s)=P(w1)P(w2)…P(wk)
bigram model(考虑两个单词)
P(s)=P(w1)P(w2|w1)…P(wk|wk-1)
拼写纠错
例如:用户输入therr,候选单词有there、their和thesis,编辑距离是指把一个单词修改成另一个单词需要修改的最小步骤,therr改成there,their的编辑距离为1,改成thesis的编辑距离为3
用户输入➡️从词典中寻找编辑距离最小的候选➡️返回
用户输入➡️生成编辑距离为1,2的字符串➡️过滤➡️返回
停用词过滤
类似于特征筛选的过程,通常把停用词,出现频率很低的词汇过滤掉,也就是将没有表示意义的单词给去除,省的其占用空间
词的标准化
缩略词和方言
例如:the US➡️USA
U.S.A➡️USA
文本表示
词袋模型
one-hot(独热编码)
一般词典有多大词袋模型就有多大,比如一共有7个单词,那每个单词都可以用长度为7的编码来表示,单词在哪个位置上,哪个位置的热度就为1
在不考虑上下文的含义下使用词袋模型好,因为其比较纯粹和干净
表示单词
表示句子(boolean)
没有考虑词频
表示句子(count)
考虑了词频
并不是出现的越多就越重要
并不是出现的越少就越不重要
所以就诞生的Tf-idf表示
Tf-idf表示
逆向文档词频
d代表文档,w代表词,i表示反
例子
代码演示
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
import numpy as np
文本只需要分好词后做成一行一行的字符串,然后中间使用空格隔开
sen1 = '不好 大失所望'
sen2 = '真好 圆梦 了'
sen3 = '电影 特效 炸裂'
sen4 = '还是 那么 搞笑'
sen5 = '演员 阵容 太强 了'
sen6 = '我 太 喜欢 卡魔拉 了'
sen7 = '3D 效果 特效 拉满'
sen_list = [sen1, sen2, sen3,sen4 ,sen5,sen6,sen7]
tf_idf_vectorizer = TfidfVectorizer(max_features=15, use_idf=True) #设计tfidf的参数
tfidf = tf_idf_vectorizer.fit_transform(sen_list) #将sen_list送入进行训练,建立模型
print('tfidf shape: ', tfidf.shape, type(tfidf))
tfidf_test_metrics = tf_idf_vectorizer.transform(sen_list) #真正的实验数据
tfidf_test_metrics = tfidf_test_metrics.toarray() #转换成np数组
tfidf_test_metrics = np.reshape(tfidf_test_metrics, [-1,1,15]) #做成三维的,7个句子,每个句子用1个向量表示,1个向量包含15个单词(15个维度)
print('tfidf_test_metrics shape: ', tfidf_test_metrics.shape, type(tfidf_test_metrics))
结果:
tfidf shape: (7, 15) <class ‘scipy.sparse._csr.csr_matrix’>
tfidf_test_metrics shape: (7, 1, 15) <class ‘numpy.ndarray’>
tfidf shape表示7个句子,每个句子采用15个单词去表示
聚类任务
from sklearn.cluster import KMeans
from matplotlib import pyplot as plt
new_kmeas_input = np.reshape(tfidf_test_metrics.copy(), (-1, 15)) #把三维转换成二维因为KMeans只能接收二维数据
print(new_kmeas_input.shape)
(7, 15)
用手肘法来确定分多少种合适
SSE是误差平方和
SSE = [] # 存放每次结果的误差平方和
for i in range(2, 6): #尝试要聚成的类数
estimator = KMeans(n_clusters=i) # 构造聚类器
estimator.fit(new_kmeas_input) #对输入数据new_kmeas_input进行聚类
SSE.append(estimator.inertia_) #保存误差
X = range(2, 6) #跟k值要一样
plt.xlabel('i')
plt.ylabel('SSE')
plt.plot(X, SSE, 'o-')
plt.show() #画出图
model_kmeans = KMeans(n_clusters=4) #分4类
# 模型拟合
# model_kmeans.fit(y_evi)
model_kmeans.fit(new_kmeas_input)
# print(type(y_lable))
cluster_rev_lable = model_kmeans.labels_ #保存聚类的标签
print(cluster_rev_lable)
[2 0 1 3 2 0 1]
for label_idx in range(4): #总的分成4类
for idx, label in enumerate(cluster_rev_lable): #内层的for循环遍历每个数据点的聚类标签
if label == label_idx:
print('句子: {} ||| 这是第 {} 类'.format(sen_list[idx], label))
print('-----------------------')
文本相似度计算
相似度计算=距离计算
分类:余弦相似度、欧式距离、Minkowski距离(闵可夫斯基距离)
其中,余弦比较注重语义上的相似度,欧式比较注重空间上的相似度
独热编码不能表达单词之间的相似度,因为one-hot只能表示自己,所以用分布式来表示
词向量
word2vec(从词到向量)
把每个单词都划分为不同时刻
模型
CBOW
用两边的词去预测中间词
skip-gram
用中心词去预测两边的词
通常在低概率时加log,因为log(a*b)=loga+logb
数学公式(理念体现在数学上)
判断两个词之间的距离
a和b分别代指两个不同单词(邻近的),分子相当于eab,相当于阉割版的余弦相似度(两个向量点乘),也就是ab点乘越大,这两个词相似度越大,分母v’wj’表示,远离当前单词的所有单词,分母比作ecb,cb点乘越小越好
分子使得该目标单词考虑范围内的单词关系越来越紧密
分母使得该目标单词考虑范围外的单词,有多远滚多远
同理的一个商品购物推荐例子,基于word2vec但是有一个创新点
Li是中心商品,在其周围有m个相邻的商品,最后一个Lb是购买的商品
公式
只看第一项和最后一项,最后一项是创新点,这是一个目标函数,要使其最大,则要让分母次方项再去掉负号的情况下要越大越好,其中v’c是中间那个商品,v’l是其邻近的m个商品,v’lb是购买的商品
句子向量
将句子以向量的形式表示