memento-mcp-server 1.11.1 → 1.12.0-a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.en.md +21 -6
  2. package/README.md +38 -7
  3. package/dist/algorithms/hybrid-search-engine.d.ts +34 -1
  4. package/dist/algorithms/hybrid-search-engine.d.ts.map +1 -1
  5. package/dist/algorithms/hybrid-search-engine.js +186 -17
  6. package/dist/algorithms/hybrid-search-engine.js.map +1 -1
  7. package/dist/algorithms/search-ranking.d.ts +15 -1
  8. package/dist/algorithms/search-ranking.d.ts.map +1 -1
  9. package/dist/algorithms/search-ranking.js +41 -4
  10. package/dist/algorithms/search-ranking.js.map +1 -1
  11. package/dist/config/environment.d.ts.map +1 -1
  12. package/dist/config/environment.js +4 -0
  13. package/dist/config/environment.js.map +1 -1
  14. package/dist/config/index.d.ts.map +1 -1
  15. package/dist/config/index.js +6 -0
  16. package/dist/config/index.js.map +1 -1
  17. package/dist/config/ranking-weights-loader.d.ts +37 -0
  18. package/dist/config/ranking-weights-loader.d.ts.map +1 -0
  19. package/dist/config/ranking-weights-loader.js +109 -0
  20. package/dist/config/ranking-weights-loader.js.map +1 -0
  21. package/dist/constants/relation-constants.d.ts +95 -0
  22. package/dist/constants/relation-constants.d.ts.map +1 -0
  23. package/dist/constants/relation-constants.js +95 -0
  24. package/dist/constants/relation-constants.js.map +1 -0
  25. package/dist/database/migration/migrations/005-relation-engine-schema.d.ts +65 -0
  26. package/dist/database/migration/migrations/005-relation-engine-schema.d.ts.map +1 -0
  27. package/dist/database/migration/migrations/005-relation-engine-schema.js +295 -0
  28. package/dist/database/migration/migrations/005-relation-engine-schema.js.map +1 -0
  29. package/dist/database/migration/migrations/005-relation-engine-schema.sql +64 -0
  30. package/dist/services/anchor/anchor-interfaces.d.ts +1 -0
  31. package/dist/services/anchor/anchor-interfaces.d.ts.map +1 -1
  32. package/dist/services/anchor/anchor-interfaces.js.map +1 -1
  33. package/dist/services/anchor/anchor-search-service.d.ts +16 -0
  34. package/dist/services/anchor/anchor-search-service.d.ts.map +1 -1
  35. package/dist/services/anchor/anchor-search-service.js +136 -17
  36. package/dist/services/anchor/anchor-search-service.js.map +1 -1
  37. package/dist/services/batch-scheduler.d.ts +11 -0
  38. package/dist/services/batch-scheduler.d.ts.map +1 -1
  39. package/dist/services/batch-scheduler.js +99 -0
  40. package/dist/services/batch-scheduler.js.map +1 -1
  41. package/dist/services/llm-based-relation-extractor.d.ts +156 -0
  42. package/dist/services/llm-based-relation-extractor.d.ts.map +1 -0
  43. package/dist/services/llm-based-relation-extractor.js +1350 -0
  44. package/dist/services/llm-based-relation-extractor.js.map +1 -0
  45. package/dist/services/relation-extractor.d.ts +73 -0
  46. package/dist/services/relation-extractor.d.ts.map +1 -0
  47. package/dist/services/relation-extractor.js +231 -0
  48. package/dist/services/relation-extractor.js.map +1 -0
  49. package/dist/services/relation-graph.d.ts +275 -0
  50. package/dist/services/relation-graph.d.ts.map +1 -0
  51. package/dist/services/relation-graph.js +869 -0
  52. package/dist/services/relation-graph.js.map +1 -0
  53. package/dist/services/relation-quality-validator.d.ts +211 -0
  54. package/dist/services/relation-quality-validator.d.ts.map +1 -0
  55. package/dist/services/relation-quality-validator.js +415 -0
  56. package/dist/services/relation-quality-validator.js.map +1 -0
  57. package/dist/services/rule-based-relation-extractor.d.ts +66 -0
  58. package/dist/services/rule-based-relation-extractor.d.ts.map +1 -0
  59. package/dist/services/rule-based-relation-extractor.js +258 -0
  60. package/dist/services/rule-based-relation-extractor.js.map +1 -0
  61. package/dist/tools/add-relation-tool.d.ts +34 -0
  62. package/dist/tools/add-relation-tool.d.ts.map +1 -0
  63. package/dist/tools/add-relation-tool.js +163 -0
  64. package/dist/tools/add-relation-tool.js.map +1 -0
  65. package/dist/tools/extract-relations-tool.d.ts +28 -0
  66. package/dist/tools/extract-relations-tool.d.ts.map +1 -0
  67. package/dist/tools/extract-relations-tool.js +159 -0
  68. package/dist/tools/extract-relations-tool.js.map +1 -0
  69. package/dist/tools/get-relations-tool.d.ts +34 -0
  70. package/dist/tools/get-relations-tool.d.ts.map +1 -0
  71. package/dist/tools/get-relations-tool.js +155 -0
  72. package/dist/tools/get-relations-tool.js.map +1 -0
  73. package/dist/tools/index.d.ts +6 -1
  74. package/dist/tools/index.d.ts.map +1 -1
  75. package/dist/tools/index.js +16 -2
  76. package/dist/tools/index.js.map +1 -1
  77. package/dist/tools/remember-tool.d.ts +17 -0
  78. package/dist/tools/remember-tool.d.ts.map +1 -1
  79. package/dist/tools/remember-tool.js +195 -26
  80. package/dist/tools/remember-tool.js.map +1 -1
  81. package/dist/tools/remove-relation-tool.d.ts +45 -0
  82. package/dist/tools/remove-relation-tool.d.ts.map +1 -0
  83. package/dist/tools/remove-relation-tool.js +142 -0
  84. package/dist/tools/remove-relation-tool.js.map +1 -0
  85. package/dist/tools/search-local-tool.d.ts.map +1 -1
  86. package/dist/tools/search-local-tool.js +10 -3
  87. package/dist/tools/search-local-tool.js.map +1 -1
  88. package/dist/tools/types.d.ts +2 -0
  89. package/dist/tools/types.d.ts.map +1 -1
  90. package/dist/tools/types.js.map +1 -1
  91. package/dist/tools/visualize-relations-tool.d.ts +46 -0
  92. package/dist/tools/visualize-relations-tool.d.ts.map +1 -0
  93. package/dist/tools/visualize-relations-tool.js +157 -0
  94. package/dist/tools/visualize-relations-tool.js.map +1 -0
  95. package/dist/types/index.d.ts +8 -0
  96. package/dist/types/index.d.ts.map +1 -1
  97. package/dist/types/index.js +1 -0
  98. package/dist/types/index.js.map +1 -1
  99. package/dist/types/relation-graph.d.ts +215 -0
  100. package/dist/types/relation-graph.d.ts.map +1 -0
  101. package/dist/types/relation-graph.js +6 -0
  102. package/dist/types/relation-graph.js.map +1 -0
  103. package/dist/types/relation.d.ts +112 -0
  104. package/dist/types/relation.d.ts.map +1 -0
  105. package/dist/types/relation.js +67 -0
  106. package/dist/types/relation.js.map +1 -0
  107. package/dist/utils/cache-key-generator.d.ts +63 -0
  108. package/dist/utils/cache-key-generator.d.ts.map +1 -0
  109. package/dist/utils/cache-key-generator.js +76 -0
  110. package/dist/utils/cache-key-generator.js.map +1 -0
  111. package/dist/utils/database.d.ts.map +1 -1
  112. package/dist/utils/database.js +37 -17
  113. package/dist/utils/database.js.map +1 -1
  114. package/dist/utils/relation-visualizer.d.ts +81 -0
  115. package/dist/utils/relation-visualizer.d.ts.map +1 -0
  116. package/dist/utils/relation-visualizer.js +239 -0
  117. package/dist/utils/relation-visualizer.js.map +1 -0
  118. package/dist/utils/type-guards.d.ts +100 -0
  119. package/dist/utils/type-guards.d.ts.map +1 -0
  120. package/dist/utils/type-guards.js +144 -0
  121. package/dist/utils/type-guards.js.map +1 -0
  122. package/package.json +7 -2
  123. package/scripts/generate-relation-report.ts +481 -0
  124. package/scripts/weekly-relation-validation.ts +423 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-graph.js","sourceRoot":"","sources":["../../src/services/relation-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * 관계 추출 품질 검증 서비스
3
+ * Precision, Recall, F1-Score 계산 및 관계 유형별 정확도 분석
4
+ */
5
+ import type { RelationType } from '../types/relation.js';
6
+ /**
7
+ * 예상 관계 (Ground Truth)
8
+ */
9
+ export interface ExpectedRelation {
10
+ source_id: string;
11
+ target_id: string;
12
+ expected_relation_type: RelationType;
13
+ expected_confidence_range: [number, number];
14
+ source_content: string;
15
+ target_content: string;
16
+ }
17
+ /**
18
+ * 실제 추출된 관계
19
+ */
20
+ export interface ExtractedRelation {
21
+ source_id: string;
22
+ target_id: string;
23
+ relation_type: RelationType;
24
+ confidence: number;
25
+ }
26
+ /**
27
+ * 관계 매칭 결과
28
+ */
29
+ export interface RelationMatch {
30
+ expected: ExpectedRelation;
31
+ extracted: ExtractedRelation | null;
32
+ isMatch: boolean;
33
+ isTypeMatch: boolean;
34
+ isConfidenceInRange: boolean;
35
+ }
36
+ /**
37
+ * 관계 유형별 상세 분석
38
+ */
39
+ export interface TypeAnalysis {
40
+ relationType: RelationType;
41
+ precision: number;
42
+ recall: number;
43
+ f1Score: number;
44
+ truePositives: number;
45
+ falsePositives: number;
46
+ falseNegatives: number;
47
+ averageConfidence: number;
48
+ confidenceStdDev: number;
49
+ minConfidence: number;
50
+ maxConfidence: number;
51
+ confusionMatrix: Record<RelationType, number>;
52
+ mostConfusedWith: RelationType | null;
53
+ confusionRate: number;
54
+ }
55
+ /**
56
+ * 혼동 행렬 (Confusion Matrix)
57
+ * 실제 관계 유형 vs 예측 관계 유형
58
+ */
59
+ export interface ConfusionMatrix {
60
+ matrix: Record<RelationType, Record<RelationType, number>>;
61
+ overallAccuracy: number;
62
+ typeAccuracy: Record<RelationType, number>;
63
+ }
64
+ /**
65
+ * 품질 메트릭
66
+ */
67
+ export interface QualityMetrics {
68
+ precision: number;
69
+ recall: number;
70
+ f1Score: number;
71
+ truePositives: number;
72
+ falsePositives: number;
73
+ falseNegatives: number;
74
+ typeMetrics: Record<RelationType, {
75
+ precision: number;
76
+ recall: number;
77
+ f1Score: number;
78
+ truePositives: number;
79
+ falsePositives: number;
80
+ falseNegatives: number;
81
+ }>;
82
+ confidenceComplianceRate: number;
83
+ totalExpected: number;
84
+ totalExtracted: number;
85
+ typeAnalysis?: Record<RelationType, TypeAnalysis>;
86
+ confusionMatrix?: ConfusionMatrix;
87
+ }
88
+ /**
89
+ * 관계 추출 품질 검증 서비스
90
+ */
91
+ export declare class RelationQualityValidator {
92
+ /**
93
+ * 관계 매칭: 예상 관계와 추출된 관계를 매칭
94
+ *
95
+ * Given: 예상 관계 목록과 추출된 관계 목록
96
+ * When: source_id와 target_id로 매칭
97
+ * Then: 매칭 결과 반환
98
+ */
99
+ matchRelations(expectedRelations: ExpectedRelation[], extractedRelations: ExtractedRelation[]): RelationMatch[];
100
+ /**
101
+ * Precision 계산
102
+ * Precision = TP / (TP + FP)
103
+ *
104
+ * Given: 매칭 결과
105
+ * When: 추출된 관계 중 올바른 관계 비율 계산
106
+ * Then: Precision 값 반환
107
+ */
108
+ calculatePrecision(matches: RelationMatch[], extractedRelations: ExtractedRelation[]): number;
109
+ /**
110
+ * Recall 계산
111
+ * Recall = TP / (TP + FN)
112
+ *
113
+ * Given: 매칭 결과와 예상 관계 목록
114
+ * When: 예상 관계 중 올바르게 추출된 관계 비율 계산
115
+ * Then: Recall 값 반환
116
+ */
117
+ calculateRecall(matches: RelationMatch[], expectedRelations: ExpectedRelation[]): number;
118
+ /**
119
+ * F1-Score 계산
120
+ * F1 = 2 * (Precision * Recall) / (Precision + Recall)
121
+ *
122
+ * Given: Precision과 Recall
123
+ * When: 조화 평균 계산
124
+ * Then: F1-Score 값 반환
125
+ */
126
+ calculateF1Score(precision: number, recall: number): number;
127
+ /**
128
+ * 관계 유형별 메트릭 계산
129
+ *
130
+ * Given: 매칭 결과와 관계 유형
131
+ * When: 특정 관계 유형에 대한 Precision, Recall, F1-Score 계산
132
+ * Then: 관계 유형별 메트릭 반환
133
+ */
134
+ calculateTypeMetrics(matches: RelationMatch[], extractedRelations: ExtractedRelation[], expectedRelations: ExpectedRelation[], relationType: RelationType): {
135
+ precision: number;
136
+ recall: number;
137
+ f1Score: number;
138
+ truePositives: number;
139
+ falsePositives: number;
140
+ falseNegatives: number;
141
+ };
142
+ /**
143
+ * 신뢰도 범위 준수율 계산
144
+ *
145
+ * Given: 매칭 결과
146
+ * When: 추출된 관계 중 신뢰도가 예상 범위 내에 있는 비율 계산
147
+ * Then: 준수율 반환
148
+ */
149
+ calculateConfidenceComplianceRate(matches: RelationMatch[]): number;
150
+ /**
151
+ * 전체 품질 메트릭 계산
152
+ *
153
+ * Given: 예상 관계 목록과 추출된 관계 목록
154
+ * When: 모든 메트릭 계산
155
+ * Then: 완전한 품질 메트릭 반환
156
+ */
157
+ calculateQualityMetrics(expectedRelations: ExpectedRelation[], extractedRelations: ExtractedRelation[]): QualityMetrics;
158
+ /**
159
+ * 메트릭이 임계값을 만족하는지 확인
160
+ *
161
+ * Given: 품질 메트릭과 임계값
162
+ * When: 각 메트릭이 임계값 이상인지 확인
163
+ * Then: 검증 결과 반환
164
+ */
165
+ validateThresholds(metrics: QualityMetrics, thresholds: {
166
+ precision?: number;
167
+ recall?: number;
168
+ f1Score?: number;
169
+ }): {
170
+ passed: boolean;
171
+ failures: Array<{
172
+ metric: string;
173
+ expected: number;
174
+ actual: number;
175
+ }>;
176
+ };
177
+ /**
178
+ * 혼동 행렬 계산
179
+ * 실제 관계 유형과 예측 관계 유형의 매칭 행렬
180
+ *
181
+ * Given: 매칭 결과
182
+ * When: 실제 관계 유형과 예측 관계 유형을 매핑
183
+ * Then: 혼동 행렬 반환
184
+ */
185
+ calculateConfusionMatrix(matches: RelationMatch[]): ConfusionMatrix;
186
+ /**
187
+ * 관계 유형별 상세 분석
188
+ *
189
+ * Given: 매칭 결과, 추출된 관계, 예상 관계, 관계 유형
190
+ * When: 상세 통계 및 혼동 분석 수행
191
+ * Then: 관계 유형별 상세 분석 반환
192
+ */
193
+ analyzeRelationType(matches: RelationMatch[], extractedRelations: ExtractedRelation[], expectedRelations: ExpectedRelation[], relationType: RelationType): TypeAnalysis;
194
+ /**
195
+ * 모든 관계 유형별 상세 분석 수행
196
+ *
197
+ * Given: 매칭 결과, 추출된 관계, 예상 관계
198
+ * When: 모든 관계 유형에 대해 상세 분석 수행
199
+ * Then: 관계 유형별 상세 분석 맵 반환
200
+ */
201
+ analyzeAllRelationTypes(matches: RelationMatch[], extractedRelations: ExtractedRelation[], expectedRelations: ExpectedRelation[]): Record<RelationType, TypeAnalysis>;
202
+ /**
203
+ * 전체 품질 메트릭 계산 (상세 분석 포함)
204
+ *
205
+ * Given: 예상 관계 목록과 추출된 관계 목록
206
+ * When: 모든 메트릭 및 상세 분석 계산
207
+ * Then: 완전한 품질 메트릭 반환 (관계 유형별 분석 및 혼동 행렬 포함)
208
+ */
209
+ calculateQualityMetricsWithAnalysis(expectedRelations: ExpectedRelation[], extractedRelations: ExtractedRelation[]): QualityMetrics;
210
+ }
211
+ //# sourceMappingURL=relation-quality-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-quality-validator.d.ts","sourceRoot":"","sources":["../../src/services/relation-quality-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,415 @@
1
+ /**
2
+ * 관계 추출 품질 검증 서비스
3
+ * Precision, Recall, F1-Score 계산 및 관계 유형별 정확도 분석
4
+ */
5
+ import { ALL_RELATION_TYPES } from '../types/relation.js';
6
+ /**
7
+ * 관계 추출 품질 검증 서비스
8
+ */
9
+ export class RelationQualityValidator {
10
+ /**
11
+ * 관계 매칭: 예상 관계와 추출된 관계를 매칭
12
+ *
13
+ * Given: 예상 관계 목록과 추출된 관계 목록
14
+ * When: source_id와 target_id로 매칭
15
+ * Then: 매칭 결과 반환
16
+ */
17
+ matchRelations(expectedRelations, extractedRelations) {
18
+ // 추출된 관계를 Map으로 변환 (key: `${source_id}:${target_id}`)
19
+ const extractedMap = new Map();
20
+ for (const extracted of extractedRelations) {
21
+ const key = `${extracted.source_id}:${extracted.target_id}`;
22
+ extractedMap.set(key, extracted);
23
+ }
24
+ // 예상 관계와 매칭
25
+ const matches = expectedRelations.map(expected => {
26
+ const key = `${expected.source_id}:${expected.target_id}`;
27
+ const extracted = extractedMap.get(key) || null;
28
+ if (!extracted) {
29
+ return {
30
+ expected,
31
+ extracted: null,
32
+ isMatch: false,
33
+ isTypeMatch: false,
34
+ isConfidenceInRange: false
35
+ };
36
+ }
37
+ // 관계 유형 일치 확인
38
+ const isTypeMatch = extracted.relation_type === expected.expected_relation_type;
39
+ // 신뢰도 범위 확인
40
+ const [minConfidence, maxConfidence] = expected.expected_confidence_range;
41
+ const isConfidenceInRange = extracted.confidence >= minConfidence &&
42
+ extracted.confidence <= maxConfidence;
43
+ // 완전 일치: 관계 유형과 신뢰도 범위 모두 일치
44
+ const isMatch = isTypeMatch && isConfidenceInRange;
45
+ return {
46
+ expected,
47
+ extracted,
48
+ isMatch,
49
+ isTypeMatch,
50
+ isConfidenceInRange
51
+ };
52
+ });
53
+ return matches;
54
+ }
55
+ /**
56
+ * Precision 계산
57
+ * Precision = TP / (TP + FP)
58
+ *
59
+ * Given: 매칭 결과
60
+ * When: 추출된 관계 중 올바른 관계 비율 계산
61
+ * Then: Precision 값 반환
62
+ */
63
+ calculatePrecision(matches, extractedRelations) {
64
+ const truePositives = matches.filter(m => m.isMatch).length;
65
+ const totalExtracted = extractedRelations.length;
66
+ if (totalExtracted === 0) {
67
+ return 0; // 추출된 관계가 없으면 Precision은 0
68
+ }
69
+ // False Positives: 추출되었지만 예상에 없는 관계
70
+ const matchedSourceTargets = new Set(matches.map(m => `${m.expected.source_id}:${m.expected.target_id}`));
71
+ const falsePositives = extractedRelations.filter(ext => !matchedSourceTargets.has(`${ext.source_id}:${ext.target_id}`)).length;
72
+ return truePositives / (truePositives + falsePositives);
73
+ }
74
+ /**
75
+ * Recall 계산
76
+ * Recall = TP / (TP + FN)
77
+ *
78
+ * Given: 매칭 결과와 예상 관계 목록
79
+ * When: 예상 관계 중 올바르게 추출된 관계 비율 계산
80
+ * Then: Recall 값 반환
81
+ */
82
+ calculateRecall(matches, expectedRelations) {
83
+ const truePositives = matches.filter(m => m.isMatch).length;
84
+ const falseNegatives = matches.filter(m => !m.isMatch).length;
85
+ const totalExpected = expectedRelations.length;
86
+ if (totalExpected === 0) {
87
+ return 0; // 예상 관계가 없으면 Recall은 0
88
+ }
89
+ return truePositives / (truePositives + falseNegatives);
90
+ }
91
+ /**
92
+ * F1-Score 계산
93
+ * F1 = 2 * (Precision * Recall) / (Precision + Recall)
94
+ *
95
+ * Given: Precision과 Recall
96
+ * When: 조화 평균 계산
97
+ * Then: F1-Score 값 반환
98
+ */
99
+ calculateF1Score(precision, recall) {
100
+ if (precision === 0 && recall === 0) {
101
+ return 0;
102
+ }
103
+ return (2 * precision * recall) / (precision + recall);
104
+ }
105
+ /**
106
+ * 관계 유형별 메트릭 계산
107
+ *
108
+ * Given: 매칭 결과와 관계 유형
109
+ * When: 특정 관계 유형에 대한 Precision, Recall, F1-Score 계산
110
+ * Then: 관계 유형별 메트릭 반환
111
+ */
112
+ calculateTypeMetrics(matches, extractedRelations, expectedRelations, relationType) {
113
+ // 해당 관계 유형의 예상 관계 필터링
114
+ const expectedForType = expectedRelations.filter(exp => exp.expected_relation_type === relationType);
115
+ // 해당 관계 유형의 추출된 관계 필터링
116
+ const extractedForType = extractedRelations.filter(ext => ext.relation_type === relationType);
117
+ // 해당 관계 유형의 매칭 결과 필터링
118
+ const matchesForType = matches.filter(m => m.expected.expected_relation_type === relationType);
119
+ // True Positives: 관계 유형이 일치하고 완전히 일치하는 경우
120
+ const truePositives = matchesForType.filter(m => m.isMatch).length;
121
+ // False Positives: 추출되었지만 예상에 없거나 관계 유형이 다른 경우
122
+ const matchedSourceTargets = new Set(matchesForType.map(m => `${m.expected.source_id}:${m.expected.target_id}`));
123
+ const falsePositives = extractedForType.filter(ext => !matchedSourceTargets.has(`${ext.source_id}:${ext.target_id}`)).length;
124
+ // False Negatives: 예상에 있지만 추출되지 않았거나 관계 유형이 다른 경우
125
+ const falseNegatives = matchesForType.filter(m => !m.isMatch).length;
126
+ // Precision 계산
127
+ const precision = (truePositives + falsePositives) === 0
128
+ ? 0
129
+ : truePositives / (truePositives + falsePositives);
130
+ // Recall 계산
131
+ const recall = expectedForType.length === 0
132
+ ? 0
133
+ : truePositives / (truePositives + falseNegatives);
134
+ // F1-Score 계산
135
+ const f1Score = this.calculateF1Score(precision, recall);
136
+ return {
137
+ precision,
138
+ recall,
139
+ f1Score,
140
+ truePositives,
141
+ falsePositives,
142
+ falseNegatives
143
+ };
144
+ }
145
+ /**
146
+ * 신뢰도 범위 준수율 계산
147
+ *
148
+ * Given: 매칭 결과
149
+ * When: 추출된 관계 중 신뢰도가 예상 범위 내에 있는 비율 계산
150
+ * Then: 준수율 반환
151
+ */
152
+ calculateConfidenceComplianceRate(matches) {
153
+ const withExtracted = matches.filter(m => m.extracted !== null);
154
+ if (withExtracted.length === 0) {
155
+ return 0;
156
+ }
157
+ const inRange = withExtracted.filter(m => m.isConfidenceInRange).length;
158
+ return inRange / withExtracted.length;
159
+ }
160
+ /**
161
+ * 전체 품질 메트릭 계산
162
+ *
163
+ * Given: 예상 관계 목록과 추출된 관계 목록
164
+ * When: 모든 메트릭 계산
165
+ * Then: 완전한 품질 메트릭 반환
166
+ */
167
+ calculateQualityMetrics(expectedRelations, extractedRelations) {
168
+ // 관계 매칭
169
+ const matches = this.matchRelations(expectedRelations, extractedRelations);
170
+ // 전체 메트릭 계산
171
+ const truePositives = matches.filter(m => m.isMatch).length;
172
+ const falseNegatives = matches.filter(m => !m.isMatch).length;
173
+ // False Positives: 추출되었지만 예상에 없는 관계
174
+ const matchedSourceTargets = new Set(matches.map(m => `${m.expected.source_id}:${m.expected.target_id}`));
175
+ const falsePositives = extractedRelations.filter(ext => !matchedSourceTargets.has(`${ext.source_id}:${ext.target_id}`)).length;
176
+ const precision = this.calculatePrecision(matches, extractedRelations);
177
+ const recall = this.calculateRecall(matches, expectedRelations);
178
+ const f1Score = this.calculateF1Score(precision, recall);
179
+ // 관계 유형별 메트릭 계산
180
+ const relationTypes = ALL_RELATION_TYPES;
181
+ const typeMetrics = {
182
+ CAUSES: { precision: 0, recall: 0, f1Score: 0, truePositives: 0, falsePositives: 0, falseNegatives: 0 },
183
+ DEPENDS_ON: { precision: 0, recall: 0, f1Score: 0, truePositives: 0, falsePositives: 0, falseNegatives: 0 },
184
+ FOLLOWS: { precision: 0, recall: 0, f1Score: 0, truePositives: 0, falsePositives: 0, falseNegatives: 0 },
185
+ CONTRASTS_WITH: { precision: 0, recall: 0, f1Score: 0, truePositives: 0, falsePositives: 0, falseNegatives: 0 },
186
+ REFERENCES: { precision: 0, recall: 0, f1Score: 0, truePositives: 0, falsePositives: 0, falseNegatives: 0 },
187
+ BELONGS_TO: { precision: 0, recall: 0, f1Score: 0, truePositives: 0, falsePositives: 0, falseNegatives: 0 }
188
+ };
189
+ for (const type of relationTypes) {
190
+ typeMetrics[type] = this.calculateTypeMetrics(matches, extractedRelations, expectedRelations, type);
191
+ }
192
+ // 신뢰도 범위 준수율
193
+ const confidenceComplianceRate = this.calculateConfidenceComplianceRate(matches);
194
+ return {
195
+ precision,
196
+ recall,
197
+ f1Score,
198
+ truePositives,
199
+ falsePositives,
200
+ falseNegatives,
201
+ typeMetrics,
202
+ confidenceComplianceRate,
203
+ totalExpected: expectedRelations.length,
204
+ totalExtracted: extractedRelations.length
205
+ };
206
+ }
207
+ /**
208
+ * 메트릭이 임계값을 만족하는지 확인
209
+ *
210
+ * Given: 품질 메트릭과 임계값
211
+ * When: 각 메트릭이 임계값 이상인지 확인
212
+ * Then: 검증 결과 반환
213
+ */
214
+ validateThresholds(metrics, thresholds) {
215
+ const failures = [];
216
+ if (thresholds.precision !== undefined && metrics.precision < thresholds.precision) {
217
+ failures.push({
218
+ metric: 'precision',
219
+ expected: thresholds.precision,
220
+ actual: metrics.precision
221
+ });
222
+ }
223
+ if (thresholds.recall !== undefined && metrics.recall < thresholds.recall) {
224
+ failures.push({
225
+ metric: 'recall',
226
+ expected: thresholds.recall,
227
+ actual: metrics.recall
228
+ });
229
+ }
230
+ if (thresholds.f1Score !== undefined && metrics.f1Score < thresholds.f1Score) {
231
+ failures.push({
232
+ metric: 'f1Score',
233
+ expected: thresholds.f1Score,
234
+ actual: metrics.f1Score
235
+ });
236
+ }
237
+ return {
238
+ passed: failures.length === 0,
239
+ failures
240
+ };
241
+ }
242
+ /**
243
+ * 혼동 행렬 계산
244
+ * 실제 관계 유형과 예측 관계 유형의 매칭 행렬
245
+ *
246
+ * Given: 매칭 결과
247
+ * When: 실제 관계 유형과 예측 관계 유형을 매핑
248
+ * Then: 혼동 행렬 반환
249
+ */
250
+ calculateConfusionMatrix(matches) {
251
+ const relationTypes = ALL_RELATION_TYPES;
252
+ // 혼동 행렬 초기화
253
+ const matrix = {
254
+ CAUSES: { CAUSES: 0, DEPENDS_ON: 0, FOLLOWS: 0, CONTRASTS_WITH: 0, REFERENCES: 0, BELONGS_TO: 0 },
255
+ DEPENDS_ON: { CAUSES: 0, DEPENDS_ON: 0, FOLLOWS: 0, CONTRASTS_WITH: 0, REFERENCES: 0, BELONGS_TO: 0 },
256
+ FOLLOWS: { CAUSES: 0, DEPENDS_ON: 0, FOLLOWS: 0, CONTRASTS_WITH: 0, REFERENCES: 0, BELONGS_TO: 0 },
257
+ CONTRASTS_WITH: { CAUSES: 0, DEPENDS_ON: 0, FOLLOWS: 0, CONTRASTS_WITH: 0, REFERENCES: 0, BELONGS_TO: 0 },
258
+ REFERENCES: { CAUSES: 0, DEPENDS_ON: 0, FOLLOWS: 0, CONTRASTS_WITH: 0, REFERENCES: 0, BELONGS_TO: 0 },
259
+ BELONGS_TO: { CAUSES: 0, DEPENDS_ON: 0, FOLLOWS: 0, CONTRASTS_WITH: 0, REFERENCES: 0, BELONGS_TO: 0 }
260
+ };
261
+ // 매칭 결과를 기반으로 혼동 행렬 채우기
262
+ for (const match of matches) {
263
+ const actualType = match.expected.expected_relation_type;
264
+ if (match.extracted) {
265
+ const predictedType = match.extracted.relation_type;
266
+ matrix[actualType][predictedType]++;
267
+ }
268
+ else {
269
+ // 추출되지 않은 경우는 false negative로 처리 (실제 유형 -> null)
270
+ // 혼동 행렬에서는 실제 유형의 총합에만 포함
271
+ }
272
+ }
273
+ // 관계 유형별 정확도 계산
274
+ const typeAccuracy = {
275
+ CAUSES: 0,
276
+ DEPENDS_ON: 0,
277
+ FOLLOWS: 0,
278
+ CONTRASTS_WITH: 0,
279
+ REFERENCES: 0,
280
+ BELONGS_TO: 0
281
+ };
282
+ for (const type of relationTypes) {
283
+ const totalForType = matches.filter(m => m.expected.expected_relation_type === type).length;
284
+ if (totalForType === 0) {
285
+ typeAccuracy[type] = 0;
286
+ }
287
+ else {
288
+ const correct = matrix[type][type]; // 올바르게 분류된 개수
289
+ typeAccuracy[type] = correct / totalForType;
290
+ }
291
+ }
292
+ // 전체 정확도 계산
293
+ const totalMatches = matches.length;
294
+ const totalCorrect = relationTypes.reduce((sum, type) => sum + matrix[type][type], 0);
295
+ const overallAccuracy = totalMatches === 0 ? 0 : totalCorrect / totalMatches;
296
+ return {
297
+ matrix,
298
+ overallAccuracy,
299
+ typeAccuracy
300
+ };
301
+ }
302
+ /**
303
+ * 관계 유형별 상세 분석
304
+ *
305
+ * Given: 매칭 결과, 추출된 관계, 예상 관계, 관계 유형
306
+ * When: 상세 통계 및 혼동 분석 수행
307
+ * Then: 관계 유형별 상세 분석 반환
308
+ */
309
+ analyzeRelationType(matches, extractedRelations, expectedRelations, relationType) {
310
+ // 기본 메트릭 계산
311
+ const basicMetrics = this.calculateTypeMetrics(matches, extractedRelations, expectedRelations, relationType);
312
+ // 해당 관계 유형의 추출된 관계 필터링
313
+ const extractedForType = extractedRelations.filter(ext => ext.relation_type === relationType);
314
+ // 신뢰도 통계 계산
315
+ const confidences = extractedForType.map(ext => ext.confidence);
316
+ const averageConfidence = confidences.length === 0
317
+ ? 0
318
+ : confidences.reduce((sum, c) => sum + c, 0) / confidences.length;
319
+ // 표준편차 계산
320
+ const variance = confidences.length === 0
321
+ ? 0
322
+ : confidences.reduce((sum, c) => sum + Math.pow(c - averageConfidence, 2), 0) / confidences.length;
323
+ const confidenceStdDev = Math.sqrt(variance);
324
+ const minConfidence = confidences.length === 0 ? 0 : Math.min(...confidences);
325
+ const maxConfidence = confidences.length === 0 ? 0 : Math.max(...confidences);
326
+ // 혼동 행렬 계산 (이 관계 유형이 다른 관계 유형으로 잘못 분류된 횟수)
327
+ const confusionMatrix = {
328
+ CAUSES: 0,
329
+ DEPENDS_ON: 0,
330
+ FOLLOWS: 0,
331
+ CONTRASTS_WITH: 0,
332
+ REFERENCES: 0,
333
+ BELONGS_TO: 0
334
+ };
335
+ // 예상 관계 유형이 relationType인데 다른 유형으로 추출된 경우
336
+ const matchesForType = matches.filter(m => m.expected.expected_relation_type === relationType && m.extracted !== null);
337
+ for (const match of matchesForType) {
338
+ if (match.extracted && match.extracted.relation_type !== relationType) {
339
+ confusionMatrix[match.extracted.relation_type]++;
340
+ }
341
+ }
342
+ // 가장 많이 혼동되는 관계 유형 찾기
343
+ let mostConfusedWith = null;
344
+ let maxConfusion = 0;
345
+ for (const [type, count] of Object.entries(confusionMatrix)) {
346
+ if (count > maxConfusion) {
347
+ maxConfusion = count;
348
+ mostConfusedWith = type;
349
+ }
350
+ }
351
+ // 혼동 비율 계산 (전체 추출 중 잘못 분류된 비율)
352
+ const totalExtracted = extractedForType.length;
353
+ const totalConfused = Object.values(confusionMatrix).reduce((sum, count) => sum + count, 0);
354
+ const confusionRate = totalExtracted === 0 ? 0 : totalConfused / totalExtracted;
355
+ return {
356
+ relationType,
357
+ precision: basicMetrics.precision,
358
+ recall: basicMetrics.recall,
359
+ f1Score: basicMetrics.f1Score,
360
+ truePositives: basicMetrics.truePositives,
361
+ falsePositives: basicMetrics.falsePositives,
362
+ falseNegatives: basicMetrics.falseNegatives,
363
+ averageConfidence,
364
+ confidenceStdDev,
365
+ minConfidence,
366
+ maxConfidence,
367
+ confusionMatrix,
368
+ mostConfusedWith,
369
+ confusionRate
370
+ };
371
+ }
372
+ /**
373
+ * 모든 관계 유형별 상세 분석 수행
374
+ *
375
+ * Given: 매칭 결과, 추출된 관계, 예상 관계
376
+ * When: 모든 관계 유형에 대해 상세 분석 수행
377
+ * Then: 관계 유형별 상세 분석 맵 반환
378
+ */
379
+ analyzeAllRelationTypes(matches, extractedRelations, expectedRelations) {
380
+ const relationTypes = ALL_RELATION_TYPES;
381
+ // 모든 관계 유형에 대해 분석 수행
382
+ const analysis = {
383
+ CAUSES: this.analyzeRelationType(matches, extractedRelations, expectedRelations, 'CAUSES'),
384
+ DEPENDS_ON: this.analyzeRelationType(matches, extractedRelations, expectedRelations, 'DEPENDS_ON'),
385
+ FOLLOWS: this.analyzeRelationType(matches, extractedRelations, expectedRelations, 'FOLLOWS'),
386
+ CONTRASTS_WITH: this.analyzeRelationType(matches, extractedRelations, expectedRelations, 'CONTRASTS_WITH'),
387
+ REFERENCES: this.analyzeRelationType(matches, extractedRelations, expectedRelations, 'REFERENCES'),
388
+ BELONGS_TO: this.analyzeRelationType(matches, extractedRelations, expectedRelations, 'BELONGS_TO')
389
+ };
390
+ return analysis;
391
+ }
392
+ /**
393
+ * 전체 품질 메트릭 계산 (상세 분석 포함)
394
+ *
395
+ * Given: 예상 관계 목록과 추출된 관계 목록
396
+ * When: 모든 메트릭 및 상세 분석 계산
397
+ * Then: 완전한 품질 메트릭 반환 (관계 유형별 분석 및 혼동 행렬 포함)
398
+ */
399
+ calculateQualityMetricsWithAnalysis(expectedRelations, extractedRelations) {
400
+ // 기본 메트릭 계산
401
+ const metrics = this.calculateQualityMetrics(expectedRelations, extractedRelations);
402
+ // 관계 매칭
403
+ const matches = this.matchRelations(expectedRelations, extractedRelations);
404
+ // 관계 유형별 상세 분석
405
+ const typeAnalysis = this.analyzeAllRelationTypes(matches, extractedRelations, expectedRelations);
406
+ // 혼동 행렬 계산
407
+ const confusionMatrix = this.calculateConfusionMatrix(matches);
408
+ return {
409
+ ...metrics,
410
+ typeAnalysis,
411
+ confusionMatrix
412
+ };
413
+ }
414
+ }
415
+ //# sourceMappingURL=relation-quality-validator.js.map