BabakBagheriGisour commited on
Commit
8402dc2
1 Parent(s): b76236a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +93 -64
app.py CHANGED
@@ -1,78 +1,107 @@
1
  import streamlit as st
2
- from PyPDF2 import PdfReader
3
- from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
 
 
 
 
 
4
 
5
- # تنظیمات صفحه
6
- st.set_page_config(page_title="PDF Zusammenfasser", layout="centered")
7
 
8
- # بارگذاری مدل و توکنایزر
9
- @st.cache_resource
10
- def load_model():
11
- tokenizer = AutoTokenizer.from_pretrained("facebook/bart-large-cnn")
12
- model = AutoModelForSeq2SeqLM.from_pretrained("facebook/bart-large-cnn")
13
- return tokenizer, model
14
 
15
- tokenizer, model = load_model()
 
 
16
 
17
- # بارگذاری فایل PDF
18
- uploaded_file = st.file_uploader("Laden Sie Ihre PDF-Datei hoch", type=["pdf"])
 
 
 
 
19
 
20
- if uploaded_file:
21
- # خواندن متن از PDF
22
- reader = PdfReader(uploaded_file)
23
- pdf_text = ""
24
- for page in reader.pages:
25
- pdf_text += page.extract_text()
26
-
27
- # نمایش متن کامل
28
- st.text_area("Vollständiger Text der PDF-Datei:", pdf_text, height=300)
29
 
30
- # محاسبه تعداد خطوط و کلمات
31
- lines = pdf_text.split("\n")
32
- num_lines = len(lines)
33
- num_words = len(pdf_text.split())
 
 
34
 
35
- # نمایش اطلاعات فایل
36
- st.info(f"**Anzahl der Zeilen:** {num_lines}")
37
- st.info(f"**Anzahl der Wörter:** {num_words}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
 
39
- # شناسایی موضوع فایل
40
- words = [word.lower() for word in pdf_text.split() if word.isalpha()]
41
- topic = max(set(words), key=words.count) # بیشترین تکرار یک کلمه
42
- st.info(f"**Mögliches Thema der Datei:** {topic}")
43
 
44
- # پردازش خط به خط برای خلاصه‌سازی
45
- st.write("Das Modell verarbeitet den Text...")
 
 
 
 
 
 
46
  progress_bar = st.progress(0)
47
- final_summary = ""
48
 
49
- for idx, line in enumerate(lines):
50
- if len(line.strip()) == 0: # عبور از خطوط خالی
51
- continue
52
-
53
- # تبدیل خط به توکن
54
- input_ids = tokenizer.encode(line, return_tensors="pt", truncation=True, max_length=1024)
55
-
56
- # تولید خلاصه برای هر خط
57
- try:
58
- summary_ids = model.generate(
59
- input_ids=input_ids,
60
- num_beams=2,
61
- max_length=50, # حداکثر طول خ��اصه
62
- min_length=10 # حداقل طول خلاصه، در صورت نیاز قابل تنظیم است
63
- )
64
- decoded_summary = tokenizer.decode(summary_ids[0], skip_special_tokens=True)
65
- final_summary += decoded_summary + " "
66
- except Exception as e:
67
- st.warning(f"Fehler bei Zeile {idx + 1}: {e}")
68
-
69
- # نمایش خلاصه فعلی
70
- st.write(f"**Zeile {idx + 1}:** {decoded_summary}")
71
-
72
- # به‌روزرسانی نوار پیشرفت
73
- progress_bar.progress((idx + 1) / num_lines)
74
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
 
76
- # نمایش خلاصه نهایی
77
- st.success("Zusammenfassung der Datei:")
78
- st.write(final_summary)
 
1
  import streamlit as st
2
+ import pytesseract
3
+ from pdf2image import convert_from_path
4
+ import os
5
+ import re
6
+ import json
7
+ from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
8
+ from tqdm import tqdm
9
 
10
+ # تنظیم Tesseract
11
+ pytesseract.pytesseract.tesseract_cmd = r'/usr/bin/tesseract'
12
 
13
+ # بارگذاری مدل سفارشی
14
+ model_name = "BabakBagheriGisour/NetworkPlus"
15
+ model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
16
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
 
 
17
 
18
+ # بررسی GPU
19
+ device = "cuda" if torch.cuda.is_available() else "cpu"
20
+ model.to(device)
21
 
22
+ # پاکسازی متن
23
+ def clean_text(text):
24
+ text = re.sub(r'\s+', ' ', text) # حذف فضاهای اضافی
25
+ text = re.sub(r'http\S+|www\.[\w.-]+', '', text) # حذف لینک‌ها
26
+ text = re.sub(r'[^\w\sÄäÖöÜüß]+', '', text) # حذف علائم غیر ضروری
27
+ return text.strip()
28
 
29
+ # استخراج متن از فایل PDF
30
+ def extract_text_using_ocr(pdf_path):
31
+ pages = convert_from_path(pdf_path, 300) # تبدیل PDF به تصاویر
32
+ all_text = []
33
+ for page in pages:
34
+ text = pytesseract.image_to_string(page, lang="deu") # زبان آلمانی
35
+ all_text.append(clean_text(text))
36
+ return all_text
 
37
 
38
+ # خلاصه‌سازی با مدل سفارشی
39
+ def summarize_text(text):
40
+ inputs = tokenizer(text, return_tensors="pt", max_length=512, truncation=True, padding=True).to(device)
41
+ summary_ids = model.generate(inputs['input_ids'], num_beams=4, max_length=100, early_stopping=True)
42
+ summary = tokenizer.decode(summary_ids[0], skip_special_tokens=True)
43
+ return summary
44
 
45
+ # پردازش PDF و تولید JSONL
46
+ def process_pdf_to_jsonl(pdf_file, progress_bar):
47
+ pages_text = extract_text_using_ocr(pdf_file)
48
+ total_lines = sum(len(page.splitlines()) for page in pages_text)
49
+ total_words = sum(len(page.split()) for page in pages_text)
50
+
51
+ data = []
52
+ for idx, page_text in enumerate(pages_text):
53
+ summary = summarize_text(page_text)
54
+ data.append({
55
+ "text": page_text,
56
+ "zusammenfassen": summary
57
+ })
58
+ # به‌روزرسانی نوار پیشرفت
59
+ progress_bar.progress((idx + 1) / len(pages_text))
60
+
61
+ return data, len(pages_text), total_lines, total_words
62
 
63
+ # رابط کاربری با Streamlit
64
+ st.title("PDF to JSONL Converter with BabakBagheriGisour/NetworkPlus")
65
+ uploaded_file = st.file_uploader("Bitte laden Sie eine PDF-Datei hoch", type="pdf")
 
66
 
67
+ if uploaded_file:
68
+ # ذخیره فایل آپلود شده
69
+ temp_file_path = f"temp_{uploaded_file.name}"
70
+ with open(temp_file_path, "wb") as f:
71
+ f.write(uploaded_file.read())
72
+
73
+ # پردازش فایل
74
+ st.info("Das Modell verarbeitet den Text...")
75
  progress_bar = st.progress(0)
76
+ data, total_pages, total_lines, total_words = process_pdf_to_jsonl(temp_file_path, progress_bar)
77
 
78
+ # نمایش اطلاعات فایل
79
+ st.subheader("Dateiinformationen:")
80
+ st.write(f"**Anzahl der Seiten:** {total_pages}")
81
+ st.write(f"**Anzahl der Zeilen:** {total_lines}")
82
+ st.write(f"**Anzahl der Wörter:** {total_words}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
 
84
+ # نمایش خلاصه‌ها
85
+ st.subheader("Zusammenfassungen:")
86
+ for idx, item in enumerate(data):
87
+ st.write(f"**Seite {idx + 1}:**")
88
+ st.text_area("Originaltext", item["text"], height=200)
89
+ st.text_area("Zusammenfassung", item["zusammenfassen"], height=100)
90
+
91
+ # ذخیره به JSONL
92
+ output_file = f"{uploaded_file.name.split('.')[0]}.jsonl"
93
+ with open(output_file, 'w', encoding='utf-8') as f:
94
+ for item in data:
95
+ f.write(json.dumps(item, ensure_ascii=False) + '\n')
96
+
97
+ st.success("Verarbeitung abgeschlossen!")
98
+ st.download_button(
99
+ label="Download JSONL",
100
+ data=open(output_file, "rb").read(),
101
+ file_name=output_file,
102
+ mime="application/jsonl"
103
+ )
104
 
105
+ # حذف فایل‌های موقت
106
+ os.remove(temp_file_path)
107
+ os.remove(output_file)