| def generate_explanation(originality_score: float, similarity_results, query_features) -> str: |
| explanation = [] |
| explanation.append(f"Originality Score: {originality_score:.2f}%") |
| |
| if originality_score < 40.0: |
| explanation.append("Classification: LOW ORIGINALITY (High Duplicate Risk)\n") |
| elif originality_score < 75.0: |
| explanation.append("Classification: MEDIUM ORIGINALITY (Moderate Similarity)\n") |
| else: |
| explanation.append("Classification: HIGH ORIGINALITY (Novel Idea)\n") |
| |
| explanation.append("Top Similar Projects in Database:") |
| |
| |
| for idx, row in similarity_results.iterrows(): |
| title = row.get("project_title", "Unknown Title") |
| score = row.get("hybrid_score", 0.0) * 100 |
| explanation.append(f"- \"{title}\" (Similarity Score: {score:.1f}%)") |
| |
| explanation.append("\nConcept Matching Analysis:") |
| |
| if len(similarity_results) > 0: |
| best_row = similarity_results.iloc[0] |
| matched_feats = best_row.get("matched_features", []) |
| unique_feats = best_row.get("unique_query_features", []) |
| |
| explanation.append("Matched Concepts (Shared with database):") |
| if matched_feats: |
| for item in matched_feats: |
| if isinstance(item, dict) and 'feature_a' in item and 'feature_b' in item: |
| explanation.append(f" * \"{item['feature_a']}\" matched with \"{item['feature_b']}\"") |
| else: |
| explanation.append(f" * \"{item}\"") |
| else: |
| explanation.append(" * No shared concepts found.") |
| |
| explanation.append("\nUnique Concepts (Exclusive to this project):") |
| if unique_feats: |
| for item in unique_feats: |
| explanation.append(f" * \"{item}\"") |
| else: |
| explanation.append(" * No unique concepts identified.") |
| |
| return "\n".join(explanation) |
|
|