File size: 5,535 Bytes
d0e2dd3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9e2e2cc
d0e2dd3
 
 
 
 
 
9e2e2cc
 
d0e2dd3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ea9291d
d0e2dd3
615fbaf
d0e2dd3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90c5963
d0e2dd3
 
9e2e2cc
d0e2dd3
 
 
 
 
 
 
 
 
2479bc9
d0e2dd3
 
 
 
 
 
eaa5c1c
d0e2dd3
2479bc9
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
import gradio as gr
from pyvis.network import Network

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)



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("'", "\"")

    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>""", edges_prepped[['Teacher', 'Student', 'Tarafs', 'Hadiths', 'Isnads', 'Books']]

def narrator_retriever(name):
        return narrator_bios[(narrator_bios['Official Name'].str.contains(name)) | (narrator_bios['Famous Name'].str.contains(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)
    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()