当前位置: 首页 > news >正文

week08_文本匹配任务

1、文本匹配任务概述

狭义:

给定一组文本,判断其是否语义相似

今天天气不错   match  今儿个天不错呀    √

今天天气不错   match  你的代码有bug      ×

以分值形式给出相似度

今天天气不错   match  今儿个天不错呀   0.9

今天天气不错   match  这几天天气不错   0.7

今天天气不错   match  你的代码有bug    0.1

广义:

1、给定一组文本,计算某种自定义的关联度

2、Natural Language Inference

两句话判断是否有关联、矛盾、中立

明天要下雨  vs  明天大晴天

3、Text Entailment

给出一段文本,和一个假设,判断文本是否能支持或反驳这个假设

4、主题判断

文章标题匹配内容等

2、文本匹配的应用

问答对话:车载导航、手机助手、聊天机器人、智能音响、智能客服

信息检索:浏览器、短视频新媒体平台

3、智能问答

1.基础资源:包括faq库,书籍文档,网页,知识图谱等等

2.问答系统:对基础资源进行了加工处理,形成问答所需要的索引和模型等

3.用户输入问题

4.问答系统给出答案

智能问答的技术路线

1、依照基础资源划分: 

1)基于faq知识库的问答  

2)基于文档/网页/书籍的问答  

3)基于图像/视频的问答  

4)基于知识图谱的问答  

5)基于表格的问答  

6)基于特定领域知识的问答  

7)基于人工规则的问答

2、依照答案产出方式划分:

1)检索式的问答:答案原文或答案的多个片段,存在于基础资源中        

2)生成式的问答:答案文本不存在于基础资源,由问答系统来生成答案    

3)二者结合

3、依照NLP相关技术划分:

1)单轮问答   2)多轮问答   3)多语种问答   4)事实性问答(有固定答案)  

5)开放性问答(没有固定的明确答案)   6)多模态问答(和图像视频相结合)  

7)选择型问答   8)抽取式问答   9)生成式问答

Faq知识库问答

原始问题:列表展示所有常见问题,用户需要自己找到对应的问题,对用户不友好

改进:让用户以自然语言描述自己的问题,算法进行faq库的检索,给出对应的答案

相关名词

1.问答对                 一个(或多个相似的)问题与它对应的答案

2.faq库/知识库       很多问答对组成的集合

3.标准问                 每组问答对中的问题,有多个时,为其中代表

4.相似问/扩展问     问答对中,标准问之外的其他问题

5.用户问                 用户输入的问题

6.知识加工             人工编辑faq库的过程

运行逻辑

1.对用户问进行预处理

2.使用处理后的问题,与faq库中问题计算相似度

3.按照相似度分值排序

4.返回最相似问题对应的答案

4、文本匹配算法

1.语义相似度计算是faq问答的核心

2.一般简称文本匹配      f(x, y)→Score

3.相似度分值合理,才可以找到正确的对应问题

4.计算分值的同时,也要考虑速度

文本匹配算法-编辑距离

编辑距离:两个字符串之间,由一个转成另一个所需的最少编辑操作次数

许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

两个字符串完全一致,编辑距离 = 0,相似度 = 1

两个字符串完全不一致,编辑距离 = 较长者长度,相似度 = 0

import numpy as np#编辑距离
def editing_distance(string1, string2):matrix = np.zeros((len(string1) + 1, len(string2) + 1))for i in range(len(string1) + 1):matrix[i][0] = ifor j in range(len(string2) + 1):matrix[0][j] = jfor i in range(1, len(string1) + 1):for j in range(1, len(string2) + 1):if string1[i - 1] == string2[j - 1]:d = 0else:d = 1matrix[i][j] = min(matrix[i - 1][j] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j - 1] + d)edit_distance = matrix[len(string1)][len(string2)]return 1 - edit_distance / max(len(string1), len(string2))

编辑距离-优缺分析

优点:

1.可解释性强

2.跨语种(甚至对于非语言序列)有效

3.不需要训练模型

缺点:

1.字符之间没有语义相似度  (我没钱 vs. 俺没钱  0.66)

2.受无关词/停用词影响大       (我要办卡 vs. 你好我需要办一张卡 0.5)

3.受语序影响大                       (今天天气不错  vs. 天气不错今天  0.33)

4.文本长度对速度影响很大

文本匹配算法-Jaccard相似度

通用表述:根据两个集合中,不同元素所占的比例,来衡量两个样本之间的相似度

用于文本匹配:根据两个文本中,不同的字或词所占的比例,来衡量两个文本之间的相似度

 今天天气真不错  vs. 估计明天天气更好    

公共字:天、气         总字数:(7-1) + (8-1) – 2 = 11        

jaccard相似度: 2 / 11 = 0.18

#jaccard距离
def jaccard_distance(string1, string2):words1 = set(string1)words2 = set(string2)distance = len(words1 & words2) / len(words1 | words2)return distance

tips:

如果输入字符串,则得到基于字的jaccrad相似度

如果输入词的列表,则得到基于词的jaccard相似度

该用词还是该用字?看场景!

( 分词是否准确、是否有很多类似名词、缩略词、文本长度等因素,都会影响选择)

Jaccard距离-优缺分析

优点:

1.语序不影响分数(词袋模型——今天天气不错 vs .天气不错今天 = 1)

2.实现简单,速度很快

3.可跨语种,无需训练等

缺点:

1.语序不影响分数(他打了我 vs. 我打了他 = 1 )

2.字词之间没有相似度衡量(同编辑距离)

3.受无关词影响

4.非一致文本可能出现满分(他是不知道 vs. 他不是不知道 = 1)

文本匹配算法-BM25算法

本质是TF·IDF算法,参考: nlp新词发现——浅析 TF·IDF_内部稳固度 左右熵-CSDN博客

常用在搜索引擎框架中,用来做文档和搜索问题的匹配。同样也可以用在问答中,做文本匹配核心思想:假如一个词在某类文本(假设为A类)中出现次数很多,而在其他类别文本(非A类)出现很少,那么这个词是A类文本的重要词(高权重词)。

恒星、黑洞 ——> 天文

反之,如果一个词在出现在很多领域,则其对于任意类别的重要性都很差。

如何用数学刻画?

一种nlp的经典统计值:TF·IDF

TF:词频。某个词在某类别中出现的次数/该类别词总数。

IDF:逆文档频率。逆文档频率高 -> 该词很少出现在其他文档。

 N:文本总数        dfi:包含词qi的文本中的总数

每个词对于每个类别都会得到一个TF·IDF值。

BM25算法

BM25是对TF·IDF的一种改进,优化其表示效果:

Wi = IDF(qi)=log(\frac{N-n(qi)+0.5}{n(qi)+0.5})       qi:问题中某词,n(qi):包含词qi的文档数

   fi:词频 k1, k2, b:可调节常数

BM25算法-优缺分析

优点:

1.通过使用TF·IDF弱化了无关词的影响强化了重要词的影响,使得效果大幅提升

2.统计模型计算快,不需要迭代(计算量主要在分词)

3.词袋模型*(双刃剑)、跨语种等

缺点:

1.依然没有考虑词与词之间的相似性

2.需要一定量的训练(统计)样本(faq库本身)

3.对于新增类别,需要重新计算统计模型

4.分值未归一化

文本匹配算法-word2vec

什么是词向量?     将每个词或字转换成同一向量空间内的一个向量

词向量的特点?     两个词如果语义相近,则在空间中的向量接近

词向量是如何寻得到的?

随机初始化,之后通过文本语料进行训练调整

如何训练/训练目标?        

1、基于窗口  2、基于语言模型  3、基于共现矩阵

训练提速技巧?        

1、层次softmax/Huffman树  2、负采样

如何用于文本匹配?

将文本中的所有词的词向量相加取平均     文本 ——> 句向量    

SentenceVector = \sum_{n}^{1}Wi/n    

句向量维度 = 词向量维度,不论文本长度    

文本相似度 = 向量相似度 = 向量夹角余弦值    

向量夹角为0,余弦值为1

word2vec-优缺分析

优点:

1.两个文本包含语义相似的词会提高相似度

2.训练需要的数据简单(纯文本语料即可)

3.计算速度快,可以对知识库内问题预先计算向量

4.将文本转化为数字,使后续复杂模型成为可能

缺点:

1.词向量的效果决定句向量效果

2.一词多意的情况难以处理(梨-苹果-华为)

3.受停用词和文本长度影响很大(也是词袋模型)

4.更换语种,甚至更换领域,都需要重新训练(无法跨语种、领域)

影响因素总结:语料数量/质量、领域适配、分词结果、未登录词

文本匹配-深度学习

在文本匹配任务上有两种主要方式:

1.表示型                                                      2.交互型

       

1、表示型文本匹配

两句话转化为向量后通过同一模型的表示层,再过匹配层得到比较得分,相似则得分靠近1

表示型文本匹配-训练方式1(孪生网络)

对于两个匹配的样本 预期输出分值为1

对于两个不匹配的样本 预期输出分值为0

本质上相当于2分类任务

《Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks》

表示型文本匹配-训练方式2

Triplet Loss

训练目标:

使具有相同标签的样本在embedding空间尽量接近

使具有不同标签的样本在embedding空间尽量远离

输入是一个三元组 <a, p, n>

a:anchor  原点  ,p:positive  与a同一类别的样本  , n:negative  与a不同类别的样本

在embedding空间中,三元组损失函数如下:

L=max⁡(d(a, p) − d(a, n) + margin, 0)

想要最小化L,则d(a,p)->0,d(a,n)->margin

Triplet Loss 也用于人脸识别模型的训练

2、交互型文本匹配

 Embedding层共享

表示层输出是否匹配 —— 本质是二分类任务

交互层进行信息融合,常以attention的方式

 3、对比-交互型vs表示型

表示型

优点:训练好的模型可以对知识库内的问题计算向量,在实际查找过程中,只对输入文本做一次向量化

缺点:在向量化的过程中不知道文本重点

交互型

优点:通过对比把握句子重点

缺点:每次计算需要都需要两个输入

对比学习

KD树

空间切割

1、依照建索引方式找到 最下方叶节点

2、向上回退,计算到节 点距离和到切割平面距离

3、根据情况判断是否 需要查找平面另一侧节点

4、回退到根节点为止

Annoy

Approximate Nearest Neighbors Oh Yeah

分割过程相当于Kmeans聚类

重复分割过程,直到每个空间内的点个数小于设定值

可以同时在多个接近的分支上查找

或通过不同初始划分,生成多个树

 

http://www.lryc.cn/news/528085.html

相关文章:

  • JUC--ConcurrentHashMap底层原理
  • 【2024年华为OD机试】(C卷,200分)- 推荐多样性 (JavaScriptJava PythonC/C++)
  • 【教学类-89-01】20250127新年篇01—— 蛇年红包(WORD模版)
  • [权限提升] 操作系统权限介绍
  • DeepSeek异军突起,重塑AI格局
  • git的理解与使用
  • Baklib打造内容中台新模式助力企业智能化升级
  • STM32完全学习——RT-thread在STM32F407上移植
  • 基于51单片机和ESP8266(01S)、LCD1602、DS1302、独立按键的WiFi时钟
  • 启元世界(Inspir.ai)技术浅析(二):深度强化学习
  • LeetCode100之子集(78)--Java
  • React第二十五章(受控组件/非受控组件)
  • 使用 Confluent Cloud 的 Elasticsearch Connector 部署 Elastic Agent
  • 嵌入式知识点总结 Linux驱动 (三)-文件系统
  • 【知识】可视化理解git中的cherry-pick、merge、rebase
  • 【deepseek】deepseek-r1本地部署-第二步:huggingface.co替换为hf-mirror.com国内镜像
  • 新站如何快速获得搜索引擎收录?
  • 如何使用tushare pro获取股票数据——附爬虫代码以及tushare积分获取方式
  • 解决vsocde ssh远程连接同一ip,不同端口情况下,无法区分的问题
  • Elasticsearch 自定义分成器 拼音搜索 搜索自动补全 Java对接
  • 基于物联网设计的疫苗冷链物流监测系统
  • RocketMQ消息是如何存储的?
  • Ubuntu 16.04安装Lua
  • 【JavaSE】String类常用字符串方法总结
  • python3+TensorFlow 2.x(二) 回归模型
  • 机器人抓取与操作概述(深蓝)——1
  • 简单聊聊“DeepSeek”
  • 使用 Docker + Nginx + Certbot 实现自动化管理 SSL 证书
  • 粒子群算法 笔记 数学建模
  • 【C语言】结构体与共用体深入解析