File size: 6,229 Bytes
d0e2dd3
 
571f610
d0e2dd3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9e2e2cc
d0e2dd3
 
 
 
 
 
9e2e2cc
 
d0e2dd3
4842f46
 
 
d0e2dd3
 
 
 
 
 
4842f46
 
 
d0e2dd3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ea9291d
d0e2dd3
615fbaf
d0e2dd3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2f8e2f5
f21664b
d0e2dd3
 
 
 
4e14d7e
d0e2dd3
 
bbeeedc
d0e2dd3
 
 
 
 
 
 
 
 
2479bc9
4842f46
 
 
 
 
 
d0e2dd3
 
 
 
 
 
eaa5c1c
d0e2dd3
4e14d7e
d0e2dd3
2479bc9
 
d0e2dd3
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import gradio as gr
from pyvis.network import Network
import pyarabic.araby as araby
import numpy as np
import pandas as pd
import os
from datasets import load_dataset
from datasets import Features
from datasets import Value
from datasets import Dataset
import matplotlib.pyplot as plt



Secret_token = os.getenv('HF_Token')

dataset = load_dataset('FDSRashid/hadith_info',data_files = 'Basic_Edge_Information.csv', token = Secret_token, split = 'train')
dataset2 = load_dataset('FDSRashid/hadith_info',data_files = 'Taraf_Info.csv', token = Secret_token, split = 'train')



features = Features({'Rawi ID': Value('int32'), 'Famous Name': Value('string'), 'Narrator Rank': Value('string'), 'Number of Narrations': Value('string'), 'Official Name':Value('string'), 'Title Name':Value('string'), 'Generation': Value('string')} )
narrator_bios = load_dataset("FDSRashid/hadith_info", data_files = 'Teacher_Bios.csv', token = Secret_token,features=features )
narrator_bios = narrator_bios['train'].to_pandas()
narrator_bios.loc[49845, 'Narrator Rank'] = 'ุฑุณูˆู„ ุงู„ู„ู‡'
narrator_bios.loc[49845, 'Number of Narrations'] = 0
narrator_bios['Number of Narrations'] = narrator_bios['Number of Narrations'].astype(int)
narrator_bios.loc[49845, 'Number of Narrations'] = 327512 
narrator_bios['Generation'] = narrator_bios['Generation'].replace([None], [-1])
narrator_bios['Generation'] = narrator_bios['Generation'].astype(int)

cols = narrator_bios.columns.tolist()
def filter_df(df, col, val):
    return df[df[col] == val]

edge_info = dataset.to_pandas()
taraf_info = dataset2.to_pandas()
min_year = int(taraf_info['Year'].min())
max_year = int(taraf_info['Year'].max())
cmap = plt.colormaps['cool']



def value_to_hex(value):
    rgba_color = cmap(value)
    return "#{:02X}{:02X}{:02X}".format(int(rgba_color[0] * 255), int(rgba_color[1] * 255), int(rgba_color[2] * 255))

def subsetEdges(fstyear, lstyear):
    info = taraf_info[(taraf_info['Year'] >= fstyear)& (taraf_info['Year'] <= lstyear)]
    narrators = edge_info[edge_info['Edge_ID'].isin(info['ID'].unique())]
    return narrators
def splitIsnad(dataframe):
    teacher_student =dataframe['Edge_Name'].str.split(' TO ')
    dataframe['Teacher'] = teacher_student.apply(lambda x: x[0])
    dataframe['Student'] = teacher_student.apply(lambda x: x[1])
    return dataframe


def network_narrator(narrator_id, fst_year, lst_year, yaxis):
    edges = subsetEdges(fst_year, lst_year)
    edges_single = edges[(edges['Teacher_ID']==narrator_id) | (edges['Student_ID']==narrator_id)]
    edges_prepped = splitIsnad(edges_single)
    net = Network(directed =True)
    for _, row in edges_prepped.iterrows():
        source = row['Teacher']
        target = row['Student']
        attribute_value = row[yaxis]
        edge_color = value_to_hex(attribute_value)
        teacher_info = narrator_bios[narrator_bios['Rawi ID'] == row['Teacher_ID']]
        student_info = narrator_bios[narrator_bios['Rawi ID'] == row['Student_ID']]
        teacher_narrations = teacher_info['Number of Narrations'].to_list()[0]
        student_narrations = student_info['Number of Narrations'].to_list()[0]
        net.add_node(source, color=value_to_hex(teacher_narrations), font = {'size':30, 'color': 'orange'}, label = f"{source}\n{teacher_narrations}")
        net.add_node(target, color=value_to_hex(student_narrations), font = {'size': 20, 'color': 'red'}, label = f"{target}\n{student_narrations}")
        net.add_edge(source, target, color=edge_color, value=attribute_value, label = f"{yaxis}:{attribute_value}")


    net.barnes_hut(gravity=-3000, central_gravity=0.3, spring_length=200)
    html = net.generate_html()
    html = html.replace("'", "\"")

    edge_narrator = edge_info[(edge_info['Teacher_ID'] == narrator_id) | (edge_info['Student_ID'] == narrator_id)]
    edge_full = splitIsnad(edge_narrator[['Tarafs', 'Hadiths', 'Isnads', 'Edge_Name', 'Books']]).drop(['Edge_Name'], axis=1)
    return f"""<iframe style="width: 100%; height: 600px;margin:0 auto" name="result" allow="midi; geolocation; microphone; camera; 
    display-capture; encrypted-media;" sandbox="allow-modals allow-forms 
    allow-scripts allow-same-origin allow-popups 
    allow-top-navigation-by-user-activation allow-downloads" allowfullscreen="" 
    allowpaymentrequest="" frameborder="0" srcdoc='{html}'></iframe>""", edge_full

def narrator_retriever(name):
        return narrator_bios[(narrator_bios['Official Name'].apply(lambda x: araby.strip_diacritics(x)).str.contains(araby.strip_diacritics(name))) | (narrator_bios['Famous Name'].apply(lambda x: araby.strip_diacritics(x)).str.contains(araby.strip_diacritics(name))) | (narrator_bios['Rawi ID'].astype(str) == name)][['Rawi ID', 'Title Name', 'Official Name', 'Famous Name', 'Number of Narrations', 'Narrator Rank', 'Generation' ]]
    


with gr.Blocks() as demo:
    gr.Markdown("Search Narrators using this tool or Visualize Network of a Narrator")
    with gr.Tab("Search Narrator"):
        text_input = gr.Textbox()
        text_output = gr.DataFrame()
        text_button = gr.Button("Search")
        text_button.click(narrator_retriever, inputs=text_input, outputs=text_output)

        col = gr.Dropdown(choices = cols)
        df_filter = gr.Textbox()
        filter_button = gr.Button('Filter')
        output2 = gr.DataFrame(filter_df, inputs = [text_output, col, df_filter], outputs= [gr.DataFrame()])
        filter_button.click()
    with gr.Tab("Visualize Network"):
        with gr.Row():
            image_input = gr.Number()
            FirstYear = gr.Slider(min_year, max_year, value = -11, label = 'Begining', info = 'Choose the first year to display Narrators')
            Last_Year = gr.Slider(min_year, max_year, value = 9, label = 'End', info = 'Choose the  last year to display Narrators')
            Yaxis = gr.Dropdown(choices = ['Tarafs', 'Hadiths', 'Isnads', 'Books'], value = 'Tarafs', label = 'Variable to Display', info = 'Choose the variable to visualize.')
        image_output = gr.HTML()
        image_button = gr.Button("Visualize!")
        image_button.click(network_narrator, inputs=[image_input, FirstYear, Last_Year, Yaxis], outputs=[image_output, gr.DataFrame()])

    
    

demo.launch()