|
@@ -174,9 +174,17 @@ MATCH_WITH_DEFINITION_PROMPT = """
|
|
|
|
|
|
|
|
**第三步:建立匹配关系**
|
|
**第三步:建立匹配关系**
|
|
|
|
|
|
|
|
-遍历 <B> 的每个语义片段(实质+形式),找到与 <A> 中最接近的语义,判断关系:
|
|
|
|
|
|
|
+**只匹配实质语义**,形式语义作为补充信息不参与匹配。
|
|
|
|
|
+
|
|
|
|
|
+遍历 <B> 的每个**实质语义**片段,找到与 <A> 中最接近的**实质语义**,判断关系:
|
|
|
|
|
+
|
|
|
|
|
+**重要**:
|
|
|
|
|
+- 在匹配关系中必须复述B语义说明和A语义说明,直接从前面的语义分析中复制过来
|
|
|
|
|
+- 形式语义(修饰词、限定词等)不单独匹配,因为它们脱离实质语义就失去意义
|
|
|
|
|
+- 形式语义的差异可以在score说明中提及,作为参考信息
|
|
|
|
|
|
|
|
1. **判断是否同一概念**(基于上下文中的作用/本质)
|
|
1. **判断是否同一概念**(基于上下文中的作用/本质)
|
|
|
|
|
+ - **参考B语义说明和A语义说明**,判断在各自上下文中的作用/本质是否相同
|
|
|
- **不是看字面是否相同**,而是看**在各自上下文中的作用/本质是否相同**
|
|
- **不是看字面是否相同**,而是看**在各自上下文中的作用/本质是否相同**
|
|
|
- 同一概念:可以比较上下位/同义关系
|
|
- 同一概念:可以比较上下位/同义关系
|
|
|
- 不同概念:标记为无关
|
|
- 不同概念:标记为无关
|
|
@@ -189,13 +197,12 @@ MATCH_WITH_DEFINITION_PROMPT = """
|
|
|
|
|
|
|
|
3. **计算匹配分数**
|
|
3. **计算匹配分数**
|
|
|
- 关系得分:同义=1.0, 上位词=0.6, 下位词=0.4, 无关=0.0
|
|
- 关系得分:同义=1.0, 上位词=0.6, 下位词=0.4, 无关=0.0
|
|
|
- - 实质语义权重=0.8,形式语义权重=0.2
|
|
|
|
|
|
|
+ - 只基于实质语义匹配计算score
|
|
|
- 计算公式:
|
|
- 计算公式:
|
|
|
```
|
|
```
|
|
|
- 实质得分 = Σ(实质语义的关系得分) / 实质语义总数
|
|
|
|
|
- 形式得分 = Σ(形式语义的关系得分) / 形式语义总数
|
|
|
|
|
- 最终 score = 实质得分 × 0.8 + 形式得分 × 0.2
|
|
|
|
|
|
|
+ score = Σ(实质语义的关系得分) / 实质语义总数
|
|
|
```
|
|
```
|
|
|
|
|
+ - 在score说明中,可以提及形式语义的差异作为补充参考
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
@@ -239,21 +246,25 @@ MATCH_WITH_DEFINITION_PROMPT = """
|
|
|
"匹配关系": [
|
|
"匹配关系": [
|
|
|
{
|
|
{
|
|
|
"B语义": "语义片段1",
|
|
"B语义": "语义片段1",
|
|
|
|
|
+ "B语义说明": "从B实质语义分析中复述该片段的说明",
|
|
|
"A语义": "语义片段1",
|
|
"A语义": "语义片段1",
|
|
|
|
|
+ "A语义说明": "从A实质语义分析中复述该片段的说明",
|
|
|
"是否同一概念": true,
|
|
"是否同一概念": true,
|
|
|
"关系": "下位词",
|
|
"关系": "下位词",
|
|
|
"说明": "说明两者的关系"
|
|
"说明": "说明两者的关系"
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
"B语义": "语义片段2",
|
|
"B语义": "语义片段2",
|
|
|
|
|
+ "B语义说明": "从B实质语义分析中复述该片段的说明",
|
|
|
"A语义": "语义片段2",
|
|
"A语义": "语义片段2",
|
|
|
|
|
+ "A语义说明": "从A实质语义分析中复述该片段的说明",
|
|
|
"是否同一概念": false,
|
|
"是否同一概念": false,
|
|
|
"关系": "无关",
|
|
"关系": "无关",
|
|
|
"说明": "说明为什么无关"
|
|
"说明": "说明为什么无关"
|
|
|
}
|
|
}
|
|
|
],
|
|
],
|
|
|
- "score": 0.65,
|
|
|
|
|
- "score说明": "基于评分规则计算得出"
|
|
|
|
|
|
|
+ "score": 0.4,
|
|
|
|
|
+ "score说明": "只基于实质语义计算。B有2个实质语义,第1个是A的下位词(0.4),第2个无关(0.0),最终score = (0.4 + 0.0) / 2 = 0.4。形式语义差异:B有'修饰词x',A有'修饰词y',作为补充参考。"
|
|
|
}
|
|
}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
@@ -262,11 +273,12 @@ MATCH_WITH_DEFINITION_PROMPT = """
|
|
|
2. **B语义分析**:必须包含"实质"、"形式"两个字段,其中实质通常为1-2个核心概念
|
|
2. **B语义分析**:必须包含"实质"、"形式"两个字段,其中实质通常为1-2个核心概念
|
|
|
3. **A语义分析**:必须包含"实质"、"形式"两个字段
|
|
3. **A语义分析**:必须包含"实质"、"形式"两个字段
|
|
|
4. **实质和形式**:都是字典格式,key是语义片段,value是对该片段的说明
|
|
4. **实质和形式**:都是字典格式,key是语义片段,value是对该片段的说明
|
|
|
-5. **匹配关系**:数组格式,包含所有B语义片段的匹配情况,字段顺序为:B语义 → A语义 → 是否同一概念 → 关系 → 说明
|
|
|
|
|
-6. **是否同一概念**:布尔值,true或false
|
|
|
|
|
-7. **关系**:必须是以下之一:"同义/近义"、"上位词"、"下位词"、"无关"
|
|
|
|
|
-8. **score**:0-1之间的浮点数,保留2位小数,按照评分规则计算
|
|
|
|
|
-9. **score说明**:说明分数的计算依据
|
|
|
|
|
|
|
+5. **匹配关系**:数组格式,**只包含实质语义的匹配**,字段顺序为:B语义 → B语义说明 → A语义 → A语义说明 → 是否同一概念 → 关系 → 说明
|
|
|
|
|
+6. **B语义说明和A语义说明**:必须从前面的实质语义分析中复述,保持一致
|
|
|
|
|
+7. **是否同一概念**:布尔值,true或false
|
|
|
|
|
+8. **关系**:必须是以下之一:"同义/近义"、"上位词"、"下位词"、"无关"
|
|
|
|
|
+9. **score**:0-1之间的浮点数,保留2位小数,只基于实质语义匹配计算
|
|
|
|
|
+10. **score说明**:说明分数的计算依据,可以提及形式语义的差异作为补充
|
|
|
""".strip()
|
|
""".strip()
|
|
|
|
|
|
|
|
|
|
|
|
@@ -289,6 +301,65 @@ def create_match_agent(model_name: str) -> Agent:
|
|
|
return agent
|
|
return agent
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+def calculate_score_by_code(match_result: dict) -> float:
|
|
|
|
|
+ """根据匹配关系用代码计算score(只基于实质语义)
|
|
|
|
|
+
|
|
|
|
|
+ Args:
|
|
|
|
|
+ match_result: 匹配结果字典,包含 B语义分析、A语义分析、匹配关系
|
|
|
|
|
+
|
|
|
|
|
+ Returns:
|
|
|
|
|
+ 计算得出的score(0-1之间)
|
|
|
|
|
+
|
|
|
|
|
+ Raises:
|
|
|
|
|
+ ValueError: 当匹配关系为空或数据不完整时
|
|
|
|
|
+ """
|
|
|
|
|
+ # 关系得分映射
|
|
|
|
|
+ RELATION_SCORES = {
|
|
|
|
|
+ "同义/近义": 1.0,
|
|
|
|
|
+ "上位词": 0.6,
|
|
|
|
|
+ "下位词": 0.4,
|
|
|
|
|
+ "无关": 0.0
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ b_semantics = match_result.get("B语义分析", {})
|
|
|
|
|
+ match_relations = match_result.get("匹配关系", [])
|
|
|
|
|
+
|
|
|
|
|
+ if not match_relations:
|
|
|
|
|
+ raise ValueError("匹配关系为空,无法计算score_by_code")
|
|
|
|
|
+
|
|
|
|
|
+ if not b_semantics:
|
|
|
|
|
+ raise ValueError("B语义分析为空,无法计算score_by_code")
|
|
|
|
|
+
|
|
|
|
|
+ # 提取B的实质语义片段
|
|
|
|
|
+ b_essence = set(b_semantics.get("实质", {}).keys())
|
|
|
|
|
+
|
|
|
|
|
+ if not b_essence:
|
|
|
|
|
+ raise ValueError("B语义分析中实质为空,无法计算score_by_code")
|
|
|
|
|
+
|
|
|
|
|
+ # 只计算实质语义的得分
|
|
|
|
|
+ essence_scores = []
|
|
|
|
|
+
|
|
|
|
|
+ for relation in match_relations:
|
|
|
|
|
+ b_semantic = relation.get("B语义", "")
|
|
|
|
|
+ relation_type = relation.get("关系", "无关")
|
|
|
|
|
+ score = RELATION_SCORES.get(relation_type, 0.0)
|
|
|
|
|
+
|
|
|
|
|
+ # 验证该语义确实属于实质
|
|
|
|
|
+ if b_semantic in b_essence:
|
|
|
|
|
+ essence_scores.append(score)
|
|
|
|
|
+ else:
|
|
|
|
|
+ # 如果匹配关系中包含了非实质语义,报错
|
|
|
|
|
+ raise ValueError(f"匹配关系中包含非实质语义: {b_semantic}")
|
|
|
|
|
+
|
|
|
|
|
+ if not essence_scores:
|
|
|
|
|
+ raise ValueError("匹配关系中没有实质语义,无法计算score_by_code")
|
|
|
|
|
+
|
|
|
|
|
+ # 只基于实质语义计算平均分
|
|
|
|
|
+ final_score = sum(essence_scores) / len(essence_scores)
|
|
|
|
|
+
|
|
|
|
|
+ return round(final_score, 2)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
def parse_match_response(response_content: str) -> dict:
|
|
def parse_match_response(response_content: str) -> dict:
|
|
|
"""解析匹配响应
|
|
"""解析匹配响应
|
|
|
|
|
|
|
@@ -585,9 +656,14 @@ async def match_with_definition(
|
|
|
},
|
|
},
|
|
|
"匹配关系": [],
|
|
"匹配关系": [],
|
|
|
"score": 0.0,
|
|
"score": 0.0,
|
|
|
|
|
+ "score_by_code": 0.0,
|
|
|
"score说明": f"解析失败:缺少字段 {missing_fields}"
|
|
"score说明": f"解析失败:缺少字段 {missing_fields}"
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ # 计算程序score(如果数据不完整会抛出异常)
|
|
|
|
|
+ score_by_code = calculate_score_by_code(parsed_result)
|
|
|
|
|
+ parsed_result["score_by_code"] = score_by_code
|
|
|
|
|
+
|
|
|
return parsed_result
|
|
return parsed_result
|
|
|
|
|
|
|
|
except Exception as e:
|
|
except Exception as e:
|
|
@@ -602,5 +678,6 @@ async def match_with_definition(
|
|
|
},
|
|
},
|
|
|
"匹配关系": [],
|
|
"匹配关系": [],
|
|
|
"score": 0.0,
|
|
"score": 0.0,
|
|
|
|
|
+ "score_by_code": 0.0,
|
|
|
"score说明": f"匹配过程出错: {str(e)}"
|
|
"score说明": f"匹配过程出错: {str(e)}"
|
|
|
}
|
|
}
|