kgrag/kgbuild/entity_relation_text_extract.py
2026-07-29 18:10:19 +08:00

287 lines
14 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from openai import OpenAI
from typing import List, Dict
import json
from langchain_text_splitters import MarkdownHeaderTextSplitter, CharacterTextSplitter
import requests
import json
from modelsAPI.model_api import OpenaiAPI
Ontology = ["舰艇", "系统", "设备", "零部件", "故障", "修理", "维修项目","操作项目","保养"]
Relationships = ["包含", "组成", "解决", "用于", "使用","具有"]
# 节点类型及其属性定义
NODE_TYPES = {
"舰艇": ["名称","型号", "弦号", "设计单位", "总装工厂", "所属部队"],
"系统": ["名称", "技术责任单位", "生产单位", "级别"],
"设备": ["名称", "型号", "技术责任单位", "生产单位", "技术状态", "生产日期", "启用时间","运行时间","运行条件"],
"零部件": ["名称", "型号", "技术责任单位", "生产单位"],
"故障": ["故障现象名称", "故障原因", "故障影响", "故障类型", "发生时间", "处置情况", "修复情况"],
"修理": ["修理方案","修理人员", "修理时间", "修理工具", "备品备件", "修理类型", "维修项目"],
"维修项目": ["名称","维修项目编号", "组成编码", "维修设备名称", "维修间隔期", "维修级别", "页码", "安全防护要求", "安全注意事项","工具","备品备件","消耗材料","人力人员","修理步骤"],
"操作项目": ["名称", "操作项目编号", "安全防护", "注意事项","保障设施、保障设备(工具)", "人力人员", "操作步骤"],
"保养" : ["保养人员","保养时间","保养工具","保养频率"]
}
Ontology_DESCRIPTION = {
"舰艇": ["代表一艘完整海上作战或保障平台的实体,是所有系统、设备和零部件的最高层级载体。区别于“系统”或“设备”,舰艇具有独立的型号、弦号和部队归属,不可作为其他舰艇的组成部分。"],
"系统": ["舰艇中实现某一类功能(如动力、导航、通信)的集成化功能单元,由多个设备协同组成。与“设备”不同,系统本身不直接对应物理装置,而是逻辑/功能层面的集合;与“舰艇”不同,系统不具备独立航行能力或部队归属。"],
"设备": ["安装在舰艇上、具有独立型号和运行状态的物理装置,可被启停、监控运行时间,并可能产生故障。区别于“零部件”,设备是可独立更换或维修的功能单元;区别于“系统”,设备是具体硬件而非功能集合。"],
"零部件": ["构成设备的不可再拆分的基础物理元件(如轴承、电路板、密封圈),通常无独立运行状态或启用时间。与“设备”关键区别在于:零部件不能单独运行,也不记录运行时间或技术状态变更。"],
"故障": ["设备或系统在运行中出现的异常状态或失效事件,必须包含具体现象(如“无法启动”)、原因(如“电源短路”)及影响。区别于“修理”或“保养”,故障是问题本身,而非应对措施;不包含操作步骤或人员信息。"],
"修理": ["针对已发生故障所执行的一次性修复行为,包含具体时间、人员、工具、方案和所关联的维修项目。区别于“保养”,修理是响应式、非周期性的;区别于“维修项目”,修理是实际发生的实例,而非标准化规程。"],
"维修项目": ["标准化、可重复执行的维修任务规程,规定了某类设备或系统在特定条件下应如何维修,包含编号、步骤、材料、安全要求等。区别于“修理”,维修项目是模板或规范,而非具体事件;不包含实际发生时间或人员。"],
"操作项目": ["舰艇正常运行中需执行的标准操作流程(如启动主机、校准雷达),强调操作步骤与安全保障。区别于“维修项目”,操作使用项目用于日常使用而非维护"],
"保养" : ["按计划周期性执行的预防性维护活动(如润滑、清洁、检测),目的是延缓性能退化。"]
}
RELATIONSHIP_TYPES = {
"包含": ["舰艇包含系统", "系统包含设备","设备包含零部件","修理包含维修项目"],
"解决": ["修理解决故障", "维修项目解决故障"],
"使用": ["设备使用操作项目", "设备使用保养","设备使用维修项目"],
"具有": ["设备具有故障","零部件具有故障"]
}
def create_extraction_prompt(
text: str,
ontology: List[str],
Ontology_DESCRIPTION: Dict[str, List[str]],
relationships: List[str],
node_types: Dict[str, List[str]],
relationship_types: Dict[str, List[str]]
) -> str:
# 构建已有本体的定义(用于上下文)
ontology_def_descriptions = []
for etype in ontology:
clean_etype = etype.strip()
if clean_etype in Ontology_DESCRIPTION:
desc = "".join(Ontology_DESCRIPTION[clean_etype])
ontology_def_descriptions.append(f"- {clean_etype}{desc}")
else:
ontology_def_descriptions.append(f"- {clean_etype}:无明确定义")
prompt = f"""你是一个专业的舰艇维修领域实体抽取工程师。请基于以下文本片段,从对应本体之下抽取出实体、属性以及关系。
> ⚠️ 重要说明:
> - **本体Ontology Class是抽象概念类别**,是对特定领域中概念体系的形式化、结构化规范,用于明确定义该领域内的实体类型(类)。
> - 请基于本体的概念和范围,抽取出具体的实例(实体)。
> - 考虑当前本体已有的属性进行抽取,如果文本中出现该实体的属性,则进行抽取,如果没有则为“”。
> - **关系Relationship是实体之间的语义连接**,用于描述不同实体类型之间的关联方式和语义含义。
> - 请基于关系的定义,抽取出实体之间的具体关系实例。
### 已有本体类型(禁止重复推荐):
{chr(10).join(ontology_def_descriptions)}
### 已有关系类型(禁止重复推荐):
- {"".join(relationships)}
### 每个本体已知属性:
{node_types}
### 待分析文本:
{text.strip()}
3. 输出格式要求:
- 只输出纯JSON格式不要有任何其他文本或解释。
- 结构如下:
{{
"entities": [
{{
"type": "实体类型",
"name": "实体名称",
"properties": {{
"属性1": "值1或\"\"",
"属性2": "值2或\"\""
}}
}}
],
"relationships": [
{{
"type": "关系类型",
"from_entity": "起始实体名称",
"to_entity": "目标实体名称",
}}
]
}}
请确保:
- 实体类型来源本体其中一个,不要输出其他的实体类型
- 只输出纯JSON不要有其他内容
- 实体名称保持一致性(完全匹配文本中的名称)
- 只抽取文本中明确提到的信息
- 如果某个属性没有明确信息,属性值可以定义为"",但不能没有该属性
- 如果没有合适实体、关系,请不要进行抽取,直接返回[]
现在请分析文本并输出JSON结果
"""
prompt_v2 = f"""
请从以下维修领域文本中抽取实体和关系信息以及对应的属性值:
文本内容:"{text}"
【重要规则】
1. 实体识别:
- 必须识别以下类型的实体:
{', '.join(ontology)}
- 每个类型实体以及对应的描述如下:
{chr(10).join(ontology_def_descriptions)}
- 每个实体 **必须包含其类型对应的所有基础属性**(即使文本未提及,也需列出属性名,值可为"")。
- 基础属性定义如下:
{node_types}
2. 关系识别:
- 必须识别以下类型的关系:
{', '.join(relationships)}
3. 输出格式要求:
- 只输出纯JSON格式不要有任何其他文本或解释。
- 结构如下:
{{
"entities": [
{{
"type": "实体类型",
"name": "实体名称",
"properties": {{
"属性1": "值1或\"\"",
"属性2": "值2或\"\""
}}
}}
],
"relationships": [
{{
"type": "关系类型",
"from_entity": "起始实体名称",
"to_entity": "目标实体名称",
}}
]
}}
请确保:
- 只输出纯JSON不要有其他内容
- 实体名称保持一致性(完全匹配文本中的名称)
- 只抽取文本中明确提到的信息
- 属性值尽量从文本中提取,不要随意生成
- 如果某个属性没有明确信息,属性值可以定义为"",但不能没有该属性
现在请分析文本并输出JSON结果
"""
return prompt
example1 = '''
{
"new_entities": [
{
"name": "情境意识",
"definition": "操作人员对船舶环境、航行状态、水文气象及仪器读数等要素的实时感知与综合理解能力,是保障安全操作的认知基础。区别于已有本体:它不是物理实体(如设备)、功能事件(如故障)或操作规程(如操作项目),而是操作人员的主观认知状态。",
"suggested_attributes": ["认知等级", "更新时间", "环境因素"]
},
{
"name": "规则",
"definition": "由国际公约(如《国际海上避碰规则》)或公司制定的强制性操作规范,规定船舶在特定情境下必须遵守的安全行为准则。区别于已有本体:它不是内部执行流程(如操作项目),而是外部法规约束,具有法律效力和强制性。",
"suggested_attributes": ["规则编号", "发布机构", "生效日期", "适用范围"]
},
],
"new_relationships": [
{
"name": "遵守",
"description": "操作规程或行为必须符合规则的要求,体现强制性约束关系。区别于已有关系:它表示外部法规对内部操作的强制要求,而非功能关联或物理组成。",
"example": "操作项目 遵守 规则"
}
]
}
'''
def extract_text_entity_relationship(
text: str,
ontology: List[str],
Ontology_DESCRIPTION: Dict[str, List[str]],
relationships: List[str],
node_types: Dict[str, List[str]],
relationship_types: Dict[str, List[str]]
):
new_entities_result = []
new_relationships_result = []
for ins in text:
final_prompt = create_extraction_prompt(
text=ins,
ontology=ontology,
Ontology_DESCRIPTION=Ontology_DESCRIPTION,
relationships=relationships,
relationship_types=relationship_types,
node_types=node_types
)
# final_prompt = final_prompt.replace("example1",example1)
res_str = OpenaiAPI.openai_chat(final_prompt,timeout=180)
# 处理 API 调用失败
if res_str is None:
print("⚠️ 跳过当前 chunkAPI 调用失败")
continue
# 尝试解析 JSON
try:
res = json.loads(res_str)
except json.JSONDecodeError as e:
print(f"❌ JSON 解析失败: {e}")
print(f"原始响应内容: {repr(res_str)}")
continue
# 安全访问字段
entities = res.get("new_entities", [])
relationships = res.get("new_relationships", [])
print(entities,relationships)
return entities,relationships
if __name__ == "__main__":
text = """
# 1螺旋桨本体
功能与特性能量转换的核心。它将主机的旋转动能转化为水流的反作用力推力。其特性由材料如镍铝青铜、锰青铜、桨叶数3-6叶、盘面比、螺距比等决定直接影响效率、空泡和振动性能。
相互关系:直接安装在尾轴(螺旋桨轴) 末端,其扭矩由尾轴传递,其推力通过推力轴承传递给船体。
2轴系
功能与特性:动力传递的桥梁。包括:
推力轴及推力轴承:承受螺旋桨产生的巨大轴向推力,并将其传递给船体结构,是决定船舶能否前进、后退的关键。
中间轴:连接主机输出端与推力轴/尾轴。
尾轴(螺旋桨轴):穿过尾轴管,末端安装螺旋桨,工作环境恶劣(浸没海水中),通常需包覆铜套防腐。
相互关系:将主机的旋转输出与螺旋桨本体刚性连接,形成一个完整的动力传递链。推力轴承是轴系与船体结构之间的关键受力界面。
3尾轴管与密封系统功能与特性
尾轴管:固定于船体尾端,支撑尾轴并形成从船内(机舱)到船外(海水)的通道。
密封系统(首尾密封):绝对关键的安全设备。防止海水沿尾轴流入机舱(尾密封),同时防止润滑油泄漏(首尾密封均有此功能)。通常采用唇式密封或面式密封,材料耐磨、耐腐蚀。
相互关系:为尾轴提供支撑和润滑(油润滑或水润滑),其密封系统直接保护尾轴并确保机舱安全,与轴系和船体结构紧密集成。
4毂帽与导流罩功能与特性
毂帽:安装在螺旋桨毂后端,呈流线型,用于减少桨毂后部产生的涡流阻力,提高效率。
导流罩(如桨毂涡流消除器):安装在桨毂前方,改善流入桨叶的水流状态,尤其适用于肥大船型,能提升效率、减少振动。
相互关系:直接安装在螺旋桨本体的毂上,是其水动力性能的优化附件。
系统相互关系总结:
主机驱动轴系旋转,轴系末端的尾轴带动螺旋桨本体旋转。螺旋桨产生的推力通过尾轴传递至推力轴承,最终作用在船体上使其运动。尾轴管及密封系统为这一旋转运动提供支撑、润滑和至关重要的水密保障。毂帽和导流罩则作为螺旋桨本体的附件,优化其水动力性能。所有子设备协同工作的核心目标,是确保主机功率被高效、平稳、可靠地转化为推进船舶前进的有效推力。 任何一环失效(如密封泄漏、轴承损坏)都将导致整个推进系统瘫痪。
"""
extract_text_entity_relationship(text,ontology=Ontology,Ontology_DESCRIPTION=Ontology_DESCRIPTION,relationships=Relationships,relationship_types=RELATIONSHIP_TYPES,node_types=NODE_TYPES)