| import pandas as pd |
| from fastapi import HTTPException |
|
|
| from src.similarity_model import find_similar_projects |
| from src.similarity_model import extract_features |
|
|
|
|
| def analyze_project( |
| title: str, |
| description: str, |
| abstract: str = "", |
| features=None, |
| top_k: int = 5 |
| ): |
|
|
| if features is None: |
| features = [] |
|
|
| full_text = f"{title}. {abstract}. {description}" |
|
|
| auto_features = extract_features(full_text) |
|
|
| merged = [] |
| seen = set() |
|
|
| for item in features + auto_features: |
| val = str(item).strip().lower() |
|
|
| if val and val not in seen: |
| seen.add(val) |
| merged.append(val) |
|
|
| results = find_similar_projects( |
| title=title, |
| description=f"{abstract} {description}", |
| features=merged, |
| top_k=top_k |
| ) |
|
|
| if not isinstance(results, pd.DataFrame) or len(results) == 0: |
| return { |
| "message": "No similar projects found", |
| "extracted_features": merged, |
| "overall_originality_score": 100.0 |
| } |
|
|
| |
| |
| |
| top_projects = [] |
|
|
| for _, row in results.iterrows(): |
| orig_score = round(float(row.get("originality_score", 0)), 2) |
| sim_percent = round(float(row.get("hybrid_score", 0)) * 100, 2) |
|
|
| top_projects.append({ |
| "project_title": row.get("project_title", ""), |
| "project_features": row.get("candidate_features", []), |
| "matched_features": row.get("matched_features", []), |
| "unique_features": row.get("unique_candidate_features", []), |
| "similarity_score": sim_percent, |
| "final_originality_score": orig_score |
| }) |
|
|
| |
| overall_originality_score = top_projects[0]["final_originality_score"] |
|
|
| return { |
| "extracted_features": merged, |
| "overall_originality_score": overall_originality_score, |
| "top_similar_projects": top_projects |
| } |
|
|
|
|
|
|
| def chat_with_llm(user_id: str, message: str): |
| try: |
| from src.recommendation_engine.chatbot_engine import chatbot |
| from src.recommendation_engine.llm_client import LLMProviderError |
| except Exception as exc: |
| raise HTTPException( |
| status_code=503, |
| detail=f"LLM service could not start: {exc}" |
| ) |
|
|
| try: |
| response = chatbot( |
| user_id=user_id, |
| user_input=message |
| ) |
| except LLMProviderError as exc: |
| raise HTTPException( |
| status_code=exc.status_code, |
| detail=exc.message |
| ) |
|
|
| return { |
| "user_id": user_id, |
| "response": response |
| } |
|
|