kofdai commited on
Commit
2086e4e
·
verified ·
1 Parent(s): 944e410

Upload src/coordinate_mapper.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. src/coordinate_mapper.py +103 -0
src/coordinate_mapper.py ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import math
2
+ from typing import Dict, Any, List
3
+
4
+ # 既存のモジュールをインポート
5
+ # calculate_granularity は粒度を計算するもので、ドメインに依存しないためそのまま利用
6
+ from certainty_calculation_formula import calculate_granularity
7
+
8
+ def assign_verification_score(concepts: list, sources: list) -> float:
9
+ """検証スコアを割り当てるダミー関数"""
10
+ score = 50.0
11
+ if sources:
12
+ score += len(sources) * 5.0
13
+ return score
14
+
15
+ class CoordinateMapper:
16
+ """
17
+ LLMの思考プロセス(推論ステップ)を、動的に読み込まれたドメインスキーマに
18
+ 基づいてドメイン固有の空間座標に変換する汎用マッパー。
19
+ """
20
+ def __init__(self, domain_schema: Dict[str, Any]):
21
+ """
22
+ 特定のドメインスキーマを元にマッパーを初期化します。
23
+
24
+ Args:
25
+ domain_schema (Dict[str, Any]): 対象ドメインのスキーマ。
26
+ """
27
+ if not domain_schema:
28
+ raise ValueError("ドメインスキーマが提供されていません。")
29
+ self.schema = domain_schema
30
+ self.keyword_map = self.schema.get("keyword_map", {})
31
+
32
+ def map_reasoning_to_domain_space(self, reasoning_steps: List[Dict]) -> List[Dict]:
33
+ """
34
+ 抽出された推論ステップを、当マッパーに設定されたドメインの空間座標に変換します。
35
+
36
+ Args:
37
+ reasoning_steps (List[Dict]): reasoning_chain_extractor.pyから得られる推論ステップのリスト。
38
+
39
+ Returns:
40
+ List[Dict]: 座標情報が付与された辞書のリスト。
41
+ """
42
+ coordinates = []
43
+ full_text = " ".join(step["text"] for step in reasoning_steps)
44
+
45
+ # 全体のテキストから主要な座標を推定(デフォルト値として使用)
46
+ default_coord = [50, 50, 50]
47
+ axis_map = {'x': 0, 'y': 1, 'z': 2}
48
+ for axis_name, axis_index in axis_map.items():
49
+ axis_keywords = [kw for kw in self.keyword_map if self.keyword_map[kw]['axis'] == axis_name and kw in full_text]
50
+ if axis_keywords:
51
+ default_coord[axis_index] = self.keyword_map[axis_keywords[0]]['coord']
52
+
53
+ for step in reasoning_steps:
54
+ coord = list(default_coord)
55
+ # ステップ内のキーワードで座標を上書き
56
+ step_keywords = [kw for kw in self.keyword_map if kw in step["text"]]
57
+ for kw in step_keywords:
58
+ axis_name = self.keyword_map[kw]['axis']
59
+ axis_index = axis_map[axis_name]
60
+ coord[axis_index] = self.keyword_map[kw]['coord']
61
+
62
+ # メタ軸の計算
63
+ c = int(step["confidence"] * 100)
64
+ word_count = len(step["text"].split())
65
+ g = calculate_granularity(word_count)
66
+ v = assign_verification_score(step["concepts"], [])
67
+
68
+ coordinates.append({
69
+ "step_sequence": step["sequence"],
70
+ "reasoning_text": step["text"],
71
+ "coordinate": {
72
+ "medical_space": tuple(coord), # スキーマ名に合わせて変更が必要だが、ここでは固定
73
+ "meta_space": (c, g, v)
74
+ },
75
+ "concept_tags": step["concepts"],
76
+ "confidence": step["confidence"]
77
+ })
78
+
79
+ return coordinates
80
+
81
+ # --- 使用例 ---
82
+ if __name__ == "__main__":
83
+ from domain_manager import DomainManager
84
+ from reasoning_chain_extractor import extract_reasoning_chain
85
+
86
+ # 1. ドメインマネージャを初期化
87
+ domain_manager = DomainManager()
88
+
89
+ # 2. ダミーの推論ステップを用意
90
+ dummy_reasoning_chain = [
91
+ {'sequence': 0, 'text': 'まず、民法における契約の定義から始めます。', 'confidence': 0.9, 'concepts': ['民法', '契約']},
92
+ {'sequence': 1, 'text': '次に、具体的な判例を元に解釈を深めます。', 'confidence': 0.8, 'concepts': ['判例', '解釈']}
93
+ ]
94
+
95
+ # 3. 法学ドメイン用のマッパーを生成して実行
96
+ print("--- Case: Legal Domain ---")
97
+ legal_schema = domain_manager.get_schema("legal")
98
+ legal_mapper = CoordinateMapper(legal_schema)
99
+
100
+ legal_coordinates = legal_mapper.map_reasoning_to_domain_space(dummy_reasoning_chain)
101
+
102
+ import json
103
+ print(json.dumps(legal_coordinates, indent=2, ensure_ascii=False))