关于Text Embedding检索模型

前置知识复习

  • https://www.cnblogs.com/Allen-rg/p/13958508.html
  • word2vec详解:https://zhuanlan.zhihu.com/p/114538417
    Word2Vec和GloVe都是用于将词与向量相关联的流行词嵌入模型。

相同点:

  1. 目标:Word2Vec和GloVe的共同目标是将词汇映射到低维向量空间中,以便在自然语言处理任务中使用。
  2. 算法:它们都是基于神经网络和统计学习的方法。

不同点:

  1. 训练方式:Word2Vec使用了两种不同的模型,分别是Skip-gram和CBOW模型;而GloVe使用全局语料库统计信息来计算词向量。
  2. 上下文信息:Word2Vec模型侧重于局部上下文信息,即根据当前词预测其上下文单词GloVe模型将全局共现统计信息纳入考量,能够更好地反映词汇间的关系
  3. 训练速度:由于GloVe利用了全局信息,它在大规模数据集上的训练速度通常比Word2Vec更快。

word2vec

Skip-gram模型和CBOW(Continuous Bag of Words)模型是Word2Vec中两种主要的词嵌入模型,它们在训练方式和目标上有一些明显的区别。

  1. Skip-gram模型(跳字模型):

    • 目标:Skip-gram模型的目标是从中心词预测其周围的上下文单词。
    • 训练方式:给定一个中心词,Skip-gram模型会尝试预测在一定上下文窗口内可能出现的其他词,通过这种方式来学习单词的向量表示。
    • 应用:在小语料库中较为有效,尤其在罕见词上表现更好。
  2. CBOW模型(连续词袋模型):

    • 目标:CBOW模型的目标是根据上下文单词的信息来预测中心词。
    • 训练方式:给定一个上下文窗口内的词汇,CBOW模型会尝试预测这些词汇的中心词,从而学习单词的向量表示。
    • 应用:在大语料库上运行更快,尤其在频繁出现的词上表现更好。

Bert的词向量分布

在这里插入图片描述
在这里插入图片描述

如何解决?

在这里插入图片描述
[1] Representation Degeneration Problem in Training Natural Language Generation Models
[2] On the Sentence Embeddings from Pre-trained Language Models
[3] Learning to Remove: Towards Isotropic Pre-trained BERT Embedding

RankCSE

背景:
在这里插入图片描述
在这里插入图片描述

排序算法

在这里插入图片描述
推荐可分为以下四个流程,分别是召回、粗排、精排以及重排:

召回是源头,在某种意义上决定着整个推荐的天花板;
粗排是初筛,一般不会上复杂模型;
精排是整个推荐环节的重中之重,在特征和模型上都会做的比较复杂;
重排,一般是做打散或满足业务运营的特定强插需求,同样不会使用复杂模型;
召回层:召回解决的是从海量候选item中召回千级别的item问题

排序一直是信息检索的核心问题之一,Learning to Rank(简称LTR)用机器学习的思想来解决排序问题。LTR有三种主要的方法:PointWise,PairWise,ListWise。ListNet算法就是ListWise方法的一种

  • 补充:https://zhuanlan.zhihu.com/p/610333953
    在这里插入图片描述

pairwise

pointwise方法损失函数计算只与单个document有关,本质上是训练一个分类模型或者回归模型,判断这个document与当前的这个query相关程度,最后的排序结果就是从模型对这些document的预测的分值进行一个排序。对于pointwise方法,给定一个query的document list,对于每个document的预测与其它document是独立的。所以模型输入和对应的标签label形式如下:

输入: 单个document
label: document所属类型或者分值 pointwise方法将排序任务看做对单个文本的回归或者分类任务来做。若文档document的相关性等级有K种,则我们可以建模为一个有K个类别的 0 , 1 , 2 , . . . ,

### 文本 Embedding 检索输出方法及实现 #### 1. 使用词袋模型 (Bag of Words) 进行检索输出 通过构建词袋模型可以将文本转化为向量形式,进而用于相似度计算检索。具体过程如下: ```python from sklearn.feature_extraction.text import CountVectorizer import numpy as np corpus = [ "This is a cat.", "This is a dog." ] vectorizer = CountVectorizer() X = vectorizer.fit_transform(corpus) def bow_similarity(query, corpus, vectorizer): query_vec = vectorizer.transform([query]) similarities = [] for i in range(len(corpus)): doc_vector = X[i].toarray().flatten() similarity_score = np.dot(doc_vector, query_vec.toarray().flatten()) similarities.append(similarity_score) return similarities query = "This is an animal" similarities = bow_similarity(query, corpus, vectorizer) print(f"查询 '{query}' 的相似度分数:{similarities}") ``` 此代码展示了如何利用词袋模型来衡量新输入的查询语句与已有文档库中的每篇文档之间的相似程度[^1]。 #### 2. Word2Vec 实现检索输出 对于更复杂的场景,则可采用预训练好的 Word2Vec 模型来进行 embedding 表示,并据此完成检索操作: ```python from gensim.models import KeyedVectors from scipy.spatial.distance import cosine # 加载预先训练好的 Google News word vectors 或者其他来源的数据集 model_path = 'path_to_word2vec_model' word_vectors = KeyedVectors.load_word2vec_format(model_path, binary=True) def wv_similarity(word1, word2, model): try: vec1 = model[word1] vec2 = model[word2] sim = 1 - cosine(vec1, vec2) return round(float(sim), 4) except KeyError: print("One or both words not found in the vocabulary.") return None similarity_score = wv_similarity('cat', 'dog', word_vectors) if similarity_score: print(f"'Cat' 和 'Dog' 的相似度得分为 {similarity_score}.") ``` 上述例子说明了怎样借助于已有的 Word2Vec 模型快速获取两个单词间的余弦相似度得分[^2]。 #### 3. BERT 模型下的检索输出方式 BERT 是一种强大的双向 Transformer 编码器架构,在处理 NLP 任务方面表现出色。为了执行基于 BERT 的文本相似性比较,通常会先加载一个经过微调后的 BERT 模型实例,再使用该模型生成句子级别的 embeddings 向量表示,最后应用距离度量函数(如欧氏距离、曼哈顿距离等)评估不同文本片段间的关系强度。 ```python from transformers import BertTokenizer, BertModel import torch.nn.functional as F tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') texts = ["I love programming.", "Programming makes me happy."] inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt") with torch.no_grad(): outputs = model(**inputs) last_hidden_states = outputs.last_hidden_state.mean(dim=1).numpy() def bert_similarity(sentence_embedding_1, sentence_embedding_2): distance = F.cosine_similarity(torch.tensor(sentence_embedding_1), torch.tensor(sentence_embedding_2)) return float(distance.item()) score = bert_similarity(last_hidden_states[0], last_hidden_states[1]) print(f"Sentence pair has a similarity score of {round(score * 100, 2)}% according to BERT.") ``` 这段脚本解释了如何运用 Hugging Face 提供的 `transformers` 库中封装好的工具链轻松获得高质量的上下文感知型文本嵌入特征,并进一步实施有效的相似性分析.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值