|
|
|
|
|
import streamlit as st |
|
|
import torch |
|
|
|
|
|
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer |
|
|
from transformers.pipelines import pipeline |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
st.set_page_config( |
|
|
page_title="مدل خلاصهسازی انتزاعی mT5-FineTuned", |
|
|
layout="wide", |
|
|
initial_sidebar_state="expanded" |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
FINETUNED_MODEL_PATH = "nafisehNik/mt5-persian-summary" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@st.cache_resource |
|
|
def load_summarizer_pipeline(): |
|
|
""" |
|
|
پایپلاین خلاصهسازی ترنسفورمر را بارگذاری میکند. |
|
|
از مدل آموزشدیده (Fine-Tuned) استفاده میشود. |
|
|
""" |
|
|
|
|
|
st.subheader("💡 در حال بارگذاری مدل...") |
|
|
|
|
|
try: |
|
|
|
|
|
summarizer = pipeline( |
|
|
"summarization", |
|
|
model=FINETUNED_MODEL_PATH, |
|
|
|
|
|
|
|
|
device=-1 |
|
|
) |
|
|
st.success("✅ مدل mT5 با موفقیت بارگذاری شد.") |
|
|
return summarizer |
|
|
except Exception as e: |
|
|
st.error( |
|
|
f"❌ خطای بارگذاری مدل: مطمئن شوید پوشه '{FINETUNED_MODEL_PATH}' وجود دارد و شامل تمام فایلهای مدل است.") |
|
|
st.code(e) |
|
|
return None |
|
|
|
|
|
|
|
|
|
|
|
summarizer = load_summarizer_pipeline() |
|
|
|
|
|
|
|
|
|
|
|
st.title("💡 پروژه خلاصهسازی انتزاعی متون (mT5)") |
|
|
st.markdown("این ابزار از مدل **mT5 Fine-Tuned** برای تولید خلاصههایی از متون چندزبانه (مانند فارسی) استفاده میکند.") |
|
|
|
|
|
if summarizer: |
|
|
|
|
|
|
|
|
with st.expander("📝 وارد کردن متن و تنظیمات", expanded=True): |
|
|
input_text = st.text_area( |
|
|
"متن اصلی را برای خلاصه سازی وارد کنید:", |
|
|
height=300, |
|
|
value="متن طولانی خود را در اینجا وارد کنید. این متن میتواند یک مقاله خبری، یک سند پژوهشی یا یک متن طولانی دیگر باشد. مدل ما معنای متن را درک کرده و با جملات جدید، آن را خلاصه خواهد کرد." |
|
|
) |
|
|
|
|
|
col1, col2 = st.columns(2) |
|
|
|
|
|
with col1: |
|
|
max_len = st.slider("حداکثر طول خلاصه (Max Length)", |
|
|
min_value=50, max_value=300, value=150, step=10) |
|
|
|
|
|
with col2: |
|
|
min_len = st.slider("حداقل طول خلاصه (Min Length)", |
|
|
min_value=20, max_value=150, value=30, step=10) |
|
|
|
|
|
|
|
|
|
|
|
if st.button("🚀 خلاصه کن", type="primary"): |
|
|
|
|
|
if len(input_text.split()) < 20: |
|
|
st.warning( |
|
|
"حداقل ۲۰ کلمه برای یک خلاصهسازی معنادار نیاز است. متن شما بسیار کوتاه است.") |
|
|
else: |
|
|
|
|
|
with st.spinner("درحال پردازش... مدل ترنسفورمر در حال تولید خلاصه انتزاعی است."): |
|
|
|
|
|
|
|
|
summary = summarizer( |
|
|
input_text, |
|
|
max_length=max_len, |
|
|
min_length=min_len, |
|
|
num_beams=4, |
|
|
no_repeat_ngram_size=2 |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
st.subheader("✅ خلاصه تولید شده") |
|
|
st.markdown(f"***{summary[0]['summary_text']}***") |
|
|
|
|
|
|
|
|
st.sidebar.markdown("---") |
|
|
st.sidebar.markdown("### آمار") |
|
|
st.sidebar.info( |
|
|
f"طول متن ورودی: **{len(input_text.split())} کلمه**") |
|
|
st.sidebar.info( |
|
|
f"طول خلاصه خروجی: **{len(summary[0]['summary_text'].split())} کلمه**") |
|
|
|