NRF_LLM / modules /proverbs.py
casamN's picture
Update modules/proverbs.py
40084ed verified
Raw
History Blame Contribute Delete
3.42 kB
import os
import pandas as pd
from rapidfuzz import process, fuzz
# ============================================================
# DATA LOCATION
# ============================================================
BASE_DIR = os.path.dirname(
os.path.dirname(
os.path.abspath(__file__)
)
)
PROVERB_FILE = os.path.join(
BASE_DIR,
"data",
"proverbs.csv"
)
# ============================================================
# LOAD PROVERBS
# ============================================================
def load_proverbs():
try:
df = pd.read_csv(
PROVERB_FILE,
encoding="utf-8"
)
df.columns = (
df.columns
.str.strip()
)
df.fillna("", inplace=True)
print("Proverbs loaded successfully")
print("Columns:", df.columns.tolist())
print("Records:", len(df))
return df
except Exception as e:
print(
f"Proverb loading error: {e}"
)
return pd.DataFrame()
# ============================================================
# GLOBAL DATAFRAME
# ============================================================
proverb_df = load_proverbs()
# ============================================================
# SEARCH PROVERB
# ============================================================
def search_proverb(text, df=None):
if df is None:
df = proverb_df
if df.empty:
return "Proverb database unavailable."
if not text:
return "Please enter a proverb or keyword."
query = text.strip()
if not query:
return "Please enter a proverb or keyword."
# ========================================================
# VERIFY REQUIRED COLUMNS
# ========================================================
required_columns = ["Kiembu", "English"]
for col in required_columns:
if col not in df.columns:
return (
f"Missing column '{col}' "
f"in proverbs.csv"
)
# ========================================================
# EXACT MATCH
# ========================================================
exact_match = df[
df["Kiembu"]
.astype(str)
.str.lower()
.str.strip()
== query.lower()
]
if not exact_match.empty:
proverb = exact_match.iloc[0]["Kiembu"]
meaning = exact_match.iloc[0]["English"]
return f"""
### Proverb Found
**Kiembu**
{proverb}
**English Meaning**
{meaning}
"""
# ========================================================
# FUZZY SEARCH
# ========================================================
choices = (
df["Kiembu"]
.astype(str)
.tolist()
)
best_match = process.extractOne(
query,
choices,
scorer=fuzz.WRatio
)
if not best_match:
return "No proverb found."
proverb = best_match[0]
score = best_match[1]
if score < 70:
return (
"No close proverb found.\n\n"
f"Best similarity score: {score}"
)
row = df[
df["Kiembu"]
.astype(str)
== proverb
]
if row.empty:
return "No proverb found."
meaning = row.iloc[0]["English"]
return f"""
### Suggested Proverb
**Kiembu**
{proverb}
**English Meaning**
{meaning}
"""