casamN commited on
Commit
40084ed
·
verified ·
1 Parent(s): bb29e3b

Update modules/proverbs.py

Browse files
Files changed (1) hide show
  1. modules/proverbs.py +166 -13
modules/proverbs.py CHANGED
@@ -1,23 +1,176 @@
1
- from rapidfuzz import process
 
 
2
 
3
- def search_proverb(text, df):
 
 
4
 
5
- choices = df["Kiembu"].astype(str).tolist()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
 
7
- match = process.extractOne(
8
- text,
9
- choices
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  )
11
 
12
- if match:
13
 
14
- row = df[
15
- df["Kiembu"] == match[0]
16
- ]
 
 
 
17
 
18
  return (
19
- f"Kiembu: {row.iloc[0]['Kiembu']}\n\n"
20
- f"English: {row.iloc[0]['English']}"
21
  )
22
 
23
- return "No proverb found"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import pandas as pd
3
+ from rapidfuzz import process, fuzz
4
 
5
+ # ============================================================
6
+ # DATA LOCATION
7
+ # ============================================================
8
 
9
+ BASE_DIR = os.path.dirname(
10
+ os.path.dirname(
11
+ os.path.abspath(__file__)
12
+ )
13
+ )
14
+
15
+ PROVERB_FILE = os.path.join(
16
+ BASE_DIR,
17
+ "data",
18
+ "proverbs.csv"
19
+ )
20
+
21
+ # ============================================================
22
+ # LOAD PROVERBS
23
+ # ============================================================
24
+
25
+ def load_proverbs():
26
+
27
+ try:
28
+
29
+ df = pd.read_csv(
30
+ PROVERB_FILE,
31
+ encoding="utf-8"
32
+ )
33
+
34
+ df.columns = (
35
+ df.columns
36
+ .str.strip()
37
+ )
38
+
39
+ df.fillna("", inplace=True)
40
+
41
+ print("Proverbs loaded successfully")
42
+ print("Columns:", df.columns.tolist())
43
+ print("Records:", len(df))
44
+
45
+ return df
46
+
47
+ except Exception as e:
48
+
49
+ print(
50
+ f"Proverb loading error: {e}"
51
+ )
52
+
53
+ return pd.DataFrame()
54
+
55
+ # ============================================================
56
+ # GLOBAL DATAFRAME
57
+ # ============================================================
58
+
59
+ proverb_df = load_proverbs()
60
+
61
+ # ============================================================
62
+ # SEARCH PROVERB
63
+ # ============================================================
64
+
65
+ def search_proverb(text, df=None):
66
+
67
+ if df is None:
68
+ df = proverb_df
69
+
70
+ if df.empty:
71
+ return "Proverb database unavailable."
72
+
73
+ if not text:
74
+ return "Please enter a proverb or keyword."
75
+
76
+ query = text.strip()
77
+
78
+ if not query:
79
+ return "Please enter a proverb or keyword."
80
+
81
+ # ========================================================
82
+ # VERIFY REQUIRED COLUMNS
83
+ # ========================================================
84
 
85
+ required_columns = ["Kiembu", "English"]
86
+
87
+ for col in required_columns:
88
+
89
+ if col not in df.columns:
90
+
91
+ return (
92
+ f"Missing column '{col}' "
93
+ f"in proverbs.csv"
94
+ )
95
+
96
+ # ========================================================
97
+ # EXACT MATCH
98
+ # ========================================================
99
+
100
+ exact_match = df[
101
+ df["Kiembu"]
102
+ .astype(str)
103
+ .str.lower()
104
+ .str.strip()
105
+ == query.lower()
106
+ ]
107
+
108
+ if not exact_match.empty:
109
+
110
+ proverb = exact_match.iloc[0]["Kiembu"]
111
+ meaning = exact_match.iloc[0]["English"]
112
+
113
+ return f"""
114
+ ### Proverb Found
115
+
116
+ **Kiembu**
117
+
118
+ {proverb}
119
+
120
+ **English Meaning**
121
+
122
+ {meaning}
123
+ """
124
+
125
+ # ========================================================
126
+ # FUZZY SEARCH
127
+ # ========================================================
128
+
129
+ choices = (
130
+ df["Kiembu"]
131
+ .astype(str)
132
+ .tolist()
133
+ )
134
+
135
+ best_match = process.extractOne(
136
+ query,
137
+ choices,
138
+ scorer=fuzz.WRatio
139
  )
140
 
141
+ if not best_match:
142
 
143
+ return "No proverb found."
144
+
145
+ proverb = best_match[0]
146
+ score = best_match[1]
147
+
148
+ if score < 70:
149
 
150
  return (
151
+ "No close proverb found.\n\n"
152
+ f"Best similarity score: {score}"
153
  )
154
 
155
+ row = df[
156
+ df["Kiembu"]
157
+ .astype(str)
158
+ == proverb
159
+ ]
160
+
161
+ if row.empty:
162
+ return "No proverb found."
163
+
164
+ meaning = row.iloc[0]["English"]
165
+
166
+ return f"""
167
+ ### Suggested Proverb
168
+
169
+ **Kiembu**
170
+
171
+ {proverb}
172
+
173
+ **English Meaning**
174
+
175
+ {meaning}
176
+ """