import gradio as gr import torch import numpy as np from transformers import BertTokenizer, BertModel # 1. 核心引擎加载:强制使用慢速分词模式以兼容专利模型 model_name = "anferico/bert-for-patents" print("正在加载专利专用分词器...") tokenizer = BertTokenizer.from_pretrained( model_name, use_fast=False, local_files_only=False ) print("正在加载 BERT 专利模型主体 (0.3B)...") model = BertModel.from_pretrained(model_name) model.eval() # 设置为评估模式 def get_embedding(text): if not text.strip(): return [0] * 1024 try: # 将文本转化为 1024 维的专利语义向量 inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True, max_length=512) with torch.no_grad(): outputs = model(**inputs) # 取最后一层隐藏状态的平均值作为特征向量 (Mean Pooling) embeddings = outputs.last_hidden_state.mean(dim=1).squeeze().numpy() return embeddings.tolist() except Exception as e: return f"向量化错误: {str(e)}" def compute_similarity(text1, text2): if not text1.strip() or not text2.strip(): return "请输入完整的对比文本" try: v1 = np.array(get_embedding(text1)) v2 = np.array(get_embedding(text2)) # 计算余弦相似度 similarity = np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)) return f"{similarity:.4f}" except Exception as e: return f"计算失败: {str(e)}" # 2. OpenIPOS 旗舰版界面装修 with gr.Blocks(theme=gr.themes.Soft()) as demo: gr.HTML("""
基于谷歌 BERT-for-Patents 的专业语义标尺 (0.3B)