基于RexUniNLU的专利文本分析工具开发指南你是不是也遇到过这种情况面对海量的专利文档想快速找到核心技术要点、分析竞争对手布局或者评估自己技术的创新性结果却淹没在成堆的PDF和晦涩的法律术语里效率低得让人头疼。我之前在做一个技术调研项目时需要分析上百份相关专利。手动阅读、摘录、对比花了一周多时间眼睛都快看花了最后整理出的信息还可能有遗漏。当时就想要是能有个工具自动帮我完成这些重复性工作该多好。后来接触到了RexUniNLU这个模型发现它简直就是为这类任务量身定做的。今天我就来分享如何基于这个模型从零开始搭建一个实用的专利文本分析工具。这个工具能帮你自动提取专利中的技术实体、发现专利间的相似性大幅提升专利调研的效率。1. 为什么选择RexUniNLU来做专利分析在开始动手之前咱们先聊聊为什么选这个模型。专利文本分析有几个特殊的地方对模型的要求比较高。专利文档通常很长技术术语密集而且结构相对固定背景技术、发明内容、具体实施方式等。传统的文本分析方法要么需要大量标注数据来训练要么只能做很简单的关键词匹配效果往往不尽如人意。RexUniNLU有几个特点特别适合这个场景零样本或少样本就能用这意味着你不需要准备大量的标注数据来训练模型。对于专利分析这种专业领域标注数据既难获取又成本高昂这个特性简直是救星。一个模型搞定多种任务它能同时做命名实体识别、关系抽取、文本分类、文本匹配等好几种任务。在专利分析里我们正好需要提取技术术语实体识别、分析技术关系关系抽取、判断专利类别文本分类、发现相似专利文本匹配一个模型全包了省心。对中文支持友好虽然很多专利有英文版本但中文专利的数量庞大而且很多国内企业的核心专利都是中文的。这个模型在中文任务上表现不错用起来更顺手。速度还挺快根据官方介绍相比之前的方案推理速度提升了30%左右。当你需要处理成百上千份专利时这个提升带来的时间节省就很可观了。简单来说用RexUniNLU来构建专利分析工具就像请了一个不知疲倦、还特别擅长看技术文档的助手能帮你把最耗时的那部分工作自动化掉。2. 环境准备与模型部署好了理论说完了咱们开始动手。第一步是把环境搭起来。2.1 基础环境配置我建议用Python 3.8或更高版本这个兼容性比较好。先创建一个干净的虚拟环境避免包冲突# 创建虚拟环境 python -m venv patent_analysis_env # 激活环境Linux/Mac source patent_analysis_env/bin/activate # 激活环境Windows patent_analysis_env\Scripts\activate然后安装必要的依赖包。这里要注意版本兼容性我用的组合是pip install modelscope1.10.0 pip install transformers4.30.0 pip install torch2.0.0 # 如果有GPU可以安装对应的CUDA版本 pip install pandas1.5.0 pip install numpy1.21.0如果你在安装过程中遇到问题可能是网络原因可以试试国内的镜像源pip install modelscope1.10.0 -i https://mirrors.aliyun.com/pypi/simple/2.2 快速加载RexUniNLU模型环境准备好后加载模型其实很简单。ModelScope已经把很多复杂的工作封装好了我们几行代码就能用起来from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks # 创建专利分析管道 patent_analyzer pipeline( taskTasks.siamese_uie, # 使用孪生通用信息抽取任务 modeliic/nlp_deberta_rex-uninlu_chinese-base, model_revisionv1.0.0 ) print(模型加载成功可以开始分析专利了。)第一次运行时会自动下载模型文件大概有几百兆需要一点时间。下载完成后模型就缓存在本地了下次使用会快很多。如果你在公司的内网环境或者下载速度比较慢也可以先手动下载模型文件然后指定本地路径from modelscope import snapshot_download # 先下载模型到本地 model_dir snapshot_download(iic/nlp_deberta_rex-uninlu_chinese-base) # 然后从本地加载 patent_analyzer pipeline( taskTasks.siamese_uie, modelmodel_dir # 使用本地路径 )3. 专利文本的核心信息提取模型准备好了现在来看看怎么用它来提取专利里的关键信息。专利文档虽然长但我们真正关心的核心信息就那么几类。3.1 提取技术实体和术语专利中最有价值的信息之一就是技术实体——那些具体的发明点、技术组件、材料、工艺等。用RexUniNLU提取这些信息特别方便def extract_technical_entities(patent_text): 从专利文本中提取技术相关的实体 # 定义我们关心的实体类型 schema { 技术术语: None, # 核心技术概念 材料成分: None, # 使用的材料 工艺方法: None, # 制造或处理方法 设备装置: None, # 涉及的设备 性能参数: None # 技术参数和指标 } # 调用模型进行实体识别 result patent_analyzer( inputpatent_text, schemaschema ) return result # 示例分析一段专利文本 sample_patent 本发明涉及一种锂离子电池正极材料具体为一种钴酸锂/石墨烯复合材料的制备方法。 该材料包括钴酸锂颗粒和石墨烯片层其中石墨烯的质量分数为1-5%。 制备方法包括将钴盐和锂盐按化学计量比混合加入石墨烯分散液经水热反应、干燥、煅烧得到最终产物。 该复合材料在2C倍率下的放电比容量达到165mAh/g循环500次后容量保持率大于90%。 entities extract_technical_entities(sample_patent) print(提取到的技术实体) for entity_type, entity_list in entities.items(): if entity_list: # 只显示有提取结果的类型 print(f{entity_type}: {entity_list})运行这个例子你会看到模型自动识别出了锂离子电池正极材料、钴酸锂/石墨烯复合材料等技术术语钴酸锂颗粒、石墨烯片层等材料成分水热反应、干燥、煅烧等工艺方法。3.2 识别技术关系光知道有哪些技术点还不够我们还需要知道它们之间的关系。比如哪种材料用在哪个部件上什么工艺产生了什么效果def extract_technical_relations(patent_text): 提取专利中的技术关系 schema { 材料: { 应用于(部件): None, 改善(性能): None, 替代(材料): None }, 工艺: { 用于制备(产品): None, 影响(性能): None, 包含步骤(步骤): None }, 设备: { 用于(工艺): None, 包含部件(部件): None } } result patent_analyzer(inputpatent_text, schemaschema) return result # 继续使用上面的专利文本示例 relations extract_technical_relations(sample_patent) print(\n提取到的技术关系) for main_entity, relation_dict in relations.items(): for relation_type, relation_values in relation_dict.items(): if relation_values: print(f{main_entity} - {relation_type}: {relation_values})通过关系抽取我们能更清晰地理解专利的技术逻辑。比如从上面的例子中模型可能会识别出石墨烯应用于正极材料水热反应用于制备复合材料复合材料改善放电比容量等关系。3.3 分析发明点和创新性每个专利的核心就是它的发明点。我们可以让模型帮我们总结专利的创新之处def analyze_invention_points(patent_text): 分析专利的发明点和创新性 # 这里我们让模型从文本中找出发明内容相关的描述 schema { 技术问题: None, # 要解决的技术问题 技术方案: None, # 提出的解决方案 有益效果: None, # 达到的技术效果 创新点: None # 相对于现有技术的创新 } result patent_analyzer(inputpatent_text, schemaschema) return result # 实际使用中你可以传入完整的专利文本 invention_analysis analyze_invention_points(sample_patent) print(\n发明点分析) for point_type, points in invention_analysis.items(): if points: print(f{point_type}:) for point in points: print(f - {point})这个功能特别有用当你需要快速评估一份专利的价值时不用通读全文直接看提取出的发明点和创新性分析就够了。4. 构建专利相似性分析系统单个专利的分析只是第一步真正的价值在于对比和分析多个专利之间的关系。下面我们来构建一个专利相似性分析系统。4.1 专利文本向量化要比较专利之间的相似性首先需要把文本转换成向量。RexUniNLU本身虽然不直接输出向量但我们可以用它的中间表示或者结合其他方法import numpy as np from sklearn.metrics.pairwise import cosine_similarity class PatentSimilarityAnalyzer: def __init__(self): self.patent_vectors {} # 存储专利向量 self.patent_texts {} # 存储专利原文 def add_patent(self, patent_id, patent_text): 添加专利到分析系统 self.patent_texts[patent_id] patent_text # 这里简化处理实际可以使用更复杂的特征提取 # 比如提取关键实体作为特征 entities extract_technical_entities(patent_text) # 构建特征向量简化示例 # 实际应用中可以使用更复杂的文本表示方法 feature_vector self._text_to_vector(patent_text, entities) self.patent_vectors[patent_id] feature_vector def _text_to_vector(self, text, entities): 将文本转换为向量表示简化版 实际项目中可以考虑使用sentence-transformers等专门模型 # 这里使用简单的词频统计作为示例 # 实际应用中建议使用更先进的文本表示方法 from collections import Counter import jieba # 提取技术术语作为关键词 tech_terms [] if 技术术语 in entities: tech_terms [term[text] for term in entities[技术术语]] # 结合全文分词 words list(jieba.cut(text)) tech_terms word_freq Counter(words) # 转换为固定维度向量简化处理 # 实际应该使用更合理的方法 vector np.zeros(100) # 假设100维 for i, (word, freq) in enumerate(list(word_freq.items())[:100]): vector[i] freq return vector def find_similar_patents(self, target_patent_id, top_k5): 查找与目标专利最相似的专利 if target_patent_id not in self.patent_vectors: return [] target_vector self.patent_vectors[target_patent_id] similarities [] for pid, vector in self.patent_vectors.items(): if pid target_patent_id: continue # 计算余弦相似度 sim cosine_similarity( target_vector.reshape(1, -1), vector.reshape(1, -1) )[0][0] similarities.append((pid, sim)) # 按相似度排序 similarities.sort(keylambda x: x[1], reverseTrue) return similarities[:top_k]4.2 基于技术要点的相似性匹配除了全文相似性我们更关心技术要点的相似性。比如两个专利可能解决的是同一个技术问题或者使用了相似的技术方案def compare_technical_similarity(patent1_text, patent2_text): 比较两个专利的技术相似性 # 提取两个专利的技术要点 patent1_tech extract_technical_entities(patent1_text) patent2_tech extract_technical_entities(patent2_text) # 提取发明点 patent1_invention analyze_invention_points(patent1_text) patent2_invention analyze_invention_points(patent2_text) similarity_score 0 similar_points [] # 比较技术术语的重合度 tech_terms1 set([t[text] for t in patent1_tech.get(技术术语, [])]) tech_terms2 set([t[text] for t in patent2_tech.get(技术术语, [])]) common_terms tech_terms1.intersection(tech_terms2) if tech_terms1 or tech_terms2: term_similarity len(common_terms) / max(len(tech_terms1), len(tech_terms2)) similarity_score term_similarity * 0.4 if common_terms: similar_points.append(f共享技术术语: {, .join(list(common_terms)[:5])}) # 比较技术问题 problems1 set([p[text] for p in patent1_invention.get(技术问题, [])]) problems2 set([p[text] for p in patent2_invention.get(技术问题, [])]) common_problems problems1.intersection(problems2) if problems1 or problems2: problem_similarity len(common_problems) / max(len(problems1), len(problems2)) similarity_score problem_similarity * 0.3 if common_problems: similar_points.append(f相似技术问题: {, .join(list(common_problems)[:3])}) # 比较技术方案 solutions1 set([s[text] for s in patent1_invention.get(技术方案, [])]) solutions2 set([s[text] for s in patent2_invention.get(技术方案, [])]) common_solutions solutions1.intersection(solutions2) if solutions1 or solutions2: solution_similarity len(common_solutions) / max(len(solutions1), len(solutions2)) similarity_score solution_similarity * 0.3 if common_solutions: similar_points.append(f相似技术方案: {, .join(list(common_solutions)[:3])}) return { similarity_score: similarity_score, similar_points: similar_points, details: { common_terms: list(common_terms), common_problems: list(common_problems), common_solutions: list(common_solutions) } }4.3 构建专利知识图谱当分析大量专利时我们可以构建一个专利知识图谱直观地展示技术发展趋势和专利布局import networkx as nx import matplotlib.pyplot as plt class PatentKnowledgeGraph: def __init__(self): self.graph nx.Graph() def add_patent(self, patent_id, patent_text): 将专利添加到知识图谱 # 提取技术实体 entities extract_technical_entities(patent_text) # 添加专利节点 self.graph.add_node(patent_id, typepatent, textpatent_text[:100]) # 添加技术实体节点和关系 for entity_type, entity_list in entities.items(): for entity in entity_list: entity_text entity[text] entity_node_id f{entity_type}:{entity_text} # 添加实体节点 self.graph.add_node(entity_node_id, typeentity, entity_typeentity_type) # 添加专利-实体关系 self.graph.add_edge(patent_id, entity_node_id, relationcontains) def find_related_patents(self, target_entity): 查找包含特定技术实体的所有专利 related_patents [] for node in self.graph.nodes(): if self.graph.nodes[node].get(type) patent: # 检查该专利是否连接到目标实体 for neighbor in self.graph.neighbors(node): if target_entity in neighbor: related_patents.append(node) break return related_patents def visualize(self, output_filepatent_graph.png): 可视化知识图谱 plt.figure(figsize(12, 8)) # 设置节点颜色 node_colors [] for node in self.graph.nodes(): node_type self.graph.nodes[node].get(type, ) if node_type patent: node_colors.append(lightblue) else: node_colors.append(lightgreen) # 绘制图形 pos nx.spring_layout(self.graph, k0.5, iterations50) nx.draw(self.graph, pos, with_labelsTrue, node_colornode_colors, node_size800, font_size8, edge_colorgray) plt.title(专利技术知识图谱) plt.savefig(output_file, dpi300, bbox_inchestight) plt.show() print(f知识图谱已保存到 {output_file})5. 实际应用案例专利调研分析系统现在我们把上面的功能整合起来构建一个完整的专利调研分析系统。这个系统可以帮企业或研究机构快速了解某个技术领域的专利布局情况。5.1 系统架构设计class PatentAnalysisSystem: def __init__(self): self.analyzer patent_analyzer # 之前加载的模型 self.patent_db {} # 专利数据库 self.similarity_analyzer PatentSimilarityAnalyzer() self.knowledge_graph PatentKnowledgeGraph() def import_patents(self, patent_dict): 批量导入专利 patent_dict: {专利ID: 专利文本} for patent_id, text in patent_dict.items(): self.patent_db[patent_id] text self.similarity_analyzer.add_patent(patent_id, text) self.knowledge_graph.add_patent(patent_id, text) print(f成功导入 {len(patent_dict)} 份专利) def analyze_patent(self, patent_id): 分析单个专利 if patent_id not in self.patent_db: return None text self.patent_db[patent_id] analysis_result { patent_id: patent_id, technical_entities: extract_technical_entities(text), technical_relations: extract_technical_relations(text), invention_points: analyze_invention_points(text), similar_patents: self.similarity_analyzer.find_similar_patents(patent_id) } return analysis_result def technology_trend_analysis(self, technology_keyword): 分析特定技术的发展趋势 related_patents self.knowledge_graph.find_related_patents(technology_keyword) if not related_patents: return {message: f未找到包含{technology_keyword}的专利} trend_data [] for patent_id in related_patents[:10]: # 取前10个相关专利分析 analysis self.analyze_patent(patent_id) if analysis: trend_data.append({ patent_id: patent_id, invention_points: analysis[invention_points].get(创新点, []), technical_entities: analysis[technical_entities].get(技术术语, []) }) return { technology: technology_keyword, related_patent_count: len(related_patents), trend_analysis: trend_data } def competitor_analysis(self, competitor_keywords): 竞争对手专利分析 # 这里可以根据专利中的申请人信息进行筛选 # 实际应用中需要更复杂的文本匹配逻辑 competitor_patents {} for patent_id, text in self.patent_db.items(): for keyword in competitor_keywords: if keyword in text: if keyword not in competitor_patents: competitor_patents[keyword] [] competitor_patents[keyword].append(patent_id) analysis_results {} for competitor, patents in competitor_patents.items(): tech_focus {} for patent_id in patents[:5]: # 分析每个竞争对手的前5个专利 entities extract_technical_entities(self.patent_db[patent_id]) for entity_type, entity_list in entities.items(): if entity_type not in tech_focus: tech_focus[entity_type] [] tech_focus[entity_type].extend([e[text] for e in entity_list]) # 统计技术热点 tech_focus_summary {} for entity_type, entities in tech_focus.items(): from collections import Counter counter Counter(entities) tech_focus_summary[entity_type] counter.most_common(5) analysis_results[competitor] { patent_count: len(patents), tech_focus: tech_focus_summary } return analysis_results5.2 使用示例让我们看一个完整的使用示例# 初始化系统 system PatentAnalysisSystem() # 模拟导入一些专利数据实际应用中可以从数据库或文件读取 sample_patents { CN202310001: 一种基于深度学习的图像识别方法通过卷积神经网络提取特征..., CN202310002: 锂电池正极材料的制备工艺采用水热法合成钴酸锂复合材料..., CN202310003: 新能源汽车电池管理系统实时监控电池状态并优化充放电策略..., CN202310004: 石墨烯增强的复合材料及其在电池中的应用提高导电性和稳定性..., CN202310005: 智能图像识别系统结合CNN和Transformer模型提升识别准确率... } system.import_patents(sample_patents) # 分析单个专利 print( 分析单个专利 ) analysis system.analyze_patent(CN202310001) if analysis: print(f专利ID: {analysis[patent_id]}) print(f技术实体数量: {len(analysis[technical_entities].get(技术术语, []))}) print(f相似专利: {[pid for pid, _ in analysis[similar_patents]]}) # 技术趋势分析 print(\n 技术趋势分析 ) trend system.technology_trend_analysis(电池) print(f与电池相关的专利数量: {trend[related_patent_count]}) # 生成知识图谱可视化 print(\n 生成知识图谱 ) system.knowledge_graph.visualize(patent_tech_graph.png)6. 优化建议和实用技巧在实际使用过程中我总结了一些优化建议能让这个工具用起来更顺手预处理很重要专利文本通常包含很多表格、公式、参考文献等非正文内容。在使用前最好先做一下文本清洗去掉这些干扰信息只保留核心的技术描述部分。分块处理长文本RexUniNLU对输入长度有限制通常是512个token。对于很长的专利文档可以按章节分块处理比如分别处理背景技术、发明内容、具体实施方式等部分然后把结果合并。结合领域词典虽然模型是零样本的但如果你有特定领域的术语词典可以在schema设计时加入这些先验知识这样提取结果会更准确。结果后处理模型提取的结果可能会有一些重复或相近的实体可以加一个简单的后处理步骤比如合并相似的实体、去重等。缓存机制如果你要分析大量专利建议把中间结果缓存起来避免重复计算。特别是向量化和相似性计算这些比较耗时的操作。可视化展示除了技术分析好的可视化能让结果更直观。可以考虑用图表展示技术发展趋势、用网络图展示专利关系、用词云展示技术热点等。7. 总结用RexUniNLU构建专利分析工具最直接的感受就是省时省力。以前需要人工阅读理解的很多工作现在都能自动化完成了。虽然模型不是百分之百准确但对于初步的专利筛选、技术调研、竞品分析这些场景已经能提供很有价值的参考。这个工具特别适合企业的知识产权部门、研发团队或者投资机构的行业研究员使用。你可以用它快速了解一个技术领域的专利布局发现技术空白点评估技术的创新性或者监控竞争对手的技术动向。实际用下来最大的挑战可能在于如何设计合适的schema来提取你想要的信息。这需要你对专利文档的结构和业务需求都有一定的理解。不过一旦schema设计好了后面就是批量处理的事情了效率提升非常明显。如果你刚开始接触建议从小规模开始先处理几十份专利看看效果如何再逐步扩大规模。过程中可能会遇到一些具体问题比如某些专业术语识别不准、长文档处理效率等这些都可以通过调整schema、优化预处理等方式来改善。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。