文本相似性对比python代码

这里写目录标题

背景

此文章用于对比两段文本的相似性对比,从编辑距离,词频余弦相似度,BERT 相似度(语义分析),本人因为业务需要,需要整个通用方法python代码离线部署,在ai很发达的今天,还有人坚持手搓代码写文章(主要是给自己打一个结点,方便自己回顾。)

源码

复制代码
# ============================
# Python 版 SpringBoot 服务
# 功能:3种文本相似度 API
# 支持:Postman调用 / Java调用 / 内网运行
# ============================
from fastapi import FastAPI
import uvicorn
import jieba
import os
import sys
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sentence_transformers import SentenceTransformer, util

# ===================== 🔥 这里是修复的核心 =====================
# 获取 exe 所在的真实路径
if getattr(sys, 'frozen', False):
    base_path = os.path.dirname(sys.executable)
else:
    base_path = os.path.dirname(__file__)

# 加载本地模型(绝对路径,不会报错)
model_path = os.path.join(base_path, "paraphrase-multilingual-MiniLM-L12-v2")
model = SentenceTransformer(model_path)
# ==============================================================

# ============== 1. 编辑距离 ==============
try:
    import Levenshtein
    def cal_edit_similarity(sent1, sent2):
        distance = Levenshtein.distance(sent1, sent2)
        max_len = max(len(sent1), len(sent2))
        return 1.0 if max_len == 0 else 1 - (distance / max_len)
except ImportError:
    def cal_edit_similarity(sent1, sent2):
        return "依赖未安装"

# ============== 2. 词频余弦相似度 ==============
def cal_tf_cosine_similarity(sent1, sent2):
    seg1 = " ".join(jieba.lcut(sent1))
    seg2 = " ".join(jieba.lcut(sent2))
    vec = CountVectorizer()
    tf_mat = vec.fit_transform([seg1, seg2])
    return cosine_similarity(tf_mat)[0][1]

# ============== 3. BERT 相似度 ==============
def cal_bert_similarity(sent1, sent2):
    emb1 = model.encode(sent1, convert_to_tensor=True)
    emb2 = model.encode(sent2, convert_to_tensor=True)
    return util.cos_sim(emb1, emb2).item()

# ============================
# 【核心】FastAPI 启动(SpringBoot 模式)
# ============================
app = FastAPI(title="文本相似度算法服务", version="1.0")

# 接口1:编辑距离
@app.post("/api/edit_distance")
def api_edit(sent1: str, sent2: str):
    return {
        "sent1": sent1,
        "sent2": sent2,
        "similarity": cal_edit_similarity(sent1, sent2)
    }

# 接口2:词频余弦
@app.post("/api/tf_cosine")
def api_cosine(sent1: str, sent2: str):
    return {
        "sent1": sent1,
        "sent2": sent2,
        "similarity": cal_tf_cosine_similarity(sent1, sent2)
    }

# 接口3:BERT 句向量
@app.post("/api/bert")
def api_bert(sent1: str, sent2: str):
    return {
        "sent1": sent1,
        "sent2": sent2,
        "similarity": cal_bert_similarity(sent1, sent2)
    }

# 接口4:一次性返回所有结果(最实用)
@app.post("/api/all_similarity")
def api_all(sent1: str, sent2: str):
    return {
        "sent1": sent1,
        "sent2": sent2,
        "edit_distance": cal_edit_similarity(sent1, sent2),
        "tf_cosine": cal_tf_cosine_similarity(sent1, sent2),
        "bert": cal_bert_similarity(sent1, sent2)
    }

# ============================
# 启动服务(和 SpringBoot 一样)
# ============================
if __name__ == "__main__":
    # 🔥 写法修正:直接传入 app 对象,而不是字符串
    uvicorn.run(
        app,  # 👈 这里改成直接传 app 实例
        host="0.0.0.0",
        port=8080,
        # 👈 绝对不要加 reload=True,生产模式必须关闭
    )

离线配置方法

C:\Users\Administrator.cache\huggingface\hub\models--sentence-transformers--paraphrase-multilingual-MiniLM-L12-v2\snapshots\e8f8c211226b894fcb81acc59f3b34ba3efd5f42

下的文件放到dist文件夹下

然后打包(windows打成exe可执行文件)

复制代码
pyinstaller --onefile fastapi1.py

离线环境双击exe ,即可以通过代码request进行调用。实现我们想要的效果。

总结

做这个的时候postman调用不通,当时换了个工具,离线以后可能因为有headers还是调不到,最后直接在java里边写了个main函数调用成功。

及时变通。别把自己逼到死角。

相关推荐
lie..几秒前
30天从零开始学AI应用开发(Day 3):30 分钟搭好开发环境,Python + VSCode 一次配齐
人工智能·python·大模型
benchmark_cc17 分钟前
策略临时需要一批股票的最新价格,先查行情还是先建股票池?——从量化策略执行逻辑看数据获取顺序
python·数据分析·pandas·量化交易·股票数据·quantdash
成为深度学习高手18 分钟前
XLinear:用一个轻量 MLP,带外生变量做长期时间序列预测
python·深度学习·时序数据库
事已至此先睡覺吧24 分钟前
第三篇:Java 流程控制详解:条件判断、循环与跳转语句
java·开发语言
啊吧怪不啊吧32 分钟前
LangChain之模型调用
python·langchain
m0_7345717634 分钟前
深入理解5g <二十> dmrs
开发语言·5g
溪语流沙34 分钟前
Django + Vue电商项目第001讲:开篇|注册登录加增删改查,那不是电商
redis·python·mysql·docker·typescript·django·vue
夜雪一千43 分钟前
如何使用BeautifulSoup库来提取HTML中的特定元素
python
IT毕设梦工厂1 小时前
计算机毕业设计选题推荐:基于大数据的城市空气污染物浓度数据分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·python·信息可视化·数据挖掘·数据分析·课程设计·数据可视化
程序员阿黄1 小时前
基于 Django 与 Vue 3 的智能实验室预约系统设计与实现
后端·python·mysql·django·vue·毕设