Spaces:
Sleeping
Sleeping
Upload 2 files
Browse files- cleaned_iau_reviews.csv +0 -0
- my_logic.py +16 -30
cleaned_iau_reviews.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
my_logic.py
CHANGED
|
@@ -1,8 +1,9 @@
|
|
| 1 |
-
|
| 2 |
from collections import defaultdict
|
| 3 |
from difflib import SequenceMatcher
|
| 4 |
|
| 5 |
-
#
|
|
|
|
| 6 |
|
| 7 |
def similar(a, b):
|
| 8 |
return SequenceMatcher(None, a, b).ratio()
|
|
@@ -55,9 +56,9 @@ def build_strict_context(reviews, user_question):
|
|
| 55 |
else:
|
| 56 |
filtered = reviews
|
| 57 |
|
| 58 |
-
result = f"👨🏫 استاد: {best_prof or '[نامشخص]'} — 📚 درس: {best_course or '[نامشخص]'}
|
| 59 |
for i, r in enumerate(filtered, 1):
|
| 60 |
-
result += f"{i}. {r['comment'].strip()}
|
| 61 |
return result
|
| 62 |
|
| 63 |
def truncate_reviews_to_fit(reviews, max_chars=127000):
|
|
@@ -72,29 +73,16 @@ def truncate_reviews_to_fit(reviews, max_chars=127000):
|
|
| 72 |
return final
|
| 73 |
|
| 74 |
def answer_question(user_question, model):
|
| 75 |
-
print(f"
|
| 76 |
-
retrieved =
|
| 77 |
-
print(f"🔍 FAISS returned {len(retrieved)} raw rows")
|
| 78 |
-
retrieved = filter_relevant(retrieved, user_question)
|
| 79 |
-
print(f"✅ After filter_relevant(): {len(retrieved)} rows")
|
| 80 |
-
keyword_hits = keyword_match_reviews(user_question, metadata)
|
| 81 |
-
print(f"🔠 Keyword hits found: {len(keyword_hits)}")
|
| 82 |
-
existing_links = set(r["link"] for r in retrieved)
|
| 83 |
-
added = 0
|
| 84 |
-
for r in keyword_hits:
|
| 85 |
-
if r["link"] not in existing_links:
|
| 86 |
-
retrieved.append(r)
|
| 87 |
-
added += 1
|
| 88 |
-
print(f"➕ Added {added} unique fallback keyword rows")
|
| 89 |
-
print(f"📊 Total before truncation: {len(retrieved)}")
|
| 90 |
if not retrieved:
|
| 91 |
return "❌ هیچ تجربهای در مورد سوال شما در دادههای کانال یافت نشد."
|
|
|
|
| 92 |
retrieved.sort(key=lambda r: relevance_score(r, user_question), reverse=True)
|
| 93 |
retrieved = truncate_reviews_to_fit(retrieved)
|
| 94 |
-
print(f"✂️ After truncation: {len(retrieved)} rows")
|
| 95 |
context = build_strict_context(retrieved, user_question)
|
| 96 |
-
|
| 97 |
-
prompt = f"""شما یک دستیار هوشمند انتخاب واحد هستید که فقط و فقط بر اساس نظرات واقعی دانشجویان از کانال @IAUCourseExp پاسخ میدهید.
|
| 98 |
|
| 99 |
❗ قوانین مهم:
|
| 100 |
- فقط از دادههای همین نظرات استفاده کن. هیچ اطلاعات اضافی، حدسی یا اینترنتی استفاده نکن.
|
|
@@ -104,20 +92,18 @@ def answer_question(user_question, model):
|
|
| 104 |
• مقایسه چند استاد برای یک درس
|
| 105 |
• معرفی بهترین یا بدترین استادهای یک درس
|
| 106 |
• تحلیل نظر کلی دانشجویان درمورد یک درس خاص
|
| 107 |
-
|
| 108 |
-
-
|
| 109 |
-
- برای هر نظر، لینک تلگرام مربوطه را نیز حتماً ذکر کن.
|
| 110 |
-
- در پایان پاسخ، نتیجهگیری نهایی خود را بنویس: آیا این استاد برای این درس توصیه میشود یا نه — فقط بر اساس همین نظرات.
|
| 111 |
-
- در انتها حتماً بنویس:
|
| 112 |
-
📊 این پاسخ بر اساس بررسی {len(retrieved)} نظر دانشجویی نوشته شده است.
|
| 113 |
|
| 114 |
🔎 سوال دانشجو:
|
| 115 |
{user_question}
|
| 116 |
|
| 117 |
-
📄 نظرات
|
| 118 |
{context}
|
| 119 |
|
| 120 |
📘 پاسخ نهایی:
|
|
|
|
| 121 |
"""
|
|
|
|
| 122 |
response = model.generate_content(prompt)
|
| 123 |
-
return response.text
|
|
|
|
| 1 |
+
import pandas as pd
|
| 2 |
from collections import defaultdict
|
| 3 |
from difflib import SequenceMatcher
|
| 4 |
|
| 5 |
+
# Load reviews CSV
|
| 6 |
+
metadata = pd.read_csv("cleaned_iau_reviews.csv").to_dict(orient="records")
|
| 7 |
|
| 8 |
def similar(a, b):
|
| 9 |
return SequenceMatcher(None, a, b).ratio()
|
|
|
|
| 56 |
else:
|
| 57 |
filtered = reviews
|
| 58 |
|
| 59 |
+
result = f"👨🏫 استاد: {best_prof or '[نامشخص]'} — 📚 درس: {best_course or '[نامشخص]'}\n💬 نظرات:\n"
|
| 60 |
for i, r in enumerate(filtered, 1):
|
| 61 |
+
result += f"{i}. {r['comment'].strip()}\n🔗 لینک: {r['link']}\n\n"
|
| 62 |
return result
|
| 63 |
|
| 64 |
def truncate_reviews_to_fit(reviews, max_chars=127000):
|
|
|
|
| 73 |
return final
|
| 74 |
|
| 75 |
def answer_question(user_question, model):
|
| 76 |
+
print(f"\n🧠 Starting debug for question: {user_question}")
|
| 77 |
+
retrieved = keyword_match_reviews(user_question, metadata)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 78 |
if not retrieved:
|
| 79 |
return "❌ هیچ تجربهای در مورد سوال شما در دادههای کانال یافت نشد."
|
| 80 |
+
|
| 81 |
retrieved.sort(key=lambda r: relevance_score(r, user_question), reverse=True)
|
| 82 |
retrieved = truncate_reviews_to_fit(retrieved)
|
|
|
|
| 83 |
context = build_strict_context(retrieved, user_question)
|
| 84 |
+
|
| 85 |
+
prompt = f"""شما یک دستیار هوشمند انتخاب واحد هستید که فقط و فقط بر اساس نظرات واقعی دانشجویان از کانال @IAUCourseExp پاسخ میدهید.
|
| 86 |
|
| 87 |
❗ قوانین مهم:
|
| 88 |
- فقط از دادههای همین نظرات استفاده کن. هیچ اطلاعات اضافی، حدسی یا اینترنتی استفاده نکن.
|
|
|
|
| 92 |
• مقایسه چند استاد برای یک درس
|
| 93 |
• معرفی بهترین یا بدترین استادهای یک درس
|
| 94 |
• تحلیل نظر کلی دانشجویان درمورد یک درس خاص
|
| 95 |
+
- همهی نظرات مربوطه را تحلیل کن و لینکشان را هم بنویس.
|
| 96 |
+
- نتیجهگیری نهایی در انتها اضافه کن.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 97 |
|
| 98 |
🔎 سوال دانشجو:
|
| 99 |
{user_question}
|
| 100 |
|
| 101 |
+
📄 نظرات دانشجویان:
|
| 102 |
{context}
|
| 103 |
|
| 104 |
📘 پاسخ نهایی:
|
| 105 |
+
📊 این پاسخ بر اساس بررسی {len(retrieved)} نظر دانشجویی نوشته شده است.
|
| 106 |
"""
|
| 107 |
+
|
| 108 |
response = model.generate_content(prompt)
|
| 109 |
+
return response.text
|