SentenceTransformer


SentenceTransformer 是一个基于 BERT 的库,用于计算句子的语义嵌入。它通过将句子转换为固定大小的向量来表示句子的语义信息,这些向量可以用于多种任务,如相似度计算、聚类、分类和信息检索等。

BERT(Bidirectional Encoder Representations from Transformers)是一种基于Transformer架构的预训练语言模型,由Google在2018年推出‌。BERT的核心特点在于其双向编码器表征法,能够在预训练阶段同时利用输入序列的左侧和右侧上下文信息,从而更准确地理解语言的含义

嵌入(embedding)是一种尝试通过数的数组来表示某些东西“本质”的方法,其特性是“相近的事物”由相近的数表示。
嵌入(Embedding)在自然语言处理(NLP)中的应用是将词汇映射到一个连续的向量空间中,使得语义相似或相关的单词在该空间中距离相近。这一过程通过训练神经网络模型来学习词向量,其中著名的例子包括Word2Vec、GloVe和FastText等方法。这些方法通过分析大规模文本语料库,让模型学习每个词与其上下文之间的关系,从而得到词嵌入

文本分类
文本分类是一种监督学习方法,它将大量的文本数据按照预先定义的类别进行分类。在文本分类中,通常需要人工标注一些样本文本作为训练数据,然后通过训练模型来预测新文本所属的类别。常见的文本分类任务包括情感分析、垃圾邮件过滤等。
文本分类通常用于一些具有明确类别标签的场景,例如新闻分类、电影分类等。通过将大量的文本数据按照它们的主题或属性进行分类,可以帮助用户快速找到他们感兴趣的内容。

文本聚类
聚类是一种无监督学习方法,它将大量的文本数据按照它们的相似性进行分组。在聚类中,通常不需要人工标注训练数据,而是通过算法自动将相似的文本归为同一组。常见的聚类任务包括话题识别、社区发现等。
聚类通常用于一些没有明确类别标签的场景,例如发现社交网络中的社区、发现用户兴趣等。通过将相似的文本数据归为同一组,可以帮助用户发现隐藏在大量数据中的模式和趋势。

基本用法

from sentence_transformers import SentenceTransformer

# 加载预训练模型
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')

# 要编码的句子
sentences = ["This is an example sentence", "Each sentence is converted"]

# 将句子转换为嵌入向量
embeddings = model.encode(sentences)

print(embeddings)

这个示例展示了如何加载一个预训练模型,并将两个句子转换为嵌入向量。返回的 embeddings 是一个二维数组,每行代表一个句子的嵌入向量。
在大型语言模型(LLM)中,可以使用SentenceTransformer将文本向量化。

具体步骤为: 安装SentenceTransformer ->  加载预训练模型 -> 编码文本 ->使用向量化结果

以下是一个具体的步骤说明,展示如何使用SentenceTransformer将文本向量化:

1、安装SentenceTransformer

首先,需要安装SentenceTransformer库。如果你还没有安装,可以使用以下命令进行安装:

pip install sentence-transformers

2、加载预训练模型
可以从SentenceTransformer库中选择并加载一个预训练模型。例如,这里选择'paraphrase-MiniLM-L6-v2'模型。

from sentence_transformers import SentenceTransformer

# 加载预训练模型
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')

3、编码文本
将文本转换为向量。可以对单个句子或多个句子进行编码。

编码单个句子

sentence = "This is an example sentence"
embedding = model.encode(sentence)

print(embedding)

编码多个句子

sentences = ["This is an example sentence", "Each sentence is converted"]
embeddings = model.encode(sentences)

print(embeddings)

4、使用向量化结果
向量化结果可以用于各种下游任务,例如相似度计算、聚类、分类等。以下是一些示例:

计算句子相似度

from sklearn.metrics.pairwise import cosine_similarity

# 假设有两个句子
sentence1 = "This is a sentence"
sentence2 = "This is another sentence"

# 编码句子
embedding1 = model.encode(sentence1)
embedding2 = model.encode(sentence2)

# 计算余弦相似度
similarity = cosine_similarity([embedding1], [embedding2])
print(f"Cosine similarity: {similarity[0][0]}")

文本聚类

from sklearn.cluster import KMeans

# 一组句子
sentences = ["This is a sentence", "This is another sentence", "Yet another sentence"]

# 编码句子
embeddings = model.encode(sentences)

# 使用KMeans进行聚类
num_clusters = 2
clustering_model = KMeans(n_clusters=num_clusters)
clustering_model.fit(embeddings)
cluster_assignments = clustering_model.labels_

print(f"Cluster assignments: {cluster_assignments}")

相似度计算 

常见相似度计算方式: 常见的相似度计算方式-CSDN博客

词嵌入

One-Hot编码

One-Hot编码是一种简单而直观的文本表示方法。它的基本思想是将每个单词表示为一个二进制向量,其中向量的长度等于词汇表的大小,而向量中只有一个位置为1,其余位置为0。这个为1的位置对应着该单词在词汇表中的索引。

例如,假设我们的词汇表有5个单词:[‘我’, ‘你’, ‘他’, ‘她’, ‘它’]。那么,’我’就可以表示为[1, 0, 0, 0, 0],’你’可以表示为[0, 1, 0, 0, 0],以此类推。

One-Hot编码的优点是简单易懂,易于实现。然而,它也存在一些明显的缺点。首先,One-Hot编码产生的向量是稀疏的,即向量中大部分元素都是0,这会导致计算效率低下。其次,One-Hot编码无法捕捉单词之间的语义关系,即使两个单词在语义上非常相似,它们的One-Hot编码也是完全不相关的。

词嵌入(Embedding)

(没看懂词嵌入是怎么回事。。。)

为了解决One-Hot编码的缺点,人们提出了词嵌入(Embedding)这种文本表示方法。词嵌入的基本思想是将每个单词表示为一个低维的实数向量,这些向量可以捕捉到单词之间的语义关系。

词嵌入向量的维度通常远小于词汇表的大小,这使得词嵌入向量比One-Hot编码更加稠密,计算效率更高。此外,由于词嵌入向量是通过训练得到的,它们能够捕捉到单词之间的语义关系,使得语义上相似的单词在向量空间中的位置更加接近。

词嵌入的训练通常依赖于大量的语料库和深度学习模型,如Word2Vec、GloVe等。这些模型通过训练大量的文本数据,学习到每个单词的向量表示,使得这些向量在语义上更加合理和有效。

参考:

LLM中,使用SentenceTransformer将文本向量化_paraphrase-minilm-l6-v2-CSDN博客

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐