GTE中文语义相似度计算实战:新闻标题去重系统构建

GTE中文语义相似度计算实战:新闻标题去重系统构建

1. 引言

1.1 业务场景描述

在新闻聚合、内容推荐和信息检索系统中,海量文本数据的重复问题严重影响用户体验与系统效率。尤其在新闻平台中,同一事件常被多个媒体以略微不同的表述方式发布,形成大量语义相近但字面不完全相同的“类重复”标题。传统的基于关键词匹配或编辑距离的方法难以有效识别这类语义层面的相似性。

为解决这一问题,构建一个高精度、低延迟、可落地的中文语义相似度计算系统成为关键。本文将围绕GTE(General Text Embedding)中文向量模型,详细介绍如何搭建一套完整的新闻标题去重系统,涵盖语义向量化、相似度计算、Web可视化界面集成及轻量级部署方案。

1.2 痛点分析

现有去重方法面临以下挑战:

  • 字面匹配失效:如“中国队夺冠” vs “中国代表队赢得冠军”,词汇不同但语义一致。
  • 规则系统维护成本高:依赖人工设定阈值和规则,泛化能力差。
  • 深度模型部署复杂:多数BERT类模型对GPU依赖强,CPU推理慢,不适合边缘或资源受限环境。

1.3 方案预告

本文提出的解决方案具备以下特点:

  • 基于达摩院开源的GTE-Base 中文模型,专为中文语义理解优化;
  • 集成 Flask 构建的 WebUI 可视化仪表盘,支持实时交互式相似度测试;
  • 提供 RESTful API 接口,便于集成到新闻处理流水线;
  • 全流程适配 CPU 运行,启动快、内存占用低,适合轻量级部署。

通过本实践,读者可快速构建一个可用于生产环境的语义去重模块。

2. 技术方案选型

2.1 模型选型:为何选择 GTE?

在众多中文 embedding 模型中,GTE 因其在 C-MTEB(Chinese Massive Text Embedding Benchmark)榜单上的优异表现脱颖而出。以下是 GTE 相较于其他主流模型的核心优势对比:

模型中文性能推理速度(CPU)显存需求是否支持长文本
BERT-Whitening一般
SimCSE-BERT较好中等
ERNIE-Embedding高(需GPU)
GTE-Base优秀快(优化后)低(CPU友好)

结论:GTE 在保持高语义表征能力的同时,具备良好的推理效率和硬件兼容性,非常适合用于新闻标题这类短文本的批量去重任务。

2.2 架构设计:系统整体结构

系统采用分层架构设计,确保模块解耦、易于扩展:

+------------------+ +---------------------+ | 用户输入 | --> | Flask Web Server | | (句子A / 句子B) | | - 路由控制 | +------------------+ | - 参数校验 | +----------+----------+ | +---------------v------------------+ | GTE 文本向量化引擎 | | - Tokenization | | - 向量生成 (sentence_embedding) | +----------------+-----------------+ | +----------------v------------------+ | 余弦相似度计算器 | | - 计算 cos(A, B) | | - 输出 [0, 1] 区间得分 | +----------------+-----------------+ | +----------------v------------------+ | 结果展示层 | | - WebUI 动态仪表盘 | | - JSON API 返回 | +-----------------------------------+

该架构支持两种使用模式:

  • 交互式使用:通过 WebUI 手动输入并查看结果;
  • 自动化集成:调用/api/similarity接口实现批处理。

3. 实现步骤详解

3.1 环境准备

本项目已封装为 CSDN 星图镜像,用户无需手动配置依赖。若需本地部署,请执行以下命令:

# 创建虚拟环境 python -m venv gte_env source gte_env/bin/activate # Linux/Mac # activate gte_env # Windows # 安装核心依赖 pip install torch==1.13.1+cpu -f https://download.pytorch.org/whl/torch_stable.html pip install transformers==4.35.2 pip install flask scikit-learn numpy

注意:必须锁定transformers==4.35.2版本,避免因 HuggingFace API 变更导致输入格式报错。

3.2 核心代码解析

3.2.1 GTE 模型加载与向量化
# embedding.py from transformers import AutoTokenizer, AutoModel import torch import numpy as np class GTEEmbedder: def __init__(self, model_path="thenlper/gte-base-zh"): self.tokenizer = AutoTokenizer.from_pretrained(model_path) self.model = AutoModel.from_pretrained(model_path) self.model.eval() # 关闭训练模式 def encode(self, texts): """ 将文本列表转换为768维向量 :param texts: str 或 List[str] :return: numpy array of shape (n, 768) """ if isinstance(texts, str): texts = [texts] encoded_input = self.tokenizer( texts, padding=True, truncation=True, max_length=512, return_tensors='pt' ) with torch.no_grad(): model_output = self.model(**encoded_input) # 使用 [CLS] token 的池化输出 sentence_embeddings = model_output[0][:, 0] # 归一化向量(便于后续余弦计算) sentence_embeddings = torch.nn.functional.normalize(sentence_embeddings, p=2, dim=1) return sentence_embeddings.numpy()

代码说明

  • 使用AutoModel加载预训练 GTE 模型;
  • [CLS]向量进行 L2 归一化,使得余弦相似度可直接通过点积计算;
  • 支持批量输入,提升处理效率。
3.2.2 余弦相似度计算
# utils.py from sklearn.metrics.pairwise import cosine_similarity def calculate_similarity(vec_a, vec_b): """ 计算两个向量间的余弦相似度 :param vec_a: numpy array (1, 768) :param vec_b: numpy array (1, 768) :return: float in [0, 1] """ sim = cosine_similarity(vec_a, vec_b)[0][0] return float(sim) # 转为 Python 原生类型以便 JSON 序列化
3.2.3 Flask Web 服务与 API 接口
# app.py from flask import Flask, request, jsonify, render_template from embedding import GTEEmbedder from utils import calculate_similarity app = Flask(__name__) embedder = GTEEmbedder() @app.route("/") def index(): return render_template("index.html") # 包含输入表单和仪表盘 @app.route("/api/similarity", methods=["POST"]) def api_similarity(): data = request.get_json() text_a = data.get("text_a", "") text_b = data.get("text_b", "") if not text_a or not text_b: return jsonify({"error": "Missing text_a or text_b"}), 400 try: vec_a = embedder.encode([text_a]) vec_b = embedder.encode([text_b]) score = calculate_similarity(vec_a, vec_b) # 转换为百分比并保留一位小数 percentage = round(score * 100, 1) return jsonify({ "text_a": text_a, "text_b": text_b, "similarity_score": score, "similarity_percent": f"{percentage}%" }) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route("/compute", methods=["GET"]) def compute_page(): return render_template("compute.html")
3.2.4 前端动态仪表盘(HTML + JavaScript)

前端使用 Chart.js 实现动态旋转仪表效果,增强可视化体验:

<!-- templates/compute.html --> <canvas id="gaugeChart" width="200" height="100"></canvas> <button onclick="calculate()">计算相似度</button> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <script> let gaugeChart; function initGauge() { const ctx = document.getElementById('gaugeChart').getContext('2d'); gaugeChart = new Chart(ctx, { type: 'doughnut', data: { datasets: [{ data: [100], backgroundColor: ['#e0e0e0'] }] }, options: { circumference: 180, rotation: 270, cutout: '70%', animation: { duration: 1000 } } }); } async function calculate() { const textA = document.getElementById("textA").value; const textB = document.getElementById("textB").value; const res = await fetch("/api/similarity", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text_a: textA, text_b: textB }) }); const result = await res.json(); const percent = parseFloat(result.similarity_percent); // 更新图表 gaugeChart.data.datasets[0].data = [percent, 100 - percent]; gaugeChart.data.datasets[0].backgroundColor = [ percent > 80 ? '#4caf50' : percent > 60 ? '#ff9800' : '#f44336', '#e0e0e0' ]; gaugeChart.update(); alert(`语义相似度:${result.similarity_percent}`); } window.onload = initGauge; </script>

3.3 实践问题与优化

问题1:模型首次加载缓慢

现象:初次加载 GTE 模型耗时约 10-15 秒。

解决方案

  • 启动时异步加载模型,避免阻塞主线程;
  • 使用torch.jit.trace对模型进行脚本化编译,提升后续推理速度。
问题2:长文本截断影响精度

现象:超过 512 token 的文本被截断,导致信息丢失。

优化策略

  • 对新闻标题通常不超过 50 字,无需特殊处理;
  • 若用于正文比较,可采用滑动窗口平均池化策略融合多段向量。
问题3:API 并发性能瓶颈

现象:多用户同时请求时响应延迟上升。

改进措施

  • 使用 Gunicorn 多工作进程部署;
  • 添加 Redis 缓存层,缓存高频查询结果(如热点新闻标题对)。

4. 新闻标题去重系统应用示例

4.1 批量去重流程设计

将上述服务嵌入新闻采集系统的 ETL 流程中:

# deduplication_pipeline.py def batch_deduplicate(titles: list, threshold=0.85): """ 批量去重主逻辑 :param titles: 新闻标题列表 :param threshold: 相似度阈值 :return: 去重后的标题索引列表 """ embedder = GTEEmbedder() vectors = embedder.encode(titles) keep_indices = [] for i, title in enumerate(titles): is_duplicate = False for j in keep_indices: sim = calculate_similarity(vectors[i:i+1], vectors[j:j+1]) if sim >= threshold: is_duplicate = True break if not is_duplicate: keep_indices.append(i) return [titles[i] for i in keep_indices]

4.2 实际案例演示

输入一组新闻标题:

  1. “中国队夺得亚洲杯冠军”
  2. “国足赢下关键战役捧起奖杯”
  3. “中国男足历史性夺冠”
  4. “今天天气晴朗,适合出行”

设置阈值0.8,运行去重程序后保留:

  • “中国队夺得亚洲杯冠军”
  • “今天天气晴朗,适合出行”

其余两条因语义高度重合被剔除,验证了系统的有效性。

5. 总结

5.1 实践经验总结

通过本次实战,我们成功构建了一个基于 GTE 的中文语义相似度计算系统,并应用于新闻标题去重场景。核心收获包括:

  • 模型选择决定上限:GTE 在中文语义任务中表现出色,且对 CPU 友好,是轻量级部署的理想选择;
  • 工程优化不可忽视:从版本锁定到输入归一化,每一个细节都影响系统的稳定性;
  • 可视化提升可用性:WebUI 不仅便于调试,也降低了非技术人员的使用门槛。

5.2 最佳实践建议

  1. 合理设置相似度阈值:建议初始值设为0.8~0.85,根据业务反馈微调;
  2. 启用缓存机制:对于高频出现的标题(如热搜词),使用缓存显著提升性能;
  3. 定期更新模型:关注 ModelScope 上 GTE 的新版本发布,持续迭代升级。

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1186301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速理解LED显示屏与NovaStar控制系统的安装流程

从零开始&#xff1a;LED显示屏与NovaStar控制系统的实战安装指南你有没有遇到过这样的情况&#xff1f;屏已经挂上墙了&#xff0c;通电后却发现部分区域不亮、画面撕裂&#xff0c;甚至整个系统频繁重启。调试两三天都找不到根源&#xff0c;客户脸色越来越难看……其实&…

SenseVoice Small保姆级教程:语音识别模型训练

SenseVoice Small保姆级教程&#xff1a;语音识别模型训练 1. 引言 1.1 学习目标 本文旨在为开发者和研究人员提供一份完整的 SenseVoice Small 模型训练与二次开发指南。通过本教程&#xff0c;您将掌握&#xff1a; 如何部署并运行基于 SenseVoice Small 的 WebUI 界面如…

AI读脸术 vs 传统方案:人脸属性分析性能对比实战评测

AI读脸术 vs 传统方案&#xff1a;人脸属性分析性能对比实战评测 1. 引言 1.1 选型背景 在智能安防、用户画像、无人零售和个性化推荐等场景中&#xff0c;人脸属性分析&#xff08;Facial Attribute Analysis&#xff09;已成为一项关键的前置技术能力。其中&#xff0c;性…

图片旋转判断模型Docker部署全攻略:一键启动服务

图片旋转判断模型Docker部署全攻略&#xff1a;一键启动服务 1. 技术背景与应用场景 在图像处理和计算机视觉的实际项目中&#xff0c;图片方向的准确性直接影响后续任务的效果。例如&#xff0c;在文档扫描、OCR识别、图像分类等场景中&#xff0c;若输入图片存在90、180或2…

DeepSeek-R1-Distill-Qwen-1.5B参数详解:top_p与temperature协同调优

DeepSeek-R1-Distill-Qwen-1.5B参数详解&#xff1a;top_p与temperature协同调优 1. 引言 1.1 模型背景与技术演进 随着大语言模型在推理能力、代码生成和数学解题等复杂任务中的表现不断提升&#xff0c;如何通过高效训练策略提升小规模模型的性能成为研究热点。DeepSeek-R…

Qwen3-4B推理吞吐低?vLLM并行优化实战解决方案

Qwen3-4B推理吞吐低&#xff1f;vLLM并行优化实战解决方案 1. 背景与问题提出 在大模型实际部署过程中&#xff0c;尽管Qwen3-4B-Instruct-2507具备强大的语言理解与生成能力&#xff0c;但在高并发或长上下文场景下&#xff0c;其原生推理服务常面临吞吐量低、响应延迟高的问…

Hunyuan-MT-7B-WEBUI前端优化:WebSocket实现实时交互体验

Hunyuan-MT-7B-WEBUI前端优化&#xff1a;WebSocket实现实时交互体验 1. 背景与问题分析 随着大模型在多语言翻译场景中的广泛应用&#xff0c;用户对交互体验的要求也逐步提升。Hunyuan-MT-7B作为腾讯开源的高性能翻译模型&#xff0c;支持包括日语、法语、西班牙语、葡萄牙…

从论文到落地:SAM3提示词引导分割模型镜像一键部署教程

从论文到落地&#xff1a;SAM3提示词引导分割模型镜像一键部署教程 1. 引言 1.1 开放词汇分割的技术演进 近年来&#xff0c;视觉感知模型正从“封闭词汇”向“开放词汇”范式迁移。传统图像分割方法依赖预定义类别标签&#xff08;如 COCO 的 80 类&#xff09;&#xff0c…

【毕业设计】SpringBoot+Vue+MySQL 在线课程管理系统平台源码+数据库+论文+部署文档

&#x1f4a1;实话实说&#xff1a; CSDN上做毕设辅导的都是专业技术服务&#xff0c;大家都要生活&#xff0c;这个很正常。我和其他人不同的是&#xff0c;我有自己的项目库存&#xff0c;不需要找别人拿货再加价&#xff0c;所以能给到超低价格。 摘要 随着信息技术的飞速发…

DCT-Net模型版权保护:数字水印技术应用

DCT-Net模型版权保护&#xff1a;数字水印技术应用 1. 引言&#xff1a;AI生成内容的版权挑战与应对 随着深度学习技术的发展&#xff0c;基于AI的人像卡通化服务正迅速普及。DCT-Net作为ModelScope平台上表现优异的图像风格迁移模型&#xff0c;能够将真实人像高效转换为高质…

君乐宝冲刺港股:9个月营收151亿净利9亿,刚派息10亿 红杉与春华是股东

雷递网 雷建平 1月19日君乐宝乳业集团股份有限公司&#xff08;简称&#xff1a;“君乐宝”&#xff09;日前递交招股书&#xff0c;准备在港交所上市。君乐宝此次赴港上市&#xff0c;募集资金将主要用于工厂建设和产能扩张升级、品牌营销和渠道建设、进一步加强研发创新、数智…

智能扫描仪部署教程:中小企业文档数字化入门指南

智能扫描仪部署教程&#xff1a;中小企业文档数字化入门指南 1. 引言 1.1 学习目标 本文旨在为中小企业IT人员或办公自动化初学者提供一套完整、可落地的文档数字化解决方案。通过本教程&#xff0c;您将掌握如何快速部署一个基于OpenCV的AI智能文档扫描系统&#xff0c;实现…

ComfyUI云端部署:基于容器化的一键启动解决方案

ComfyUI云端部署&#xff1a;基于容器化的一键启动解决方案 1. 引言 随着AI生成内容&#xff08;AIGC&#xff09;技术的快速发展&#xff0c;图像生成工具在设计、艺术创作和内容生产等领域扮演着越来越重要的角色。ComfyUI 作为一款基于节点式工作流的 Stable Diffusion 可…

BGE-Reranker-v2-m3优化实战:处理长尾查询的挑战

BGE-Reranker-v2-m3优化实战&#xff1a;处理长尾查询的挑战 1. 引言&#xff1a;RAG系统中的“搜不准”难题 在当前检索增强生成&#xff08;RAG&#xff09;系统的实际应用中&#xff0c;一个普遍存在的痛点是向量检索返回结果与用户真实意图不匹配&#xff0c;尤其是在面对…

YOLOv9/YOLOR多模型对比:基于YOLOR架构的性能评测

YOLOv9/YOLOR多模型对比&#xff1a;基于YOLOR架构的性能评测 1. 选型背景与评测目标 目标检测作为计算机视觉领域的核心任务之一&#xff0c;近年来随着YOLO系列模型的持续演进&#xff0c;其在工业界和学术界的影响力不断扩大。YOLOv9作为该系列的最新成员&#xff0c;提出…

图解说明UDS诊断协议通信流程图

深入理解UDS诊断协议&#xff1a;从会话控制到安全访问的实战解析在现代汽车电子系统中&#xff0c;ECU&#xff08;电子控制单元&#xff09;的数量早已突破百个。随着功能复杂度飙升&#xff0c;传统的OBD-II诊断标准已无法满足对深度故障读取、固件刷写和参数标定的需求。此…

别再人盯系统了!DevOps Agent自主值守,智能预见运维风险

re:Invent 2025&#xff0c;亚马逊云科技带来一系列重磅发布&#xff0c;掀起全球云计算创新浪潮。为帮助开发者们深入了解各项技术创新成果、上手使用最新功能&#xff0c;特推出本系列解读文章&#xff0c;助您探索云上未来的无限可能&#xff01;re:Invent 2025&#xff0c;…

语音工程师必备:FSMN-VAD快速搭建技巧

语音工程师必备&#xff1a;FSMN-VAD快速搭建技巧 1. 引言 1.1 语音端点检测的技术价值 在语音识别、语音唤醒和音频预处理等实际工程场景中&#xff0c;语音活动检测&#xff08;Voice Activity Detection, VAD&#xff09; 是不可或缺的前置环节。其核心任务是准确识别音频…

AutoGen Studio部署案例:企业知识管理系统构建教程

AutoGen Studio部署案例&#xff1a;企业知识管理系统构建教程 1. 引言 随着人工智能技术的快速发展&#xff0c;企业对智能化知识管理的需求日益增长。传统的知识库系统往往依赖人工维护和关键词检索&#xff0c;难以应对复杂查询、语义理解与自动化处理等挑战。基于多智能体…

Glyph开源价值解析:为何选择自主部署方案

Glyph开源价值解析&#xff1a;为何选择自主部署方案 1. 技术背景与问题提出 随着大语言模型在自然语言处理领域的广泛应用&#xff0c;长文本上下文建模成为提升模型推理能力的关键挑战。传统方法通过扩展基于token的上下文窗口来支持更长输入&#xff0c;但这种方式带来了显…