leilaghomashchi commited on
Commit
f430e23
·
verified ·
1 Parent(s): 7d89455

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +100 -50
app.py CHANGED
@@ -1,9 +1,81 @@
1
  import gradio as gr
2
- from transformers import AutoTokenizer, AutoModelForCausalLM
3
  import torch
4
 
5
  # پرامپت سیستم (کوتاه شده برای کاهش مصرف)
6
- SYSTEM_PROMPT = """شما یک سیستم ناشناس‌سازی متن هستید. موجودیت‌های حساس را شناسایی و جایگزین کنید:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
 
8
  - company-XX: شرکت‌ها، بانک‌ها (مثال: ایران خودرو → company-01)
9
  - person-XX: اشخاص (مثال: احمد رضایی → person-01)
@@ -21,7 +93,7 @@ SYSTEM_PROMPT = """شما یک سیستم ناشناس‌سازی متن هست
21
  متن ناشناس‌شده: company-01 در سال 1403 سود amount-01 کسب کرد. مدیرعامل company-01، person-01، گفت این بانک percent-01 رشد داشت."""
22
 
23
  print("در حال بارگذاری مدل...")
24
- model_name = "Qwen/Qwen2.5-7B-Instruct"
25
 
26
  # تشخیص دستگاه (GPU یا CPU)
27
  device = "cuda" if torch.cuda.is_available() else "cpu"
@@ -35,7 +107,7 @@ else:
35
 
36
  try:
37
  tokenizer = AutoTokenizer.from_pretrained(model_name)
38
- model = AutoModelForCausalLM.from_pretrained(
39
  model_name,
40
  torch_dtype=torch_dtype,
41
  device_map="auto" if device == "cuda" else None,
@@ -51,55 +123,33 @@ except Exception as e:
51
  print(f"❌ خطا در بارگذاری مدل: {e}")
52
  raise e
53
 
54
- def anonymize_text(text, temperature=0.2, max_tokens=1024):
55
- """تابع ناشناس‌سازی متن"""
56
  if not text.strip():
57
  return "⚠️ لطفاً متنی وارد کنید"
58
 
59
- messages = [
60
- {"role": "system", "content": SYSTEM_PROMPT},
61
- {"role": "user", "content": f"متن اصلی:\n{text}\n\nمتن ناشناس‌شده:"}
62
- ]
63
 
64
- try:
65
- # تبدیل به فرمت مدل
66
- input_ids = tokenizer.apply_chat_template(
67
- messages,
68
- add_generation_prompt=True,
69
- return_tensors="pt"
70
- ).to(device)
71
-
72
- # اضافه کردن attention_mask
73
- attention_mask = torch.ones_like(input_ids)
74
-
75
- print(f"🔄 در حال پردازش... (طول ورودی: {input_ids.shape[1]} توکن)")
76
-
77
- # تولید
78
- with torch.no_grad():
79
- outputs = model.generate(
80
- input_ids,
81
- attention_mask=attention_mask,
82
- max_new_tokens=int(max_tokens),
83
- temperature=float(temperature),
84
- top_p=0.9,
85
- do_sample=True if temperature > 0 else False,
86
- pad_token_id=tokenizer.eos_token_id,
87
- eos_token_id=tokenizer.eos_token_id
88
- )
89
-
90
- # استخراج پاسخ
91
- response = tokenizer.decode(
92
- outputs[0][input_ids.shape[-1]:],
93
- skip_special_tokens=True
94
- )
95
-
96
- print("✅ پردازش تکمیل شد")
97
- return response.strip()
98
 
99
- except Exception as e:
100
- error_msg = f"❌ خطا در پردازش: {str(e)}"
101
- print(error_msg)
102
- return error_msg
103
 
104
  # نمونه‌های پیش‌فرض
105
  examples = [
@@ -165,9 +215,9 @@ with gr.Blocks(title="ناشناس‌سازی متون", theme=gr.themes.Soft())
165
 
166
  submit_btn.click(
167
  fn=anonymize_text,
168
- inputs=[input_text, temperature, max_tokens],
169
  outputs=output_text
170
  )
171
 
172
  if __name__ == "__main__":
173
- demo.launch()
 
1
  import gradio as gr
2
+ from transformers import AutoTokenizer, AutoModelForTokenClassification
3
  import torch
4
 
5
  # پرامپت سیستم (کوتاه شده برای کاهش مصرف)
6
+ SYSTEM_PROMPT = """
7
+ شما یک سیستم هوشمند ناشناس‌سازی متن هستید. وظیفه شما شناسایی و جایگزینی موجودیت‌های حساس در متون مالی و اقتصادی فارسی است.
8
+
9
+ دستورالعمل‌های اصلی:
10
+
11
+ انواع موجودیت‌ها:
12
+
13
+ company-XX: نام شرکت‌ها، سازمان‌ها، بانک‌ها، هلدینگ‌ها، گروه‌های مالی (مثال: ایران خودرو، بانک ملی، گروه مالی صبا، سازمان حسابرسی)
14
+
15
+ person-XX: نام و نام خانوادگی اشخاص (مثال: محمد رضایی، مهدی اخوان بهابادی، فرج‌اله قدمی)
16
+
17
+ amount-XX: مبالغ مالی شامل ریال، تومان، همت، دلار، تن، دستگاه و واحدهای اندازه‌گیری (مثال: ۲۳ هزار و ۲۹۶ میلیارد تومان، ۵۰۰ میلیون دلار، ۷۳.۷ میلیون نفر، 636 ریال)
18
+
19
+ percent-XX: درصدها و نسبت‌ها (مثال: ۴.۵۸ درصد، ۷۵ درصد، ۱۴٪، منفی 345 درصد)
20
+
21
+ قوانین کلیدی:
22
+
23
+ 1. ترتیب شماره‌گذاری: اولین باری که موجودیت ظاهر می‌شود، شماره می‌گیرد (01، 02، 03، ...)
24
+
25
+ 2. حفظ هویت یکسان: اگر همان موجودیت دوباره آمد، از همان شماره استفاده کن. مثلا "ایران خودرو" در جمله اول و "این شرکت" در جمله دوم هر دو company-01 هستند.
26
+
27
+ 3. تشخیص نام‌های مختلف: "فولاد مبارکه اصفهان" و "فولاد مبارکه" و "این شرکت" همه company-01 هستند. "همراه اول" و "گروه همراه اول" و "این اپراتور" همه company-01 هستند. اما "بانک پاسارگاد" و "سرزمین هوشمند پاد" دو company مختلف هستند.
28
+
29
+ 4. مبالغ و درصدهای مختلف: هر عدد جدید، شماره جدید می‌گیرد
30
+
31
+ 5. حفظ ساختار: ساختار جمله را حفظ کن، تاریخ‌ها را تغییر نده، کلمات توصیفی مثل "شرکت"، "بانک"، "گروه" را قبل از برچسب حفظ کن
32
+
33
+ 6. هیچ توضیح اضافه‌ای نده: فقط متن ناشناس‌شده را برگردان، بدون توضیح یا تفسیر
34
+
35
+ نمونه‌های آموزشی:
36
+
37
+ نمونه ۱:
38
+ متن اصلی: ایران خودرو در اسفندماه سال 1402 حدود 23 هزار و 296 میلیارد تومان درآمد کسب کرد که در مقایسه با بهمن 4.58 درصد افزایش داشت. زیان خالص ایران خودرو در این سال به بیش از 37 همت رساند.
39
+ متن ناشناس‌شده: company-01 در اسفندماه سال 1402 حدود amount-01 درآمد کسب کرد که در مقایسه با بهمن percent-01 افزایش داشت. زیان خالص company-01 در این سال به بیش از amount-02 رساند.
40
+
41
+ نمونه ۲:
42
+ متن اصلی: بانک پاسارگاد با شناسایی سود خالص 155 هزار میلیارد ریالی در رده دوم سودآورترین بانک‌های کشور قرار گرفت و رقابت تنگاتنگی با بانک ملت داشت. در مقابل، بانک سرمایه با مدیرعاملی فرج‌اله قدمی وضعیت بحرانی دارد.
43
+ متن ناشناس‌شده: company-01 با شناسایی سود خالص amount-01 در رده دوم سودآورترین بانک‌های کشور قرار گرفت و رقابت تنگاتنگی با company-02 داشت. در مقابل، company-03 با مدیرعاملی person-01 وضعیت بحرانی دارد.
44
+
45
+ نمونه ۳:
46
+ متن اصلی: مهدی اخوان بهابادی، مدیرعامل همراه اول، در مجمع عمومی عادی سالیانه اعلام کرد درآمد عملیاتی شرکت اصلی با رشد قابل توجه 37 درصدی نسبت به سال 1402، به 70 هزار و 677 میلیارد تومان رسیده است. سود خالص تلفیقی گروه همراه اول در پایان سال مالی 1403 به 8003 میلیارد تومان رسید.
47
+ متن ناشناس‌شده: person-01، مدیرعامل company-01، در مجمع عمومی عادی سالیانه اعلام کرد درآمد عملیاتی شرکت اصلی با رشد قابل توجه percent-01 نسبت به سال 1402، به amount-01 رسیده است. سود خالص تلفیقی گروه company-01 در پایان سال مالی 1403 به amount-02 رسید.
48
+
49
+ نمونه ۴:
50
+ متن اصلی: بانک پاسارگاد با شناسایی سود خالص 155 هزار میلیارد ریالی در رده دوم سودآورترین بانک‌های کشور قرار گرفت و رقابت تنگاتنگی با بانک ملت داشت. در مقابل، بانک سرمایه با مدیرعاملی فرج‌اله قدمی وضعیت بحرانی دارد و زیان خالص 2700 میلیارد تومانی در سه‌ماهه نخست 1404 گزارش کرد. نسبت کفایت سرمایه این بانک به منفی 345 درصد رسیده که از فروپاشی مالی بانک حکایت می‌کند و زیان انباشته آن نزدیک به 67 هزار میلیارد تومان است.
51
+ متن ناشناس‌شده: company-01 با شناسایی سود خالص amount-01 در رده دوم سودآورترین بانک‌های کشور قرار گرفت و رقابت تنگاتنگی با company-02 داشت. در مقابل، company-03 با مدیرعاملی person-01 وضعیت بحرانی دارد و زیان خالص amount-02 در سه‌ماهه نخست 1404 گزارش کرد. نسبت کفایت سرمایه این بانک به percent-01 رسیده که از فروپاشی مالی بانک حکایت می‌کند و زیان انباشته آن نزدیک به amount-03 است.
52
+
53
+ نمونه ۵:
54
+ متن اصلی: صورت‌های مالی حسابرسی شده شرکت آسان پادرو منتهی به 30 آذر 1403 نشان می‌دهد این شرکت سال مالی جاری بیش از 6 میلیارد تومان زیان خالص شناسایی کرده است. پادرو سال مالی 1403 حدود 30 میلیارد تومان درآمد عملیاتی کسب کرد که این رقم در مقایسه با سال 1402 رشد تقریباً دوبرابری دارد. 97 درصد درآمد پادرو از «پردازش حمل» است که مربوط به مشتریان متقاضی خدمات پستی بوده و بیش از 60 درصد درآمد آن از سرزمین هوشمند پاد (زیرمجموعه بانک پاسارگاد) و بابت حمل مرسوله کارت‌های بانکی است.
55
+ متن ناشناس‌شده: صورت‌های مالی حسابرسی شده company-01 منتهی به 30 آذر 1403 نشان می‌دهد این شرکت سال مالی جاری بیش از amount-01 زیان خالص شناسایی کرده است. company-01 سال مالی 1403 حدود amount-02 درآمد عملیاتی کسب کرد که این رقم در مقایسه با سال 1402 رشد تقریباً دوبرابری دارد. percent-01 درآمد company-01 از «پردازش حمل» است که مربوط به مشتریان متقاضی خدمات پستی بوده و بیش از percent-02 درآمد آن از company-02 (زیرمجموعه company-03) و بابت حمل مرسوله کارت‌های بانکی است.
56
+
57
+ نمونه ۶:
58
+ متن اصلی: مجمع عمومی عادی سالیانه شرکت پتروشیمی پارس با نماد «پارس» راس ساعت 10:00 روز سه شنبه مورخ 1403/04/12 در محل برکه چوپان، هتل بزرگ نخل کنگان، طبقه پنجم، سالن همایش‌ها برگزار شد. در این مجمع صورت‌های مالی سال مالی منتهی به 1401/12/29 مورد بررسی و تصویب قرار گرفت و سازمان حسابرسی به‌ عنوان بازرس قانونی، حسابرس شرکت و بازرس علی‌البدل انتخاب شد. چشم‌انداز افق سال 1407 شرکت پتروشیمی پارس، سرآمدی در تولید پایدار، بهره‌وری و توسعه زنجیره ارزش خواهد بود و تا زمانی که افزایش ظرفیت جدید نداشته باشد، سودآوری از طریق رشد درآمد با پیداکردن مشتریان جدید امکان‌پذیر نخواهد بود.
59
+ متن ناشناس‌شده: مجمع عمومی عادی سالیانه company-01 با نماد «پارس» راس ساعت 10:00 روز سه شنبه مورخ 1403/04/12 در محل برکه چوپان، هتل بزرگ نخل کنگان، طبقه پنجم، سالن همایش‌ها برگزار شد. در این مجمع صورت‌های مالی سال مالی منتهی به 1401/12/29 مورد بررسی و تصویب قرار گرفت و company-02 به‌ عنوان بازرس قانونی، حسابرس شرکت و بازرس علی‌البدل انتخاب شد. چشم‌انداز افق سال 1407 company-01، سرآمدی در تولید پایدار، بهره‌وری و توسعه زنجیره ارزش خواهد بود و تا زمانی که افزایش ظرفیت جدید نداشته باشد، سودآوری از طریق رشد درآمد با پیداکردن مشتریان جدید امکان‌پذیر نخواهد بود.
60
+
61
+ نمونه ۷:
62
+ متن اصلی: شرکت فولاد مبارکه اص��هان در مجمع عمومی عادی سالیانه راس ساعت 10 صبح روز شنبه مورخ 1403/04/30 در استان اصفهان برگزار شد و حاشیه سود خالص شرکت 38 درصد بوده که در نسبت به متوسط صنعت 20 درصد بالاتر است. صورت‌های مالی فصلی فولاد مبارکه اصفهان خبر از کاهش سودسازی می‌دهد و EPS این شرکت در پایان سال مالی 1404 از 636 ریال به 614 ریال خواهد رسید. تحلیل‌گران پیش‌بینی می‌کنند که این شرکت در سال 1403 از 500 میلیار تومان سرمایه‌گذاری خطرپذیری معافیت مالیاتی را اخذ کند.
63
+ متن ناشناس‌شده: company-01 در مجمع عمومی عادی سالیانه راس ساعت 10 صبح روز شنبه مورخ 1403/04/30 در استان اصفهان برگزار شد و حاشیه سود خالص شرکت percent-01 بوده که در نسبت به متوسط صنعت percent-02 بالاتر است. صورت‌های مالی فصلی company-01 خبر از کاهش سودسازی می‌دهد و EPS این شرکت در پایان سال مالی 1404 از amount-01 به amount-02 خواهد رسید. تحلیل‌گران پیش‌بینی می‌کنند که این شرکت در سال 1403 از amount-03 سرمایه‌گذاری خطرپذیری معافیت مالیاتی را اخذ کند.
64
+
65
+ نمونه ۸:
66
+ متن اصلی: شرکت سرمایه‌گذاری دارویی تأمین (تیپیکو) گزارش فعالیت هیئت‌مدیره خود را برای سال مالی منتهی به 31 اردیبهشت 1404 در سامانه کدال منتشر کرد که درآمد‌های عملیاتی به 681,667 میلیارد ریال و سود خالص تلفیقی 86,278 میلیارد ریال رسید. صورت‌های مالی حسابرسی شده شرکت آسان پادرو منتهی به 30 آذر 1403 نشان می‌دهد این شرکت بیش از 6 میلیارد تومان زیان خالص شناسایی کرده است. پادرو سال مالی 1403 حدود 30 میلیارد تومان درآمد عملیاتی کسب کرد که رشد دوبرابری دارد و 97 درصد درآمد از پردازش حمل است که مربوط به مشتریان متقاضی خدمات پستی بوده است.
67
+ متن ناشناس‌شده: company-01 گزارش فعالیت هیئت‌مدیره خود را برای سال مالی منتهی به 31 اردیبهشت 1404 در سامانه کدال منتشر کرد که درآمد‌های عملیاتی به amount-01 و سود خالص تلفیقی amount-02 رسید. صورت‌های مالی حسابرسی شده company-02 منتهی به 30 آذر 1403 نشان می‌دهد این شرکت بیش از amount-03 زیان خالص شناسایی کرده است. company-02 سال مالی 1403 حدود amount-04 درآمد عملیاتی کسب کرد که رشد دوبرابری دارد و percent-01 درآمد از پردازش حمل است که مربوط به مشتریان متقاضی خدمات پستی بوده است.
68
+
69
+ نمونه ۹:
70
+ متن اصلی: دو بانک ملت و پاسارگاد به ترتیب با شناسایی سود خالص 157 و 155 هزار میلیارد ریالی رقابت تنگاتنگی داشته و در رده‌های اول و دوم جای دارند. مجموع بانک‌های مورد بررسی در پایان اسفند ماه سال 1400 زیان انباشته‌ای معادل 1388 هزار میلیارد ریال داشته‌اند که نسبت به اسفند ماه سال 1399 این زیان انباشته 10 درصد افزایش یافته است. بررسی آخرین صورت‌های مالی بانک‌های دولتی و خصوصی حاکی از آن است که 12 بانک کشور، در پایان سال 1401 در مجموع زیان انباشته سنگین 336 هزار میلیارد تومانی را رقم زده‌اند.
71
+ متن ناشناس‌شده: دو بانک company-01 و company-02 به ترتیب با شناسایی سود خالص amount-01 و amount-02 رقابت تنگاتنگی داشته و در رده‌های اول و دوم جای دارند. مجموع بانک‌های مورد بررسی در پایان اسفند ماه سال 1400 زیان انباشته‌ای معادل amount-03 داشته‌اند که نسبت به اسفند ماه سال 1399 این زیان انباشته percent-01 افزایش یافته است. بررسی آخرین صورت‌های مالی بانک‌های دولتی و خصوصی حاکی از آن است که 12 بانک کشور، در پایان سال 1401 در مجموع زیان انباشته سنگین amount-04 را رقم زده‌اند.
72
+
73
+ نمونه ۱۰:
74
+ متن اصلی: بانک سرمایه با مدیرعاملی فرج‌اله قدمی وضعیت بحرانی دارد و زیان خالص 2700 میلیا��د تومانی در سه‌ماهه نخست 1404 گزارش کرد که نسبت به دوره مشابه قبل 14% افزایش یافت. نسبت کفایت سرمایه این بانک به منفی 345 درصد رسیده که از فروپاشی مالی بانک حکایت می‌کند و زیان انباشته آن نزدیک به 67 هزار میلیارد تومان است. مرور صورت‌های مالی بانک‌ها نشان می‌دهد «سود تسعیر» و «ارزش‌گذاری دارایی‌های ارزی» طی 1401–1403 به منبع مهم سود اسمی بانک‌ها تبدیل شده و سهم سودهای ارزی به‌راحتی به 40–60٪ رسیده است.
75
+ متن ناشناس‌شده: company-01 با مدیرعاملی person-01 وضعیت بحرانی دارد و زیان خالص amount-01 در سه‌ماهه نخست 1404 گزارش کرد که نسبت به دوره مشابه قبل percent-01 افزایش یافت. نسبت کفایت سرمایه این بانک به percent-02 رسیده که از فروپاشی مالی بانک حکایت می‌کند و زیان انباشته آن نزدیک به amount-02 است. مرور صورت‌های مالی بانک‌ها نشان می‌دهد «سود تسعیر» و «ارزش‌گذاری دارایی‌های ارزی» طی 1401–1403 به منبع مهم سود اسمی بانک‌ها تبدیل شده و سهم سودهای ارزی به‌راحتی به percent-03 رسیده است.
76
+
77
+ حالا وظیفه شما: متن زیر را طبق الگوی بالا ناشناس‌سازی کنید. فقط متن ناشناس‌شده را بدون هیچ توضیح اضافه برگردانید.
78
+ """
79
 
80
  - company-XX: شرکت‌ها، بانک‌ها (مثال: ایران خودرو → company-01)
81
  - person-XX: اشخاص (مثال: احمد رضایی → person-01)
 
93
  متن ناشناس‌شده: company-01 در سال 1403 سود amount-01 کسب کرد. مدیرعامل company-01، person-01، گفت این بانک percent-01 رشد داشت."""
94
 
95
  print("در حال بارگذاری مدل...")
96
+ model_name = "HooshvareLab/bert-base-parsbert-ner-uncased" # مدل ParsBERT NER
97
 
98
  # تشخیص دستگاه (GPU یا CPU)
99
  device = "cuda" if torch.cuda.is_available() else "cpu"
 
107
 
108
  try:
109
  tokenizer = AutoTokenizer.from_pretrained(model_name)
110
+ model = AutoModelForTokenClassification.from_pretrained(
111
  model_name,
112
  torch_dtype=torch_dtype,
113
  device_map="auto" if device == "cuda" else None,
 
123
  print(f"❌ خطا در بارگذاری مدل: {e}")
124
  raise e
125
 
126
+ def anonymize_text(text):
127
+ """تابع ناشناس‌سازی متن با استفاده از ParsBERT"""
128
  if not text.strip():
129
  return "⚠️ لطفاً متنی وارد کنید"
130
 
131
+ # تبدیل متن به توکن‌ها
132
+ inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True, max_length=512)
 
 
133
 
134
+ # پیش‌بینی‌ها را از مدل دریافت کنید
135
+ with torch.no_grad():
136
+ outputs = model(**inputs)
137
+
138
+ # استخراج برچسب‌ها
139
+ predictions = outputs.logits.argmax(dim=2)
140
+
141
+ # تبدیل توکن‌ها به برچسب‌های موجودیت
142
+ tokens = tokenizer.convert_ids_to_tokens(inputs['input_ids'][0])
143
+ predicted_labels = [model.config.id2label[pred.item()] for pred in predictions[0]]
144
+
145
+ # ترکیب توکن‌ها و برچسب‌ها
146
+ result = []
147
+ for token, label in zip(tokens, predicted_labels):
148
+ if label != 'O': # اگر برچسب O نباشد، آن را در نتیجه اضافه کن
149
+ result.append(f"{token}: {label}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
150
 
151
+ # تبدیل به رشته نهایی
152
+ return '\n'.join(result)
 
 
153
 
154
  # نمونه‌های پیش‌فرض
155
  examples = [
 
215
 
216
  submit_btn.click(
217
  fn=anonymize_text,
218
+ inputs=[input_text],
219
  outputs=output_text
220
  )
221
 
222
  if __name__ == "__main__":
223
+ demo.launch()