import streamlit as st
from hazm import Normalizer, SentenceTokenizer
import os
import docx
from langchain.chat_models import ChatOpenAI
from langchain.schema import SystemMessage, HumanMessage
from rapidfuzz import fuzz
import concurrent.futures
import time
from sentence_transformers import SentenceTransformer
import numpy as np
from hazm import *
import re
import nltk
nltk.download('punkt')
st.markdown("""
""", unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
# ---------- احراز هویت ----------
if "authenticated" not in st.session_state:
st.session_state.authenticated = False
if not st.session_state.authenticated:
st.markdown('', unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
username = st.text_input("نام کاربری:", placeholder="شناسه نظامی خود را وارد کنید",
label_visibility="visible")
password = st.text_input("رمز عبور:", placeholder="رمز عبور نظامی", type="password",
label_visibility="visible")
if st.button("ورود"):
if username == "admin" and password == "123":
st.session_state.authenticated = True
st.rerun()
else:
st.markdown("""
نام کاربری یا رمز عبور اشتباه است.
""", unsafe_allow_html=True)
st.stop()
# ---------- سایدبار ----------
with st.sidebar:
st.image("log.png", use_container_width=True)
menu_items = [
("گزارش عملیاتی", "https://cdn-icons-png.flaticon.com/512/3596/3596165.png"),
("تاریخچه ماموریتها", "https://cdn-icons-png.flaticon.com/512/709/709496.png"),
("تحلیل دادههای نظامی", "https://cdn-icons-png.flaticon.com/512/1828/1828932.png"),
("مدیریت منابع", "https://cdn-icons-png.flaticon.com/512/681/681494.png"),
("دستیار فرماندهی", "https://cdn-icons-png.flaticon.com/512/3601/3601646.png"),
("تنظیمات امنیتی", "https://cdn-icons-png.flaticon.com/512/2099/2099058.png"),
("پشتیبانی فنی", "https://cdn-icons-png.flaticon.com/512/597/597177.png"),
]
for idx, (text, icon) in enumerate(menu_items):
st.markdown(f"""
""", unsafe_allow_html=True)
if idx in [1, 3, 5]:
st.markdown("
", unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
# ---------- مدل زبانی ----------
llm = ChatOpenAI(
base_url="https://api.together.xyz/v1",
api_key='0291f33aee03412a47fa5d8e562e515182dcc5d9aac5a7fb5eefdd1759005979',
model="deepseek-ai/DeepSeek-R1-Distill-Llama-70B-free",
max_tokens=1024
)
# ---------- پردازش فایلها با کش و موازی ----------
folder_path = 'C:/Users/ici/Downloads/Telegram Desktop/45/46'
normalizer = Normalizer()
sentence_tokenizer = SentenceTokenizer()
@st.cache_data(show_spinner="در حال پردازش اسناد... لطفاً صبور باشید.")
def load_and_process_documents(path):
def process_docx(filename):
try:
full_path = os.path.join(path, filename)
doc = docx.Document(full_path)
text = "\n".join([para.text for para in doc.paragraphs]) # استخراج متن
normalized = normalizer.normalize(text)
sentences = normalized
return sentences
except Exception as e:
print(f"Error processing {filename}: {e}")
return []
with concurrent.futures.ThreadPoolExecutor() as executor:
results = executor.map(process_docx, [f for f in os.listdir(path) if f.endswith(".docx")])
return list(results)
all_sentences = load_and_process_documents(folder_path)
# all_sentences = load_and_process_documents(folder_path)
# st.markdown(all_sentences[2])
# ---------- ورودی جستجو ----------
st.markdown("""
""", unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
query = st.chat_input("چطور میتونم کمک کنم؟")
if query:
st.markdown(f'{query}
', unsafe_allow_html=True)
think = st.markdown("""
""", unsafe_allow_html=True)
time.sleep(4)
think.empty()
else:
st.markdown("")
# استایلها برای چرخش و پیام در حال فکر کردن
st.markdown("""
""", unsafe_allow_html=True)
sentEmbedding = SentEmbedding()
sentEmbedding.load_model("C:/Users/ici/Downloads/sent2vec/sent2vec-naab.model")
top_k = 5
threshold = 0.8
original_sentences = all_sentences.copy()
all_vectors = [sentEmbedding.get_sentence_vector(sentence) for sentence in original_sentences]
if query:
found = False
threshold = 85
for idx, sentence in enumerate(all_sentences):
similarity = fuzz.partial_ratio(query, sentence)
if similarity >= threshold:
st.markdown(sentence)
prompt = f"""
تعدادی پاسخ برای سوال زیر تولید شده است. لطفاً ابتدا این پاسخها را بررسی کن، سپس با در نظر گرفتن محتوای سوال و لحن آن، یک پاسخ نهایی حرفهای، دقیق و روان ارائه کن که هم به سوال پاسخ دهد و هم از نظر نگارشی و ساختاری در سطح بالایی باشد. از تکرار اضافی پرهیز کن و محتوای چند پاسخ را در صورت نیاز با هم ترکیب کن و به هیچ عنوان از جملاتی جز فارسی استفاده نکن تا بهترین نتیجه حاصل شود.
سوال:
{query}
پاسخها:
{sentence}
پاسخ نهایی حرفهای بازنویسیشده:
"""
response = llm([
SystemMessage(content="You are a helpful assistant."),
HumanMessage(content=prompt)
])
rewritten = response.content.strip()
st.markdown(f'{rewritten}
', unsafe_allow_html=True)
found = True
break
if not found:
prompt = f" لطفاً بر اساس سوال زیر یک متن مرتبط و معنادار تولید کن و از خودت ننویس و جملات معتبر باشن و از زبانی جز فارسی استفاده نکن:\n\nسوال: {query}"
response = llm([
SystemMessage(content="You are a helpful assistant."),
HumanMessage(content=prompt)
])
rewritten = response.content.strip()
st.markdown(f'{rewritten}
', unsafe_allow_html=True)