Update app.py
Browse files
app.py
CHANGED
@@ -13,6 +13,9 @@ import re
|
|
13 |
from collections import defaultdict
|
14 |
from huggingface_hub import hf_hub_download
|
15 |
import json
|
|
|
|
|
|
|
16 |
pattern = r'"(.*?)"'
|
17 |
# this pattern captures anything in a double quotes.
|
18 |
|
@@ -57,9 +60,8 @@ books = load_dataset('FDSRashid/Hadith_info', data_files='Books.csv', token = Se
|
|
57 |
matn_info['Book_ID'] = matn_info['bookid_hadithid'].apply(lambda x: int(x.split('_')[0]))
|
58 |
matn_info['Hadith Number'] = matn_info['bookid_hadithid'].apply(lambda x: int(x.split('_')[1]))
|
59 |
matn_info = pd.merge(matn_info, books, on='Book_ID')
|
60 |
-
|
61 |
-
|
62 |
-
from huggingface_hub import hf_hub_download
|
63 |
|
64 |
# Download and read a file
|
65 |
file_path = hf_hub_download(
|
@@ -80,14 +82,14 @@ def value_to_hex(value):
|
|
80 |
|
81 |
|
82 |
def get_node_info(node):
|
83 |
-
|
84 |
-
|
85 |
-
student_narrations =
|
86 |
-
student_gen =
|
87 |
-
student_rank =
|
88 |
-
node_name =
|
89 |
-
return
|
90 |
-
|
91 |
|
92 |
def visualize_isnad(taraf_num, yaxis):
|
93 |
# Precompute filtered dataframes
|
@@ -128,18 +130,22 @@ def visualize_isnad(taraf_num, yaxis):
|
|
128 |
taraf.iloc[i]['Book_Name'],
|
129 |
taraf.iloc[i]['Author'],
|
130 |
taraf.iloc[i]['Hadith Number'],
|
131 |
-
|
132 |
i
|
133 |
])
|
134 |
|
135 |
# Convert to DataFrame
|
136 |
df = pd.DataFrame(lst_hadith, columns=['Matn', 'Generation', 'Name', 'Book_Name', 'Author', 'Book Hadith Number', 'End Transmitter ID', 'Hadith Number'])
|
|
|
137 |
|
138 |
|
139 |
-
|
140 |
-
isnad_hadith
|
141 |
-
isnad_hadith
|
142 |
-
|
|
|
|
|
|
|
143 |
|
144 |
end_nodes = df['End Transmitter ID'].tolist()
|
145 |
G = nx.from_pandas_edgelist(isnad_hadith, source = 'Source', target = 'Destination', create_using = nx.DiGraph())
|
@@ -148,19 +154,29 @@ def visualize_isnad(taraf_num, yaxis):
|
|
148 |
y_stretch = 4
|
149 |
net = Network(directed =True, select_menu=True, cdn_resources='remote')
|
150 |
|
|
|
|
|
|
|
|
|
151 |
for node, pos in isnad_pos.items():
|
152 |
-
node_info,student_narrations,student_gen, student_rank, node_name = get_node_info(node)
|
153 |
-
|
154 |
-
|
|
|
|
|
|
|
|
|
|
|
155 |
elif node in end_nodes:
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
net.add_edge(source, target, color
|
|
|
164 |
net.toggle_physics(False)
|
165 |
html = net.generate_html()
|
166 |
html = html.replace("'", "\"")
|
|
|
13 |
from collections import defaultdict
|
14 |
from huggingface_hub import hf_hub_download
|
15 |
import json
|
16 |
+
from huggingface_hub import hf_hub_download
|
17 |
+
|
18 |
+
|
19 |
pattern = r'"(.*?)"'
|
20 |
# this pattern captures anything in a double quotes.
|
21 |
|
|
|
60 |
matn_info['Book_ID'] = matn_info['bookid_hadithid'].apply(lambda x: int(x.split('_')[0]))
|
61 |
matn_info['Hadith Number'] = matn_info['bookid_hadithid'].apply(lambda x: int(x.split('_')[1]))
|
62 |
matn_info = pd.merge(matn_info, books, on='Book_ID')
|
63 |
+
# Preprocess narrator_bios into a dictionary
|
64 |
+
narrator_info = narrator_bios.set_index('Rawi ID').to_dict(orient='index')
|
|
|
65 |
|
66 |
# Download and read a file
|
67 |
file_path = hf_hub_download(
|
|
|
82 |
|
83 |
|
84 |
def get_node_info(node):
|
85 |
+
node = int(node) # Ensure node is an integer
|
86 |
+
info = narrator_info.get(node, {})
|
87 |
+
student_narrations = info.get('Number of Narrations', 1)
|
88 |
+
student_gen = info.get('Generation', -1)
|
89 |
+
student_rank = info.get('Narrator Rank', 'ููุงู')
|
90 |
+
node_name = info.get('Famous Name', 'ููุงู')
|
91 |
+
return info, student_narrations, student_gen, student_rank, node_name
|
92 |
+
|
93 |
|
94 |
def visualize_isnad(taraf_num, yaxis):
|
95 |
# Precompute filtered dataframes
|
|
|
130 |
taraf.iloc[i]['Book_Name'],
|
131 |
taraf.iloc[i]['Author'],
|
132 |
taraf.iloc[i]['Hadith Number'],
|
133 |
+
n,
|
134 |
i
|
135 |
])
|
136 |
|
137 |
# Convert to DataFrame
|
138 |
df = pd.DataFrame(lst_hadith, columns=['Matn', 'Generation', 'Name', 'Book_Name', 'Author', 'Book Hadith Number', 'End Transmitter ID', 'Hadith Number'])
|
139 |
+
isnad_hadith[['Source', 'Destination']] = isnad_hadith[['Source', 'Destination']].astype(int)
|
140 |
|
141 |
|
142 |
+
# Merge isnad_hadith with narrator_bios for Teacher and Student
|
143 |
+
isnad_hadith = isnad_hadith.merge(narrator_bios[['Rawi ID', 'Famous Name']], left_on='Source', right_on='Rawi ID', how='left').rename(columns={'Famous Name': 'Teacher'})
|
144 |
+
isnad_hadith = isnad_hadith.merge(narrator_bios[['Rawi ID', 'Famous Name']], left_on='Destination', right_on='Rawi ID', how='left').rename(columns={'Famous Name': 'Student'})
|
145 |
+
|
146 |
+
# Fill missing values with 'ููุงู'
|
147 |
+
isnad_hadith['Teacher'].fillna('ููุงู', inplace=True)
|
148 |
+
isnad_hadith['Student'].fillna('ููุงู', inplace=True)
|
149 |
|
150 |
end_nodes = df['End Transmitter ID'].tolist()
|
151 |
G = nx.from_pandas_edgelist(isnad_hadith, source = 'Source', target = 'Destination', create_using = nx.DiGraph())
|
|
|
154 |
y_stretch = 4
|
155 |
net = Network(directed =True, select_menu=True, cdn_resources='remote')
|
156 |
|
157 |
+
# Precompute end_matn_info for each end node
|
158 |
+
end_node_data = df.groupby('End Transmitter ID').apply(lambda x: " ".join(x["Hadith Number"].astype("string"))).to_dict()
|
159 |
+
|
160 |
+
# Loop over isnad_pos
|
161 |
for node, pos in isnad_pos.items():
|
162 |
+
node_info, student_narrations, student_gen, student_rank, node_name = get_node_info(node)
|
163 |
+
label = f'{node_name} \n {student_rank} \n ID: {node} - Gen {student_gen}'
|
164 |
+
size = 50
|
165 |
+
font_color = 'red'
|
166 |
+
if node == 99999:
|
167 |
+
label = f'{node_name} \n ID: {node} - Gen {student_gen}'
|
168 |
+
size = 70
|
169 |
+
font_color = 'black'
|
170 |
elif node in end_nodes:
|
171 |
+
hadith_numbers = end_node_data.get(node, '')
|
172 |
+
label += f' \n Hadith {hadith_numbers}'
|
173 |
+
net.add_node(node, font={'size': 30, 'color': font_color}, color=value_to_hex(student_narrations), label=label, x=pos[0] * x_stretch, y=-pos[1] * y_stretch, size=size)
|
174 |
+
|
175 |
+
# Add edges efficiently
|
176 |
+
edge_data = isnad_hadith[['Source', 'Destination', f'{yaxis} Count']].values
|
177 |
+
for source, target, count in edge_data:
|
178 |
+
net.add_edge(source, target, color=value_to_hex(int(count)), label=f"{count}")
|
179 |
+
|
180 |
net.toggle_physics(False)
|
181 |
html = net.generate_html()
|
182 |
html = html.replace("'", "\"")
|