目录
文本表示/相似度计算
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始终的方法论 尽可能多的使用上下文信息 !!!!!!!
prior:如果之前这个单词出现了20000词 分别代表什么意思的概率是多少 把这个概率分布作为一个先验数据 在没有上下文信息和上下文信息不足时 可以参考prior
后验概率分布:从数据中学到的上下文关系
建模 就是如何更好的捕捉上下文信息
问答系统 Watson
问答系统怎么实现的?
构建知识库 实际上就是键值对
输入问题 NLU语义理解 将问题转化为sql命令 然后根据命令搜索键值对
情感分析
股票价格预测 分析市场情绪
舆情监测
产品评论
事件监测
技术逐渐饱和后进化到aspect-level 从不同的方面分析用户表露的情感
机器翻译 对nlp发展做出了巨大的贡献 seq2seq transformer
有公用的评价指标 BLEU
自动摘要生成
基于抽取的生成 对新闻预料比较有用
文本生成 seq2seq 可以生成原文中没有的 但生成性能有限
如果文本特别长怎么办 seq2seq有遗忘的问题 思路:attention 通过段落或者句子级别的输入
信息抽取 养活了一大帮做nlp的人 目的:为了在一个非结构化的文本中抽取出结构化信息 NLU任务 SIGIR这个领域的顶会
如何解决?
1.NER命名实体识别 把这句话中所涉及到的实体全部抽取出来
2.relation extraction关系抽取 川普是usa的总统 做一个分类任务 这句话有没有包含这两个实体中的某一个关系
3.知识图谱 这些抽取出来的关系 构建这个领域专有的知识库
对话系统
简化成有一些具体目的的要求 图灵测试:如何判断人工智能的发展水平 一旦对话系统可以伪装成一个人和人交谈 这样就真正实现了人工智能
一旦遇到你不懂的问题 你就可以反问他
自然语言处理常见的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不能表示两个单词之间的相似度
把独热的表示方式换成分布式表示(用密集向量表征词汇 )
这些表示方法得到的每个词的表示 就是这个词对应的词向量
如何学习每一个单词的分布式表示(词向量)
尽量去建模关于词的上下文信息
对齐的字符序列--编辑距离
非对齐的词向量平均--可以把每一个单词的id记录下来 对比相同词
句子级别的embedding--
特点:稀疏表示、词表空间
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提出了 在不同的语境下完成不同的预测
双向的lstm结构 中间有两层隐向量表征h1h2 然后和输入的embedding相加 得到最终的效果
有什么用呢? 就是一个单词的embedding不是固定的 会根据上下文改变
我们成为语境化的词向量表达方式
中间点只有一条线连接 缺点:输入端和输出端唯一的联系 只在最后一个时刻的向量 输出端的每一个单词和输入端每一个单词没有很好的相关性
为了解决这个问题 有人提出了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 更复杂一点求相似度
解码器每一层都会对编码器倒数的若干层做一个attention 然后把这个attention加上
attention两种
第一种self-attention
第二种传统的qkv这种 在解码器这部分
传统的单向的语言模型
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博客