NLP-文本表示学习-独热编码与TF-IDF

NLP概述

NLP=NLU+NLG
NLU:语言/文本➡️语义(理解基础上所作的一些任务,如翻译)
NLG:语义➡️文本/语言(基于理解的情况做一些深层次的任务,如高阶多轮对话)

困难点

多种表达方式

贪心科技开设了NLP训练营
贪心科技新出了NLP训练营
新出的NLP训练营是贪心科技出的

一词多义

苹果
今天参观了苹果公司
现在正好是苹果收获季节

对于人来说,由于一句话有上下文,所以就知道一个词该翻译成什么。对于机器来说,一个词被翻译成不同含义的概率也是不同的,这就看算法的选择。

多模态

图片中识别文字

应用场景

问答系统

语料库(每一轮的对话)➡️知识库(语料的正确回答)
知识库训练好以后,新的问题进来就可以通过知识库获取答案

知识库是通过了专家的检验,目的是增加可信度

情感分析

股票价格预测、舆情控制、产品评论、事件监测

流程
输入语句➡️特征工程➡️模型➡️情感值
输入语句➡️深度学习模型➡️情感值
特征工程约等于表示学习,在进入模型之前,人工的通过一些规律、规则、处理转化成更好的表达问题本质的特征的过程
比如一段话(影评)中,提取出形容词来分析情感,又或是将这句话中单词的长度,是否出现演员的名字、电影类别、账号注册时间这些丢入模型中训练而不是把整个句子丢入模型,这样工程量是不一样的

人工智能的目的就是减少人为干预,但作为计算机学生不是用,而是设计,所以我们要干预的越多越好

机器翻译

复杂的句子在不同翻译软件上翻译出来的结果是不一样的

自动摘要

通过大文本去提取重点

信息抽取

非结构化的一个结构中提取结构化的东西。比如一个邮件中,抽取其中内容中的事件、日期、开始时间、结束时间、地点

对话系统

测试多轮对话效果,上下文对话效果

Pipeline(流程)

原始文本➡️分词➡️清洗➡️标准化➡️特征提取➡️建模
原始文本:网页文本、新闻、报告
清洗:无用标签、特殊符号、停用词
标准化:Stemming(词干化)、Lemmatization
特征提取:tf-idf、word2vec
建模:相似度算法、分类算法

词干化:比如卡死了,卡顿,卡得要死,动不了都是表示性能问题,词干化就是说既然它表示的都是同一个东西,就把它统一成一样的

文本预处理

分词

中文分词:jieba,lac
英文分词:nltk

最大匹配分词算法:
前向最大匹配和后向最大匹配
例子:他说的确实在理
词典:他 说 的 的确 确实 在理 实在 理
前向最大匹配:他 说 的确 实在 理
后向最大匹配:他 说 的 确实 在理

共同缺点:没有考虑一整句话的含义

基于语言模型的分词
输入➡️生成所有可能的分割➡️选择其中最好的
例子:他说的确实在理
词典:他 说 的 的确 确实 在理 实在 理

每个词出现的概率都是相同的,而选择其中最好的就是一个概率问题

条件概率模型(贝叶斯全概率公式)

  1. P(H|D)=P(D|H)*P(H)
    H:假设,D:观测
    例如:湿度D,下不下雨H,P(H|D)表示在D下H发生的概率
    例子详见 07NLP文本表示[上] 55:40-1:04:10

  2. 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是购买的商品

句子向量

将句子以向量的形式表示

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醋酸洋红就是我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值