287 lines
14 KiB
Python
287 lines
14 KiB
Python
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("⚠️ 跳过当前 chunk:API 调用失败")
|
||
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)
|
||
|