bat-6 commited on
Commit
63bcd5a
·
1 Parent(s): 2593fcc

add fiels

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .env +2 -0
  2. .vscode/settings.json +3 -0
  3. Data/database/__pycache__/sql_connector.cpython-311.pyc +0 -0
  4. Data/database/__pycache__/sql_connector.cpython-313.pyc +0 -0
  5. Data/database/sql_connector.py +60 -0
  6. Dockerfile +20 -0
  7. Notebooks/TEST.ipynb +0 -0
  8. Notebooks/test2.ipynb +0 -0
  9. api/__init__.py +2 -0
  10. api/__pycache__/__init__.cpython-311.pyc +0 -0
  11. api/__pycache__/__init__.cpython-312.pyc +0 -0
  12. api/__pycache__/__init__.cpython-313.pyc +0 -0
  13. api/__pycache__/main.cpython-311.pyc +0 -0
  14. api/__pycache__/main.cpython-312.pyc +0 -0
  15. api/__pycache__/main.cpython-313.pyc +0 -0
  16. api/__pycache__/schemas.cpython-311.pyc +0 -0
  17. api/__pycache__/schemas.cpython-312.pyc +0 -0
  18. api/__pycache__/schemas.cpython-313.pyc +0 -0
  19. api/__pycache__/services.cpython-311.pyc +0 -0
  20. api/__pycache__/services.cpython-312.pyc +0 -0
  21. api/__pycache__/services.cpython-313.pyc +0 -0
  22. api/main.py +70 -0
  23. api/schemas.py +49 -0
  24. api/services.py +249 -0
  25. models/faiss_index.bin +3 -0
  26. models/metadata.parquet +3 -0
  27. models/project_embeddings.npy +3 -0
  28. models/trained_metadata.parquet +3 -0
  29. models/trained_metadata.pkl +0 -0
  30. requirements.txt +18 -0
  31. src/__pycache__/Embedding.cpython-312.pyc +0 -0
  32. src/__pycache__/Hybrid_similarity.cpython-312.pyc +0 -0
  33. src/__pycache__/__init__.cpython-311.pyc +0 -0
  34. src/__pycache__/__init__.cpython-312.pyc +0 -0
  35. src/__pycache__/concept_similarity.cpython-312.pyc +0 -0
  36. src/__pycache__/embedding_engine.cpython-311.pyc +0 -0
  37. src/__pycache__/embedding_engine.cpython-312.pyc +0 -0
  38. src/__pycache__/evaluation.cpython-312.pyc +0 -0
  39. src/__pycache__/feature_similarity.cpython-311.pyc +0 -0
  40. src/__pycache__/feature_similarity.cpython-312.pyc +0 -0
  41. src/__pycache__/hybrid_ranker.cpython-311.pyc +0 -0
  42. src/__pycache__/hybrid_ranker.cpython-312.pyc +0 -0
  43. src/__pycache__/preprocess.cpython-312.pyc +0 -0
  44. src/__pycache__/preprocessing.cpython-311.pyc +0 -0
  45. src/__pycache__/preprocessing.cpython-312.pyc +0 -0
  46. src/__pycache__/semantic_search.cpython-311.pyc +0 -0
  47. src/__pycache__/semantic_search.cpython-312.pyc +0 -0
  48. src/__pycache__/semantic_similarity.cpython-312.pyc +0 -0
  49. src/__pycache__/similarity_engine.cpython-311.pyc +0 -0
  50. src/__pycache__/similarity_engine.cpython-312.pyc +0 -0
.env ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ GEMINI_API_KEY=AIzaSyAkFsaN3BKoSQmRW4FzTahhZXbq-ldsDZ4
2
+ GEMINI_MODEL_NAME=gemini-2.5-flash
.vscode/settings.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ {
2
+ "git.ignoreLimitWarning": true
3
+ }
Data/database/__pycache__/sql_connector.cpython-311.pyc ADDED
Binary file (1.95 kB). View file
 
Data/database/__pycache__/sql_connector.cpython-313.pyc ADDED
Binary file (1.74 kB). View file
 
Data/database/sql_connector.py ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from sqlalchemy import create_engine
2
+ import pandas as pd
3
+ import urllib
4
+ import json
5
+
6
+ SERVER = "innotrack-sql-server.database.windows.net"
7
+ DATABASE = "InnoTrackDB"
8
+ USERNAME = "innotrackadmin"
9
+ PASSWORD = "Innotrack@admin233"
10
+
11
+ params = urllib.parse.quote_plus(
12
+ f"DRIVER={{ODBC Driver 18 for SQL Server}};"
13
+ f"SERVER={SERVER};"
14
+ f"DATABASE={DATABASE};"
15
+ f"UID={USERNAME};"
16
+ f"PWD={PASSWORD};"
17
+ "Encrypt=yes;"
18
+ "TrustServerCertificate=no;"
19
+ "Connection Timeout=30;"
20
+ )
21
+
22
+ connection_string = (
23
+ f"mssql+pyodbc:///?odbc_connect={params}"
24
+ )
25
+
26
+ engine = create_engine(connection_string)
27
+
28
+ try:
29
+
30
+ with engine.connect() as conn:
31
+ print("SQL Connected Successfully")
32
+
33
+ except Exception as e:
34
+ print("Connection Failed")
35
+ print(e)
36
+
37
+
38
+
39
+
40
+
41
+ def load_preprocessed_projects():
42
+
43
+ query = """
44
+ SELECT *
45
+ FROM PreProcessed_Projects
46
+ """
47
+
48
+ df = pd.read_sql(
49
+ query,
50
+ engine
51
+ )
52
+
53
+ if "features" in df.columns:
54
+
55
+ df["features"] = (
56
+ df["features"]
57
+ .apply(json.loads)
58
+ )
59
+
60
+ return df
Dockerfile ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.11-slim
2
+
3
+ RUN useradd -m -u 1000 user
4
+
5
+ USER user
6
+
7
+ ENV HOME=/home/user \
8
+ PATH=/home/user/.local/bin:$PATH \
9
+ PYTHONUNBUFFERED=1
10
+
11
+ WORKDIR $HOME/app
12
+
13
+ COPY --chown=user requirements.txt requirements.txt
14
+
15
+ RUN pip install --no-cache-dir --upgrade pip && \
16
+ pip install --no-cache-dir -r requirements.txt
17
+
18
+ COPY --chown=user . .
19
+
20
+ CMD ["uvicorn", "api.main:app", "--host", "0.0.0.0", "--port", "7860"]
Notebooks/TEST.ipynb ADDED
The diff for this file is too large to render. See raw diff
 
Notebooks/test2.ipynb ADDED
File without changes
api/__init__.py ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # __init__.py
2
+ # empty file is totally fine
api/__pycache__/__init__.cpython-311.pyc ADDED
Binary file (145 Bytes). View file
 
api/__pycache__/__init__.cpython-312.pyc ADDED
Binary file (153 Bytes). View file
 
api/__pycache__/__init__.cpython-313.pyc ADDED
Binary file (149 Bytes). View file
 
api/__pycache__/main.cpython-311.pyc ADDED
Binary file (1.75 kB). View file
 
api/__pycache__/main.cpython-312.pyc ADDED
Binary file (1.63 kB). View file
 
api/__pycache__/main.cpython-313.pyc ADDED
Binary file (1.97 kB). View file
 
api/__pycache__/schemas.cpython-311.pyc ADDED
Binary file (1.81 kB). View file
 
api/__pycache__/schemas.cpython-312.pyc ADDED
Binary file (1.47 kB). View file
 
api/__pycache__/schemas.cpython-313.pyc ADDED
Binary file (2.1 kB). View file
 
api/__pycache__/services.cpython-311.pyc ADDED
Binary file (2.49 kB). View file
 
api/__pycache__/services.cpython-312.pyc ADDED
Binary file (1.47 kB). View file
 
api/__pycache__/services.cpython-313.pyc ADDED
Binary file (2.98 kB). View file
 
api/main.py ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # api/main.py
2
+
3
+ from fastapi import FastAPI
4
+ from fastapi.middleware.cors import CORSMiddleware
5
+
6
+ from api.schemas import AnalyzeRequest, ChatRequest, ChatResponse
7
+ from api.services import analyze_project, chat_with_llm
8
+
9
+ # =====================================================
10
+ # Create App
11
+ # =====================================================
12
+ app = FastAPI(
13
+ title="Graduation Project Similarity API",
14
+ version="1.0.0",
15
+ description="AI system for project similarity and originality detection"
16
+ )
17
+
18
+ # =====================================================
19
+ # CORS
20
+ # =====================================================
21
+ app.add_middleware(
22
+ CORSMiddleware,
23
+ allow_origins=["*"],
24
+ allow_credentials=True,
25
+ allow_methods=["*"],
26
+ allow_headers=["*"],
27
+ )
28
+
29
+ # =====================================================
30
+ # Routes
31
+ # =====================================================
32
+
33
+ @app.get("/")
34
+ def home():
35
+ return {
36
+ "message": "API is running successfully"
37
+ }
38
+
39
+
40
+ @app.get("/health")
41
+ def health():
42
+ return {
43
+ "status": "healthy"
44
+ }
45
+
46
+
47
+ @app.post("/analyze")
48
+ def analyze(data: AnalyzeRequest):
49
+
50
+ result = analyze_project(
51
+ title=data.title,
52
+ description=data.description,
53
+ abstract=data.abstract,
54
+ features=data.features,
55
+ top_k=data.top_k
56
+ )
57
+
58
+ return result
59
+
60
+
61
+ @app.post("/chat", response_model=ChatResponse)
62
+ def chat(data: ChatRequest):
63
+
64
+ result = chat_with_llm(
65
+ user_id=data.user_id,
66
+ message=data.message
67
+ )
68
+
69
+ return result
70
+
api/schemas.py ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # api/schemas.py
2
+
3
+ from typing import List, Optional
4
+ from pydantic import BaseModel, Field
5
+
6
+
7
+ # =====================================================
8
+ # Request Schema
9
+ # =====================================================
10
+ class AnalyzeRequest(BaseModel):
11
+ title: str = Field(..., min_length=3)
12
+ description: str = Field(..., min_length=5)
13
+
14
+ abstract: Optional[str] = ""
15
+ features: Optional[List[str]] = []
16
+ top_k: Optional[int] = 5
17
+
18
+
19
+ class ChatRequest(BaseModel):
20
+ user_id: str = Field("default_user", min_length=1)
21
+ message: str = Field(..., min_length=1)
22
+
23
+
24
+ class ChatResponse(BaseModel):
25
+ user_id: str
26
+ response: str
27
+
28
+
29
+ # =====================================================
30
+ # Result Item
31
+ # =====================================================
32
+ class SimilarProject(BaseModel):
33
+ project_id: int
34
+ project_title: str
35
+
36
+ semantic_score: float
37
+ feature_score: float
38
+ hybrid_score: float
39
+
40
+ originality_score: float
41
+ duplicate_risk: str
42
+
43
+
44
+ # =====================================================
45
+ # Response Schema
46
+ # =====================================================
47
+ class AnalyzeResponse(BaseModel):
48
+ extracted_features: List[str]
49
+ results: List[SimilarProject]
api/services.py ADDED
@@ -0,0 +1,249 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # # api/services.py
2
+
3
+ # import pandas as pd
4
+
5
+ # from src.similarity_engine import find_similar_projects
6
+ # from src.preprocessing import extract_features
7
+
8
+
9
+ # # =====================================================
10
+ # # Main Analyze Service
11
+ # # =====================================================
12
+ # def analyze_project(
13
+ # title: str,
14
+ # description: str,
15
+ # abstract: str = "",
16
+ # features=None,
17
+ # top_k: int = 5
18
+ # ):
19
+ # """
20
+ # Full project analysis service
21
+ # """
22
+
23
+ # if features is None:
24
+ # features = []
25
+
26
+ # # ---------------------------------------------
27
+ # # Build text for auto feature extraction
28
+ # # ---------------------------------------------
29
+ # full_text = f"{title}. {abstract}. {description}"
30
+
31
+ # auto_features = extract_features(full_text)
32
+
33
+ # # merge manual + auto
34
+ # merged = []
35
+ # seen = set()
36
+
37
+ # for item in features + auto_features:
38
+ # val = str(item).strip().lower()
39
+
40
+ # if val and val not in seen:
41
+ # seen.add(val)
42
+ # merged.append(val)
43
+
44
+ # # ---------------------------------------------
45
+ # # Run similarity engine
46
+ # # ---------------------------------------------
47
+ # results = find_similar_projects(
48
+ # title=title,
49
+ # description=f"{abstract} {description}",
50
+ # features=merged,
51
+ # top_k=top_k
52
+ # )
53
+
54
+ # # ---------------------------------------------
55
+ # # Convert dataframe to json records
56
+ # # ---------------------------------------------
57
+ # if isinstance(results, pd.DataFrame):
58
+ # rows = results.to_dict(orient="records")
59
+ # else:
60
+ # rows = []
61
+
62
+ # return {
63
+ # "extracted_features": merged,
64
+ # "results": rows
65
+ # }
66
+
67
+
68
+ # api/services.py
69
+
70
+ # import pandas as pd
71
+
72
+ # from src.similarity_model import find_similar_projects
73
+ # from src.similarity_model import extract_features
74
+
75
+
76
+ # # =====================================================
77
+ # # Main Analyze Service
78
+ # # =====================================================
79
+ # def analyze_project(
80
+ # title: str,
81
+ # description: str,
82
+ # abstract: str = "",
83
+ # features=None,
84
+ # top_k: int = 5
85
+ # ):
86
+ # """
87
+ # Final clean API response
88
+ # Returns only user-needed metrics
89
+ # """
90
+
91
+ # if features is None:
92
+ # features = []
93
+
94
+ # # -------------------------------------------------
95
+ # # Build full text for automatic feature extraction
96
+ # # -------------------------------------------------
97
+ # full_text = f"{title}. {abstract}. {description}"
98
+
99
+ # auto_features = extract_features(full_text)
100
+
101
+ # # -------------------------------------------------
102
+ # # Merge manual + extracted features
103
+ # # -------------------------------------------------
104
+ # merged = []
105
+ # seen = set()
106
+
107
+ # for item in features + auto_features:
108
+ # val = str(item).strip().lower()
109
+
110
+ # if val and val not in seen:
111
+ # seen.add(val)
112
+ # merged.append(val)
113
+
114
+ # # -------------------------------------------------
115
+ # # Run similarity model
116
+ # # -------------------------------------------------
117
+ # results = find_similar_projects(
118
+ # title=title,
119
+ # description=f"{abstract} {description}",
120
+ # features=merged,
121
+ # top_k=top_k
122
+ # )
123
+
124
+ # # -------------------------------------------------
125
+ # # No results found
126
+ # # -------------------------------------------------
127
+ # if not isinstance(results, pd.DataFrame) or len(results) == 0:
128
+ # return {
129
+ # "message": "No similar projects found",
130
+ # "extracted_features": merged
131
+ # }
132
+
133
+ # # -------------------------------------------------
134
+ # # Take top matched project only
135
+ # # -------------------------------------------------
136
+ # top = results.iloc[0]
137
+
138
+ # return {
139
+ # "extracted_features": merged,
140
+
141
+ # "matched_features": top.get(
142
+ # "matched_features", []
143
+ # ),
144
+
145
+ # "unique_features": top.get(
146
+ # "unique_query_features", []
147
+ # ),
148
+
149
+ # "hybrid_similarity": round(
150
+ # float(top.get("hybrid_score", 0)),
151
+ # 4
152
+ # ),
153
+
154
+ # "final_originality_score": round(
155
+ # float(top.get("originality_score", 0)),
156
+ # 4
157
+ # )
158
+ # }
159
+
160
+ import pandas as pd
161
+ from fastapi import HTTPException
162
+
163
+ from src.similarity_model import find_similar_projects
164
+ from src.similarity_model import extract_features
165
+
166
+
167
+ def analyze_project(
168
+ title: str,
169
+ description: str,
170
+ abstract: str = "",
171
+ features=None,
172
+ top_k: int = 5
173
+ ):
174
+
175
+ if features is None:
176
+ features = []
177
+
178
+ full_text = f"{title}. {abstract}. {description}"
179
+
180
+ auto_features = extract_features(full_text)
181
+
182
+ merged = []
183
+ seen = set()
184
+
185
+ for item in features + auto_features:
186
+ val = str(item).strip().lower()
187
+
188
+ if val and val not in seen:
189
+ seen.add(val)
190
+ merged.append(val)
191
+
192
+ results = find_similar_projects(
193
+ title=title,
194
+ description=f"{abstract} {description}",
195
+ features=merged,
196
+ top_k=top_k
197
+ )
198
+
199
+ if not isinstance(results, pd.DataFrame) or len(results) == 0:
200
+ return {
201
+ "message": "No similar projects found",
202
+ "extracted_features": merged
203
+ }
204
+
205
+ # -----------------------------------
206
+ # رجع Top K كله
207
+ # -----------------------------------
208
+ top_projects = []
209
+
210
+ for _, row in results.iterrows():
211
+ top_projects.append({
212
+ "project_title": row.get("project_title", ""),
213
+ "matched_features": row.get("matched_features", []),
214
+ "unique_features": row.get("unique_query_features", []),
215
+ "similarity_score": round(float(row.get("hybrid_score", 0)), 4),
216
+ "final_originality_score": round(float(row.get("originality_score", 0)), 4)
217
+ })
218
+
219
+ return {
220
+ "extracted_features": merged,
221
+ "top_similar_projects": top_projects
222
+ }
223
+
224
+
225
+ def chat_with_llm(user_id: str, message: str):
226
+ try:
227
+ from src.recommendation_engine.chatbot_engine import chatbot
228
+ from src.recommendation_engine.llm_client import LLMProviderError
229
+ except Exception as exc:
230
+ raise HTTPException(
231
+ status_code=503,
232
+ detail=f"LLM service could not start: {exc}"
233
+ )
234
+
235
+ try:
236
+ response = chatbot(
237
+ user_id=user_id,
238
+ user_input=message
239
+ )
240
+ except LLMProviderError as exc:
241
+ raise HTTPException(
242
+ status_code=exc.status_code,
243
+ detail=exc.message
244
+ )
245
+
246
+ return {
247
+ "user_id": user_id,
248
+ "response": response
249
+ }
models/faiss_index.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:cfe09be00eb70151711b1603dcd8a2b67c102f4218647b2a5bb405a2a1932863
3
+ size 392266
models/metadata.parquet ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:40d299cdc20636faf33e0acd77ca5b5322ef3de7e6e539b183a25f4e6bdf96cc
3
+ size 794293
models/project_embeddings.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8c486ea5b29da2d28dec9567e250f365956726afcbcc675fb3d8d6ce43a9986a
3
+ size 49280
models/trained_metadata.parquet ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0450233a4ccc918dd567da002ce44dfe56848ae171e8c66238b18e48b94c35b9
3
+ size 195883
models/trained_metadata.pkl ADDED
File without changes
requirements.txt ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ fastapi
2
+ uvicorn[standard]
3
+ pandas
4
+ numpy
5
+ scikit-learn
6
+ scipy
7
+ sentence-transformers
8
+ faiss-cpu
9
+ keybert
10
+ transformers
11
+ torch
12
+ python-dotenv
13
+ google-genai
14
+ requests
15
+ pyarrow
16
+ sqlalchemy
17
+ pyodbc
18
+ git clone https://bat-6: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@https://huggingface.co/spaces/bat-6/Graduation_Project-v1.2
src/__pycache__/Embedding.cpython-312.pyc ADDED
Binary file (2.25 kB). View file
 
src/__pycache__/Hybrid_similarity.cpython-312.pyc ADDED
Binary file (4.38 kB). View file
 
src/__pycache__/__init__.cpython-311.pyc ADDED
Binary file (145 Bytes). View file
 
src/__pycache__/__init__.cpython-312.pyc ADDED
Binary file (153 Bytes). View file
 
src/__pycache__/concept_similarity.cpython-312.pyc ADDED
Binary file (3.25 kB). View file
 
src/__pycache__/embedding_engine.cpython-311.pyc ADDED
Binary file (10.5 kB). View file
 
src/__pycache__/embedding_engine.cpython-312.pyc ADDED
Binary file (9.54 kB). View file
 
src/__pycache__/evaluation.cpython-312.pyc ADDED
Binary file (4.78 kB). View file
 
src/__pycache__/feature_similarity.cpython-311.pyc ADDED
Binary file (8.74 kB). View file
 
src/__pycache__/feature_similarity.cpython-312.pyc ADDED
Binary file (7.22 kB). View file
 
src/__pycache__/hybrid_ranker.cpython-311.pyc ADDED
Binary file (7.93 kB). View file
 
src/__pycache__/hybrid_ranker.cpython-312.pyc ADDED
Binary file (7.04 kB). View file
 
src/__pycache__/preprocess.cpython-312.pyc ADDED
Binary file (5.43 kB). View file
 
src/__pycache__/preprocessing.cpython-311.pyc ADDED
Binary file (8.67 kB). View file
 
src/__pycache__/preprocessing.cpython-312.pyc ADDED
Binary file (7.64 kB). View file
 
src/__pycache__/semantic_search.cpython-311.pyc ADDED
Binary file (10.7 kB). View file
 
src/__pycache__/semantic_search.cpython-312.pyc ADDED
Binary file (9.28 kB). View file
 
src/__pycache__/semantic_similarity.cpython-312.pyc ADDED
Binary file (4.14 kB). View file
 
src/__pycache__/similarity_engine.cpython-311.pyc ADDED
Binary file (9.72 kB). View file
 
src/__pycache__/similarity_engine.cpython-312.pyc ADDED
Binary file (8.29 kB). View file