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

468 lines
23 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}:无明确定义")
# 构建关系示例
rel_examples = []
for rtype, examples in relationship_types.items():
for ex in examples[:1]:
rel_examples.append(f" - {ex}")
prompt = f"""你是一个专业的舰艇维修领域本体工程师。请基于以下文本片段,**识别潜在的、尚未定义的抽象概念类别(即本体类型)和语义关系类型**。
> ⚠️ 重要说明:
> - **本体Ontology Class是抽象概念类别**,是对特定领域中概念体系的形式化、结构化规范,用于明确定义该领域内的实体类型(类)。
> - 请**不要推荐具体实体或实例名称**,只推荐**可作为一类事物统称的新概念**。
> - 如果文本中的内容**可归入已有本体**(见下文列表),则**不要**将其视为新本体。
> - 抽取本体在文本中应该具有代表性,而不是简单的一个名词,能够代表一类事物,抽取出很多实体和对应的属性
### 已有本体类型(禁止重复推荐):
{chr(10).join(ontology_def_descriptions)}
### 已有关系类型(禁止重复推荐):
- {"".join(relationships)}
典型用法示例:
{chr(10).join(rel_examples)}
### 待分析文本:
{text.strip()}
### 你的任务:
1. **推荐新的本体类型(抽象概念)**
仅当文本中隐含一个**尚未被现有本体覆盖的通用类别**时才提出。例如:
- 文本存在"主要功能"这种章节,当前本体没有,可推荐"功能"
- 文本提到“子系统”,而当前本体已存在"系统",因此不合适。
每个新本体需包含:
- `name`:中文名称(抽象名词,非专有名词);
- `definition`:清晰定义其内涵、作用及与已有本体的区别;
- `suggested_attributes`:建议的通用属性(如编号、时间、状态等,非具体值)。
2. **推荐新的关系类型**
仅当存在**未被现有关系表达的语义连接**时提出。例如:“依赖于”“触发”“源自”等。
每个新关系需包含:
- `name`:动词性短语(如“依赖于”);
- `description`:语义解释;
- `example`:格式为 “[本体A] [关系] [本体B]”,如 “维修项目 依赖于 备品备件”。
3. **推荐已有本体的属性**
如果文本中提及的属性适用于已有本体类型,请直接在已有本体的定义中补充建议属性,无需在新本体中重复。
- `name`:属性名称;
- `applicable_to`:适用的已有本体类型列表。
4. **输出严格为 JSON 格式**,无任何额外文本:
{{
"new_entities": [
{{
"name": "新抽象本体名称",
"definition": "该本体在舰艇维修领域的定义与边界",
"suggested_attributes": ["属性1", "属性2"]
}}
],
"new_relationships": [
{{
"name": "新关系名称",
"description": "关系语义说明",
"example": "X 关系名 Y"
}}
],
"existing_entity_attributes": [
{{
"name": "属性名称",
"applicable_to": "已有本体"]
}}
]
}}
注意:
- 若无新概念,对应字段返回空列表 []。
- 禁止输出具体实例如“SC-887”“2024年检修”
- 定义需体现**抽象性、通用性、可复用性**。
- 不要生成一些实体,如果没有就不要推荐
示例1
输入文本为:
# 1.1 警告
【最高级别警告】情境意识:始终保持对船舶位置、周围交通、水文气象、船舶状态和仪器读数的全面了解。自满是最大的危险。
【最高级别警告】有效沟通:船-岸、驾驶台-机舱、驾驶台内部、舵手-引航员之间的沟通必须清晰、无误、复诵确认。语言障碍是重大事故根源。
【警告】严格遵守规则:必须严格遵守《国际海上避碰规则》、《国际海上人命安全公约》、《港口特殊规定》及公司安全管理体系。
【警告】疲劳管理:严禁在过度疲劳状态下值班或操作。合理安排休息,必要时立即报告。
思考过程:
首先,我需要仔细分析给定的文本片段,识别潜在的、尚未定义的抽象概念类别(本体类型)和语义关系类型。文本是关于舰艇操作中的警告和规则,内容涉及情境意识、有效沟通、遵守规则、疲劳管理等。
"情境意识":这是一个抽象概念,指操作人员对环境的全面了解。在已有本体中,没有直接对应的概念。舰艇、系统、设备等都是物理或功能实体,而"情境意识"是操作人员的认知状态。它不是故障、修理或维修项目;它更像是一个操作要求或状态。已有本体中,"操作项目"是标准操作流程,但"情境意识"不是流程,而是一种意识状态。所以,可能需要一个新的本体。
定义:情境意识应定义为一种认知状态,涉及操作人员对环境、船舶状态和相关因素的持续感知和理解。区别于已有本体:它不是实体(如设备),也不是事件(如故障),而是操作人员的心理状态。
属性:可能包括状态(如良好、中等、差)、时间(如更新时间)、影响因素(如天气条件)。
"严格遵守规则":提到规则如《国际海上避碰规则》。规则是具体的文档。已有本体中,没有"规则"作为类别。"维修项目"是维修规程,但这里是操作规则。
文本说"遵守《国际海上避碰规则》",所以"规则"是一个概念。但"规则"在本体中可能太泛;在舰艇领域,"规则"可以指安全规则或操作规则。
现有本体有"操作项目",是标准操作流程,但规则是更广泛的法规。所以,可能需要"规则"作为新本体。
定义:规则是强制性的操作规范,由国际公约或公司制定,用于指导船舶操作以确保安全。
情境意识:可能是一个新本体。
规则:如《国际海上避碰规则》,可能需要"安全规则"
我需要确保这些是尚未定义的抽象概念。
检查已有本体:
舰艇:不相关。
系统:不相关。
设备:不相关。
零部件:不相关。
故障:不相关。
修理:不相关。
维修项目:维修规程,不相关。
操作项目:标准操作流程,如"启动主机",但"情境意识"不是流程,是状态。
保养:预防性维护,不相关。
所以,"情境意识"似乎是一个新本体。
类似地,"规则":已有"操作项目"是操作规程,但规则是法规,如避碰规则。
现在,定义新本体:
情境意识:
name: "情境意识"
definition: 操作人员对船舶环境、状态和相关因素的实时感知和理解能力,是确保安全操作的认知基础。区别于已有本体:它不是物理实体、事件或规程,而是操作人员的心理状态。
suggested_attributes: ["状态", "更新时间", "影响因素"]
安全规则:
name: "规则"
definition: 由国际公约或公司制定的强制性操作规范,用于指导船舶在特定情境下的安全行为,确保符合法规要求。区别于"操作项目":安全规则是外部约束,而操作项目是内部执行的流程。
suggested_attributes: ["编号", "发布机构", "生效日期", "适用范围"]
列出潜在新本体:
情境意识:文本直接使用,未在本体中。
安全规则:文本提到具体规则,未被覆盖。
现在,关于关系类型。
文本中,有"必须严格遵守规则",所以"遵守"可能是一个关系。
但已有关系有"用于""使用""遵守"可能是一个新关系。
已有关系:包含、组成、解决、用于、使用、具有。
"遵守"不在其中。
所以,可能需要新关系"遵守"
例如,"操作项目 遵守 规则"
但关系是语义连接。
检查是否有未被表达的关系。
例如:
情境意识 影响 操作安全
"影响"可能不标准。
文本中,"情境意识"是警告内容,所以它可能被"要求""强调"
但关系类型需要是动词性。
可能的关系:
"要求":如"警告 要求 情境意识"
"警告"不是本体;文本中"警告"是类别。
在文本中,有"【最高级别警告】",但"警告"本身可能不是本体;它是一个事件。
在已有本体,没有"警告"。但任务是基于文本,文本中"警告"是作为标签。
然而,在本体工程中,"警告"可能被视为一种事件或规则。
但已有本体有"故障",但警告不是故障。
或许"警告"可以是新本体,但文本中是"【最高级别警告】",是内容,不是类别。
文本是警告内容,所以"情境意识"是内容。
我认为"情境意识""安全规则""疲劳状态"是候选。
现在,精简。
情境意识:必须推荐,因为它直接出现。
安全规则:规则如《国际海上避碰规则》,需要类别。
疲劳状态:疲劳是状态。
"疲劳管理"是活动,不是状态。文本说"疲劳管理:严禁在过度疲劳状态下值班",所以"疲劳状态"是核心。
在本体中,状态可以是属性。
"疲劳状态"作为本体。
现在,检查是否已有。
在已有列表,没有"状态"本体;"故障"有状态,但故障是事件。
"故障"有状态,但"疲劳状态"是人员状态。
所以,应该新。
类似地,"情境意识"是状态。
或许可以合并,但最好分开。
定义:
情境意识:
name: "情境意识"
definition: 操作人员对船舶环境、航行状态和相关因素的实时感知与理解能力,是安全操作的关键认知要素。区别于已有本体:它不是物理实体、功能单元或事件,而是操作人员的主观认知状态。
suggested_attributes: ["认知等级", "更新时间", "环境因素"]
安全规则:
name: "规则"
definition: 由国际组织或公司制定的强制性操作规范,规定船舶在特定情境下必须遵守的安全行为准则。区别于"操作项目":安全规则是外部法规约束,而操作项目是内部执行的标准化流程。
suggested_attributes: ["规则编号", "发布机构", "生效日期", "适用场景"]
疲劳状态:
现在,关系类型。
文本中,有"必须严格遵守规则",所以关系"遵守"
已有关系中没有"遵守"
所以,新关系"遵守"
name: "遵守"
description: 操作或规程必须符合安全规则的要求,表示强制性遵循。
example: "操作项目 遵守 安全规则"
其他可能关系:如"影响",但"情境意识"影响操作,但"影响"可能太泛。
suggested_attributes:
情境意识: ["认知等级", "更新时间", "环境因素"]
规则: ["规则编号", "发布机构", "生效日期", "适用范围"]
关系:
name: "遵守"
description: 操作规程或行为必须符合安全规则的要求,体现强制性约束。
example: "操作项目 遵守 规则"
所以输出为:
example1
示例2
输入为:
# 2 概述
本文档介绍了螺旋桨主要功能、组成、维修工作指导、器材保障等内容。
舰船螺旋桨推进器是将主机动力转化为推力的核心装置。它通常由多个常见3-6叶桨叶组成叶片复杂的曲面设计能高效搅动水流。
主要分为两大类固定螺距螺旋桨FPP 结构简单坚固可调螺距螺旋桨CPP可通过转动桨叶改变螺距无需改变主机转速即可调节推力大小和方向机动性更优。
现代大型船舶螺旋桨多为特种铜合金铸造,直径可达 10 米以上。其设计、制造和安装精度要求极高,直接影响船舶的推进效率、振动和噪音水平。
思考过程:
首先,我需要仔细分析给定的文本片段,识别潜在的、尚未定义的抽象概念类别(本体类型)和语义关系类型。文本是螺旋桨主要功能、组成、维修工作指导、器材保障等内容。后面详细阐述舰船螺旋桨(推进器)
的组成部分,以及主要分为两大类。结合已有的本体,该类内容主要属于系统、设备、零部件等本体,因此没有新本体衍生。
所以输出为:
[]
"""
return prompt
example1 = '''
{
"new_entities": [
{
"name": "情境意识",
"definition": "操作人员对船舶环境、航行状态、水文气象及仪器读数等要素的实时感知与综合理解能力,是保障安全操作的认知基础。区别于已有本体:它不是物理实体(如设备)、功能事件(如故障)或操作规程(如操作项目),而是操作人员的主观认知状态。",
"suggested_attributes": ["认知等级", "更新时间", "环境因素"]
},
{
"name": "规则",
"definition": "由国际公约(如《国际海上避碰规则》)或公司制定的强制性操作规范,规定船舶在特定情境下必须遵守的安全行为准则。区别于已有本体:它不是内部执行流程(如操作项目),而是外部法规约束,具有法律效力和强制性。",
"suggested_attributes": ["规则编号", "发布机构", "生效日期", "适用范围"]
},
],
"new_relationships": [
{
"name": "遵守",
"description": "操作规程或行为必须符合规则的要求,体现强制性约束关系。区别于已有关系:它表示外部法规对内部操作的强制要求,而非功能关联或物理组成。",
"example": "操作项目 遵守 规则"
}
]
}
'''
def generate_Ontology_relationship(
text: List[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)
# 处理 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
# 安全访问字段
new_entities = res.get("new_entities", [])
new_relationships = res.get("new_relationships", [])
nwe_entity_attributes = res.get("existing_entity_attributes", [])
print(f"推荐新本体:{new_entities}")
print(f"推荐新关系:{new_relationships}")
print(f"推荐新属性:{nwe_entity_attributes}")
new_entities_result.append(new_entities)
new_relationships_result.append(new_relationships)
# 可选:最后汇总输出
print("\n=== 最终结果 ===")
print("所有新本体:", new_entities_result)
print("所有新关系:", new_relationships_result)
print("所有新属性:", nwe_entity_attributes)
return new_entities_result,new_relationships_result,nwe_entity_attributes
# if __name__ == "__main__":
# text = """
# # 1螺旋桨本体
# 功能与特性能量转换的核心。它将主机的旋转动能转化为水流的反作用力推力。其特性由材料如镍铝青铜、锰青铜、桨叶数3-6叶、盘面比、螺距比等决定直接影响效率、空泡和振动性能。
# 相互关系:直接安装在尾轴(螺旋桨轴) 末端,其扭矩由尾轴传递,其推力通过推力轴承传递给船体。
# 2轴系
# 功能与特性:动力传递的桥梁。包括:
# 推力轴及推力轴承:承受螺旋桨产生的巨大轴向推力,并将其传递给船体结构,是决定船舶能否前进、后退的关键。
# 中间轴:连接主机输出端与推力轴/尾轴。
# 尾轴(螺旋桨轴):穿过尾轴管,末端安装螺旋桨,工作环境恶劣(浸没海水中),通常需包覆铜套防腐。
# 相互关系:将主机的旋转输出与螺旋桨本体刚性连接,形成一个完整的动力传递链。推力轴承是轴系与船体结构之间的关键受力界面。
# 3尾轴管与密封系统功能与特性
# 尾轴管:固定于船体尾端,支撑尾轴并形成从船内(机舱)到船外(海水)的通道。
# 密封系统(首尾密封):绝对关键的安全设备。防止海水沿尾轴流入机舱(尾密封),同时防止润滑油泄漏(首尾密封均有此功能)。通常采用唇式密封或面式密封,材料耐磨、耐腐蚀。
# 相互关系:为尾轴提供支撑和润滑(油润滑或水润滑),其密封系统直接保护尾轴并确保机舱安全,与轴系和船体结构紧密集成。
# 4毂帽与导流罩功能与特性
# 毂帽:安装在螺旋桨毂后端,呈流线型,用于减少桨毂后部产生的涡流阻力,提高效率。
# 导流罩(如桨毂涡流消除器):安装在桨毂前方,改善流入桨叶的水流状态,尤其适用于肥大船型,能提升效率、减少振动。
# 相互关系:直接安装在螺旋桨本体的毂上,是其水动力性能的优化附件。
# 系统相互关系总结:
# 主机驱动轴系旋转,轴系末端的尾轴带动螺旋桨本体旋转。螺旋桨产生的推力通过尾轴传递至推力轴承,最终作用在船体上使其运动。尾轴管及密封系统为这一旋转运动提供支撑、润滑和至关重要的水密保障。毂帽和导流罩则作为螺旋桨本体的附件,优化其水动力性能。所有子设备协同工作的核心目标,是确保主机功率被高效、平稳、可靠地转化为推进船舶前进的有效推力。 任何一环失效(如密封泄漏、轴承损坏)都将导致整个推进系统瘫痪。
# """
# content = []
# content.append(text)
# generate_Ontology_relationship(content,ontology=Ontology,Ontology_DESCRIPTION=Ontology_DESCRIPTION,relationships=Relationships,relationship_types=RELATIONSHIP_TYPES,node_types=NODE_TYPES)