File size: 5,942 Bytes
1ffe3f3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import streamlit as st

st.set_page_config(page_title="VNU Summarizer", layout="wide")

# Chèn JavaScript để thay đổi tiêu đề ngay lập tức
st.markdown(
    """
    <script>
        document.title = "VNU Summarizer";
    </script>
    """,
    unsafe_allow_html=True
)
from summarization import MultiDocSummarizationAPI
import fitz  
from docx import Document 

# Cấu hình tiêu đề trang ngay từ đầu


# Ẩn footer "Made with Streamlit"
hide_streamlit_style = """
    <style>
        #MainMenu {visibility: hidden;}
        footer {visibility: hidden;}
    </style>
"""
st.markdown(hide_streamlit_style, unsafe_allow_html=True)

st.image("./Logo_UET.png", width=150)

def extract_text_from_pdf(uploaded_file):
    pdf_text = ""
    try:
        with fitz.open(stream=uploaded_file.read(), filetype="pdf") as doc:
            for page in doc:
                pdf_text += page.get_text("text") + "\n"
    except Exception as e:
        st.error(f"Lỗi khi xử lý PDF: {e}")
    return pdf_text

def extract_text_from_docx(uploaded_file):
    try:
        doc = Document(uploaded_file)
        return "\n".join([para.text for para in doc.paragraphs])
    except Exception as e:
        st.error(f"Lỗi khi xử lý DOCX: {e}")
        return ""
    
def add_text_area():
    st.session_state.additional_texts.append("")

def remove_text_area(index):
    st.session_state.additional_texts.pop(index)
    
if "show_summary" not in st.session_state:
    st.session_state.show_summary = False

if "additional_texts" not in st.session_state:
    st.session_state.additional_texts = []
    
st.markdown("<h1>Hệ thống tóm tắt đa văn bản tiếng Việt</h1>", unsafe_allow_html=True)

col1, col2 = st.columns([3, 1])

with col1:
    st.markdown("### ✍️ Nhập văn bản")
    input_method = st.radio("Phương thức nhập liệu:", ["Nhập văn bản", "Kéo thả tệp"], horizontal=True)
    texts = []

    if input_method == "Nhập văn bản":
        if st.button("➕ Thêm vùng nhập văn bản"):
            add_text_area()
        for i, text in enumerate(st.session_state.additional_texts):
            with st.expander(f"📌 Văn bản {i + 1}", expanded=True):
                col_expander = st.columns([13, 0.5])
                with col_expander[0]:
                    updated_text = st.text_area("", text, height=200, key=f"text_{i}")
                    st.session_state.additional_texts[i] = updated_text
                with col_expander[1]:
                    if st.button("🗑", key=f"delete_{i}", help="Xóa văn bản"):
                        remove_text_area(i)
                        st.experimental_rerun()
            texts.append(st.session_state.additional_texts[i])

    else:
        uploaded_files = st.file_uploader(
            "📂 Kéo thả tệp văn bản:", 
            type=["txt", "pdf", "docx"], 
            accept_multiple_files=True
        )

        if uploaded_files:
            for uploaded_file in uploaded_files:
                all_texts = ""
                if uploaded_file.type == "text/plain":
                    all_texts = uploaded_file.getvalue().decode("utf-8")
                elif uploaded_file.type == "application/pdf":
                    all_texts = extract_text_from_pdf(uploaded_file)
                elif uploaded_file.type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
                    all_texts = extract_text_from_docx(uploaded_file)

                texts.append(all_texts)

    # st.markdown("### 🎯 Nhập tóm tắt mẫu")
    # golden_ext = st.text_area("📑 Tóm tắt tóm lược", height=100)
    # golden_abs = st.text_area("📝 Tóm tắt trích rút", height=100)

    
with col2:
    st.markdown("### ⚙️ Tuỳ chọn tóm tắt")
    summary_method = st.selectbox("Chọn phương thức rút gọn:", ["Số câu", "Tỷ lệ"])

    if summary_method == "Tỷ lệ":
        compress_ratio = st.slider("🔽 Chọn tỷ lệ rút gọn:", 0, 50, 15, step=1, format="%d%%") / 100
    else:
        compress_ratio = st.number_input("🔢 Số câu đầu ra:", min_value=1, max_value=20, value=5, step=1)

    if st.button("🚀 Tóm tắt") and any(texts):
        summary_results = MultiDocSummarizationAPI(
            texts, compress_ratio#, golden_ext=golden_ext or None, golden_abs=golden_abs or None
        )
        st.session_state.extractive_summary = summary_results.get("extractive_summ", "Không có kết quả")
        st.session_state.abstractive_summary = summary_results.get("abstractive_summ", "Không có kết quả")
        st.session_state.rouge_ext = summary_results.get("score_ext", ("None", "None", "None"))
        st.session_state.rouge_abs = summary_results.get("score_abs", ("None", "None", "None"))
        st.session_state.show_summary = True
        st.experimental_rerun()

if st.session_state.get("show_summary", False):
    col_summary = st.columns(2)
    rouge_ext = st.session_state.rouge_ext if st.session_state.rouge_ext is not None else ("None", "None", "None")
    rouge_abs = st.session_state.rouge_abs if st.session_state.rouge_abs is not None else ("None", "None", "None")

    with col_summary[0]:
        st.markdown("### 📑 Tóm tắt tóm lược")
        # st.markdown(f"**🔹 ROUGE 1:** {rouge_ext[0]}")
        # st.markdown(f"**🔹 ROUGE 2:** {rouge_ext[1]}")
        # st.markdown(f"**🔹 ROUGE L:** {rouge_ext[2]}")
        st.text_area("📑 Tóm tắt trích lược:", st.session_state.extractive_summary, height=250)

    # with col_summary[1]:
    #     st.markdown("### 📝 Tóm tắt trích rút")
    #     st.markdown(f"**🔹 ROUGE 1:** {rouge_abs[0]}")
    #     st.markdown(f"**🔹 ROUGE 2:** {rouge_abs[1]}")
    #     st.markdown(f"**🔹 ROUGE L:** {rouge_abs[2]}")
    #     st.text_area("Văn bản tóm tắt trích rút:", st.session_state.abstractive_summary, height=250)