bert提取词向量比较两文本相似度

使用 bert-base-chinese 预训练模型做词嵌入(文本转向量)

模型下载:bert预训练模型下载-CSDN博客

参考文章:使用bert提取词向量

下面这段代码是一个传入句子转为词向量的函数

python 复制代码
from transformers import BertTokenizer, BertModel
import torch

# 加载中文 BERT 模型和分词器
model_name = "../bert-base-chinese"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)


def get_word_embedding(sentence):
    # 分词
    tokens = tokenizer.tokenize(sentence)
    # 添加特殊标记 [CLS] 和 [SEP]
    tokens = ['[CLS]'] + tokens + ['[SEP]']
    # 将分词转换为对应的编号
    input_ids = tokenizer.convert_tokens_to_ids(tokens)
    # 转换为 PyTorch tensor 格式
    input_ids = torch.tensor([input_ids])

    # 获取词向量
    outputs = model(input_ids)

    # outputs[0]是词嵌入表示
    embedding = outputs[0]
    # 去除头尾标记的向量值
    word_embedding = embedding[:, 1:-1, :]

    return word_embedding

embedding:, 1:-1, : 这一行的意是以下,数据类型张量

batch_size, sequence_length, hidden_size,其中:

  • batch_size 是输入文本的批次大小,即一次输入的文本样本数量。
  • sequence_length 是输入文本序列的长度,即编码器输入的词的数量。
  • hidden_size 是隐藏状态的维度大小,是 BERT 模型的超参数,通常为 768 或 1024。

比较两文本相似度

python 复制代码
def compare_sentence(sentence1, sentence2):
    # 分词
    tokens1 = tokenizer.tokenize(sentence1)
    tokens2 = tokenizer.tokenize(sentence2)
    # 添加特殊标记 [CLS] 和 [SEP]
    tokens1 = ['[CLS]'] + tokens1 + ['[SEP]']
    tokens2 = ['[CLS]'] + tokens2 + ['[SEP]']
    # 将分词转换为对应的词表中的索引
    input_ids1 = tokenizer.convert_tokens_to_ids(tokens1)
    input_ids2 = tokenizer.convert_tokens_to_ids(tokens2)
    # 转换为 PyTorch tensor 格式
    input_ids1 = torch.tensor([input_ids1])
    input_ids2 = torch.tensor([input_ids2])

    # 获取词向量
    outputs1 = model(input_ids1)
    outputs2 = model(input_ids2)

    # outputs[0]是词嵌入表示
    embedding1 = outputs1[0]
    embedding2 = outputs2[0]
    # 提取 [CLS] 标记对应的词向量作为整个句子的表示
    sentence_embedding1 = embedding1[:, 0, :]
    sentence_embedding2 = embedding2[:, 0, :]

    # 计算词的欧氏距离
    # 计算p范数距离的函数,其中p设置为2,这意味着它将计算的是欧几里得距离(L2范数)
    euclidean_distance = torch.nn.PairwiseDistance(p=2)
    distance = euclidean_distance(sentence_embedding1, sentence_embedding2)
    # 计算余弦相似度
    # dim=1 表示将在第一个维度(通常对应每个样本的特征维度)上计算余弦相似度;eps=1e-6 是为了数值稳定性而添加的一个很小的正数,以防止分母为零
    cos = torch.nn.CosineSimilarity(dim=1, eps=1e-6)
    similarity = cos(sentence_embedding1, sentence_embedding2)

    print("句1: ", sentence1)
    print("句2: ", sentence2)
    print("相似度: ", similarity.item())
    print("欧式距离: ", distance.item())


compare_sentence("黄河南大街70号8门", "皇姑区黄河南大街70号8门")
相关推荐
财经资讯数据_灵砚智能几秒前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年6月4日
人工智能·python·ai·信息可视化·自然语言处理·ai编程·灵砚智能
侃谈科技圈1 分钟前
2026免费AI自动抠图工具汇总:全平台+电脑在线全方案,无水印零套路
人工智能
apcipot_rain2 分钟前
计科八股20260604——AI安全、K-means、SVM、nano
人工智能·神经网络·安全·支持向量机·kmeans
Rain5094 分钟前
实战:搭建 AI Code Review 自动化流水线
前端·人工智能·git·ci/cd·自动化·ai编程·代码复审
Promise微笑6 分钟前
洞察无形:红外热像仪应用场景与高性价比之选
人工智能·物联网·算法
lulu12165440789 分钟前
2026年-企业级大模型API网关实战指南: 微元算力聚合平台性能优化实测
java·人工智能·spring·性能优化·ai编程
2601_9557819813 分钟前
Windows 环境快速部署 Hermes 智能 Agent,规避环境配置各类坑点
人工智能·本地部署·教程分享·hermes·hermes部署
DO_Community14 分钟前
LawVo 借助 DigitalOcean 扩展 AI 驱动的法律服务
人工智能
带娃的IT创业者14 分钟前
从马斯克败诉OpenAI看AI时代的契约重构与技术伦理边界
人工智能·重构·openai·马斯克·商业化·技术伦理·ai治理
Hali_Botebie15 分钟前
为什么静态3DGS+轨迹回放,可以通过强化学习训练端到端自动驾驶?
人工智能·机器学习·自动驾驶