NLP学习笔记5--文本表示/相似度计算

文本表示/相似度计算

目录

文本表示/相似度计算

nlp方法论

常见nlp应用

常见pipeline

预处理

语言模型

拼写纠错

停用词过滤

 词袋模型

TF-IDF

one-hot

无监督的深度语义

ELMo 

seq2seq

attention机制

transformer

 GPT

 BERT

 深度匹配范式 

表示模型


NLU:语音/文本--语义 大部分已经被解决  异常检测 few shot learning

NLG:语义-->文本 /语音  大部分集中在这个方向  如何评价文本是非常主观的 但是没有公认指标

CV 偏向于感知任务

NLP 偏向于认知 需要思考 推理 (自然语言本身就存在很多问题)

challenges: 多种表达方式(multiple ways to express)   一次多义(ambiguity)  多模态(multi-model)很多时候理解一句话 需要更多的上下文 甚至是图片文本 语音

how to solve ambiguity?

nlp方法论

一个贯穿nlp始终的方法论  尽可能多的使用上下文信息  !!!!!!!

prior:如果之前这个单词出现了20000词 分别代表什么意思的概率是多少 把这个概率分布作为一个先验数据 在没有上下文信息和上下文信息不足时 可以参考prior

后验概率分布:从数据中学到的上下文关系 

建模 就是如何更好的捕捉上下文信息 



常见nlp应用

问答系统 Watson

问答系统怎么实现的?

构建知识库 实际上就是键值对

输入问题 NLU语义理解 将问题转化为sql命令 然后根据命令搜索键值对



情感分析

股票价格预测  分析市场情绪

舆情监测   

产品评论

事件监测

技术逐渐饱和后进化到aspect-level 从不同的方面分析用户表露的情感

机器翻译  对nlp发展做出了巨大的贡献 seq2seq transformer

有公用的评价指标 BLEU

自动摘要生成

基于抽取的生成  对新闻预料比较有用 

文本生成 seq2seq 可以生成原文中没有的 但生成性能有限

如果文本特别长怎么办  seq2seq有遗忘的问题 思路:attention 通过段落或者句子级别的输入  

信息抽取  养活了一大帮做nlp的人  目的:为了在一个非结构化的文本中抽取出结构化信息  NLU任务    SIGIR这个领域的顶会

如何解决?

1.NER命名实体识别 把这句话中所涉及到的实体全部抽取出来

2.relation extraction关系抽取   川普是usa的总统  做一个分类任务 这句话有没有包含这两个实体中的某一个关系

3.知识图谱 这些抽取出来的关系 构建这个领域专有的知识库

对话系统

简化成有一些具体目的的要求 图灵测试:如何判断人工智能的发展水平 一旦对话系统可以伪装成一个人和人交谈 这样就真正实现了人工智能

一旦遇到你不懂的问题 你就可以反问他 



常见pipeline

 自然语言处理常见的pipeline

预处理

pre-process 数据预处理:分词  数据清洗 数据标准化(相同词不同的表示转化为同一个)(停用词:那个 额 呢 啊等等) 特征提取(转化为n维向量) 建模(分类算法 相似度算法等等) 不同的任务可能会有不同的顺序

文本预处理:分词 拼写纠正 停用词过滤 词的标准化

分词工具:分词这个任务已经是差不多已经被解决的问题

不要轻视经典算法 

基于字符串匹配的分词方法

依赖于词典(中文中所有的词)的信息 和词典中的词逐一比较

优先考虑长词 最大匹配 最小匹配反之

从后往前 后向匹配 前向匹配反之

缺点:虽然简单 但经常分成不符合语言逻辑的词语(没有考虑语义)

语言模型

接下来就有基于语言模型的分词

语言模型(计算一个句子的出现概率 通俗来说判断某句话是不是人话 如果越通顺对应的概率就越高)

输入后 生成所有可能的分割 根据语言模型选择其中最好的  解决没有考虑语义的问题

缺点: 就算写成条件概率乘积的形式 数据稀疏化依旧严重

语言模型如何实现:w1到wk的联合概率分布 将联合概率分布根据链式法则写成条件概率的乘积

搜集到的预料有限 导致稀疏  但是写成条件概率的形式

马尔可夫假设:假设任意一个词之和前面出现的一个词和有限词有关

如果是独立的 就是unigram model 

放宽假设 每个词的出现 只和前一个词有关 w2出现之和w1有关

这样就可以分别估计每一个词的条件概率 这就是bigram model

如何将刚才的分词算法优化?

尝试把最大分词概率的过程抽象成是一个动态规划的过程

 有什么好处:从第一个节点到最后一个节点 每一条路径都对应着一个可能的切分方式

寻找一条路径 使得所有乘积最大  bigram就涉及到维特比算法



拼写纠错

1.把不同的字写错 本来写的就是错的 可以通过词表匹配 找到和这个词距离最近的正确的词

2.语法错误 相对复杂一些

解决1:第一步发现错误 包含有正确单词的词典 如何去判断 在词典中查找 如果没有就是拼错了

             第二步纠错 根据实际情况 列出来可能正确的词 如何生成候选词? 选择一个正确的度量方式 去度量两个单词之间是否相似 通常就是两个字符串之间的最小编辑距离 计算两个字符串中的最小编辑距离 MED(minimum edit distance) 把字符串一换成字符串二所需最小的插入删除替换操作 // 如何计算MED 经典DP问题

简化成计算字串之间的最小编辑距离来实现

 



停用词过滤



 

 用规则的方式把缩写写成全程

去掉音标 大小写 所有的normalize都和下游数据有关

stemming词干提取 和 lemmatization词性还原



文本表示基础--词袋模型 文本相似度 词向量 句向量

one-hot 用0,1表示每个单词

同时用  0,1表示句子

 词袋模型

:在词级模型上拓展   bag-of-word 没有考虑出现位置 只关心出现的次数 

 



如何计算句子之间的相似程度?sentence similarity

  但存在一个问题 并不是出现的越多就越重要 并不是出现的越少就越不重要

如停用词the 等

如何解决这个问题?

TF-IDF

提出了TF-IDF模型:衡量某一个词或者一句话 对某句话或者某个文档的重要性

 如果这个词经常出现在各种各样其他文档中 那么说明这个词没那么重要

如果这个词很少出现在其他文档中 但在本文中出现次数很多 那么这个词就很重要

具体计算



   但是tf-idf不能表示两个单词之间的相似度

把独热的表示方式换成分布式表示(用密集向量表征词汇 ) 

 这些表示方法得到的每个词的表示 就是这个词对应的词向量



如何学习每一个单词的分布式表示(词向量)

尽量去建模关于词的上下文信息 



对齐的字符序列--编辑距离

非对齐的词向量平均--可以把每一个单词的id记录下来 对比相同词

句子级别的embedding--

one-hot

特点:稀疏表示、词表空间

nlp 从编程的角度word embedding本质 word2vec cbow skipgram 得出来的词向量可以认为是这个单词的one-hot的编码和一个词向量矩阵做了一个embedding lookingup   由one-hot的基础上进行全连接得到word embedding 详情可见 转载链接(29条消息) embedding_lookup的学习笔记_FBeetle的博客-CSDN博客

词袋模型 根据词频加权

TF-IDF 加上词的重要性加权

无监督的深度语义

自回归  s开始符 e结束符  用过去的历史经验预测未来    rnn lstm等

自编码 

encoder decoder架构   把中间的context取出来就是句子表征

ELMo 

elmo提出了 在不同的语境下完成不同的预测

双向的lstm结构 中间有两层隐向量表征h1h2 然后和输入的embedding相加 得到最终的效果

有什么用呢? 就是一个单词的embedding不是固定的 会根据上下文改变

我们成为语境化的词向量表达方式

seq2seq

 中间点只有一条线连接 缺点:输入端和输出端唯一的联系 只在最后一个时刻的向量 输出端的每一个单词和输入端每一个单词没有很好的相关性

为了解决这个问题 有人提出了attention机制 增强解码器和编码器的关联性

attention机制

 解码器中的每一个单词会对编码器中每一个单词都会做一个相似性度量

相似性的度量都会通过加权和的方式拼接或者累加到解码器上  这样解码器就吸收了很多编码器信息

重点!!!

下图中红色的圆对应的隐向量就是q

k和v分别是编码其中绿色的圆和黄色的圆 

这里的qkv详情可看  转载链接(18 封私信 / 80 条消息) 深度学习attention机制中的Q,K,V分别是从哪来的? - 知乎 (zhihu.com)

讲的非常透彻

 attention定义  这里的qk实际上就是在求相似度 根号dk就是做一个缩放 对相似度做一个规划V就是最终向量

相似度的定义方式 

1.dot 就是最常规的

2.general 如果维度不一致 就要乘一个w

3.concat 做一个拼接

4.perception 更复杂一点求相似度

 

transformer

 解码器每一层都会对编码器倒数的若干层做一个attention 然后把这个attention加上

 attention两种

第一种self-attention 

第二种传统的qkv这种 在解码器这部分

 GPT

传统的单向的语言模型

 BERT

 cls是分类字符  SEP特殊符号拼接  两句话相邻就是1 不相邻就为0 NSP

TOKEN embeddings:字向量

segment embeddings:句子的表示 第一句话全为EA 第二句话EB

position embeddings:位置编码 绝对位置编码 直接定义死这个向量

transformer 用的正余弦编码 后面的变体有相对位置编码

 语言模型非常重要!!! 后续还会更加仔细地学习



 深度匹配范式 

表示模型

 GAN引出的问题

生成器从正态分布开始做生成 预测出

Ground truth  两个embedding表示 然后有D判别器 判断两幅图片谁是真谁是假

Quary就是需要被检索的句子 Doc就是需要被检索的文章

match net:Q和DOC之间的一个匹配模型 然后得到一个sim 然后用sigmoid输出

pair wise 有一个权值共享

表示模型:自己跑自己的结构  然后看余弦距离

交互模型:esim短文本匹配算法 中间有几层权值共享 或者纠缠(点乘 相加 attention机制)

 如果需要快速的做一个匹配 用表示模型

交互模型 结果好 但计算量大

表示模型 交互模型详情见  转载链接 侵权必删

(29条消息) 【深度语义匹配模型 】原理篇一:表示型_zenRRan的博客-CSDN博客



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Lyttonkeepgoing

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

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

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

打赏作者

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

抵扣说明:

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

余额充值