-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path8D_FMEA_connection.py
More file actions
72 lines (56 loc) · 1.77 KB
/
8D_FMEA_connection.py
File metadata and controls
72 lines (56 loc) · 1.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
from JSON_FMEA_KB.kb_structure import FMEACauseKB
from JSON8D_KB.kb_structure import CauseKB
def match_8d_cause_to_fmea(
cause_kb: CauseKB,
fmea_kb: FMEACauseKB,
cause_id_8d: str,
similarity_threshold: float = 0.75,
):
# 8D cause vectors
cause_8d = cause_kb.collection.get(
ids=[cause_id_8d],
include=["embeddings", "metadatas"],
)
vec_8d = np.array(cause_8d["embeddings"][0])
meta_8d = cause_8d["metadatas"][0]
# FMEA cause vectors
fmea_all = fmea_kb.collection.get(
include=["embeddings", "metadatas", "ids"],
)
matches = []
for fmea_id, vec_fmea, meta_fmea in zip(
fmea_all["ids"],
fmea_all["embeddings"],
fmea_all["metadatas"],
):
# hard filter
if meta_fmea.get("discipline") != meta_8d.get("discipline"):
continue
sim = cosine_similarity(
[vec_8d],
[vec_fmea],
)[0][0]
if sim >= similarity_threshold:
matches.append({
"fmea_cause_id": fmea_id,
"similarity": float(sim),
"failure_id": meta_fmea.get("failure_id"),
})
# rank
matches.sort(key=lambda x: x["similarity"], reverse=True)
return matches
def main():
BASE_DIR = Path(__file__).resolve().parent
# Root folder containing many FMEA JSON files
FMEA_CAUSE_KB_PATH = BASE_DIR / "JSON_FMEA_KB"/"kb_data"/"fmea_cause_kb"
D_CAUSE_KB_PATH = BASE_DIR / "JSON8D_KB"/"kb_data"/"cause_kb"
cause_kb_fmea = CauseKB(FMEA_CAUSE_KB_PATH)
cause_kb_8D = CauseKB(D_CAUSE_KB_PATH)
match_8d_cause_to_fmea(
cause_kb_fmea,
cause_kb_8D,
)
if __name__ == "__main__":
main()