|
|
| import streamlit as st |
| import streamlit.components.v1 as components |
| from generate_knowledge_graph import generate_knowledge_graph, answer_question_with_graph |
|
|
| st.set_page_config( |
| page_icon="None", |
| layout="wide", |
| initial_sidebar_state="auto", |
| menu_items=None |
| ) |
|
|
| st.title("Knowledge Graph From Text") |
|
|
| |
| if 'graph_version' not in st.session_state: |
| st.session_state['graph_version'] = 0 |
| if 'qa_version' not in st.session_state: |
| st.session_state['qa_version'] = 0 |
|
|
| st.sidebar.title("Input document") |
| input_method = st.sidebar.radio( |
| "Choose an input method:", |
| ("Upload .txt", "Input text") |
| ) |
|
|
| |
| text = "" |
| if input_method == "Upload .txt": |
| uploaded_file = st.sidebar.file_uploader(label="Upload file", type="txt") |
| if uploaded_file is not None: |
| text = uploaded_file.read().decode("utf-8") |
| else: |
| text = st.sidebar.text_area("Input text", height=300) |
|
|
| if st.sidebar.button("1. Generate Knowledge Graph"): |
| if text: |
| with st.spinner("Generating knowledge graph..."): |
| net, graph_docs = generate_knowledge_graph(text) |
| st.session_state['graph_docs'] = graph_docs |
| |
| output_file = "knowledge_graph.html" |
| net.save_graph(output_file) |
| with open(output_file, 'r', encoding='utf-8') as f: |
| st.session_state['graph_html'] = f.read() |
| |
| |
| st.session_state['graph_version'] += 1 |
| |
| |
| st.session_state.pop('qa_answer', None) |
| st.session_state.pop('qa_html', None) |
| |
| st.success("Knowledge graph generated successfully!") |
| else: |
| st.sidebar.error("Please provide some text to generate the graph.") |
|
|
| |
| if 'graph_html' in st.session_state: |
| st.subheader("Initial Knowledge Graph") |
| |
| components.html( |
| st.session_state['graph_html'] + f"<!-- version {st.session_state['graph_version']} -->", |
| height=600 |
| ) |
|
|
| |
| if 'graph_docs' in st.session_state: |
| st.markdown("---") |
| st.subheader("Ask a question about the document") |
|
|
| col1, col2 = st.columns([3, 1]) |
| with col1: |
| question = st.text_input("Your question :") |
| with col2: |
| k_value = st.slider("Relationships to be analyzed (Top K)", min_value=1, max_value=30, value=15) |
|
|
| if st.button("2. Analyze") and question: |
| with st.spinner("Semantic search in the current graph..."): |
| answer, filtered_net = answer_question_with_graph( question, |
| st.session_state['graph_docs'], |
| k_relations=k_value |
| ) |
| |
| st.session_state['qa_answer'] = answer |
| |
| |
| with open("filtered_graph.html", 'r', encoding='utf-8') as f: |
| st.session_state['qa_html'] = f.read() |
| |
| st.session_state['qa_version'] += 1 |
|
|
| |
| if 'qa_answer' in st.session_state and 'qa_html' in st.session_state: |
| st.info(f"**Answer :** {st.session_state['qa_answer']}") |
| st.markdown("**Subgraph of the relationships used to answer the question :**") |
| |
| components.html( |
| st.session_state['qa_html'] + f"<!-- version {st.session_state['qa_version']} -->", |
| height=450 |
| ) |
|
|