leilaghomashchi commited on
Commit
4ed687d
·
verified ·
1 Parent(s): ca1c8ee

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +84 -71
app.py CHANGED
@@ -9,7 +9,7 @@ import logging
9
  logging.basicConfig(level=logging.INFO)
10
  logger = logging.getLogger(__name__)
11
 
12
- class PreciseAnonymizer:
13
  def __init__(self):
14
  self.mapping_table = {}
15
  self.counters = {
@@ -21,7 +21,7 @@ class PreciseAnonymizer:
21
  self.api_key = os.getenv("OPENAI_API_KEY", "")
22
 
23
  def anonymize_text(self, original_text, lang='fa'):
24
- """ناشناس‌سازی دقیق براساس مثال‌های واقعی"""
25
  try:
26
  if not original_text or not original_text.strip():
27
  return "❌ Please enter input text!" if lang == 'en' else "❌ لطفاً متن ورودی را وارد کنید!"
@@ -32,90 +32,103 @@ class PreciseAnonymizer:
32
 
33
  anonymized = original_text
34
 
35
- # الگوهای دقیق براساس مثال‌های واقعی
36
  patterns = [
37
- # شرکت‌ها - الگوهای مشخص
38
  (r'شرکت سرمایه‌گذاری دارویی تأمین \(تیپیکو\)', 'company'),
 
39
  (r'شرکت پتروشیمی بوعلی سینا', 'company'),
40
  (r'شرکت پتروشیمی پارس', 'company'),
41
  (r'شرکت آسان پادرو', 'company'),
42
  (r'شرکت پالایش نفت اصفهان', 'company'),
43
- (r'شرکت گروه توسعه مالی مهر آیندگان \(ومهان\)', 'company'),
44
  (r'شرکت وانیا نیک تدبیر', 'company'),
 
 
45
  (r'تدوین و همکاران', 'company'),
46
  (r'سازمان حسابرسی', 'company'),
47
- (r'سرزمین هوشمند پاد \(زیرمجموعه بانک پاسارگاد\)', 'company'),
 
48
  (r'ایران خودرو', 'company'),
 
49
  (r'بانک پاسارگاد', 'company'),
50
  (r'بانک ملت', 'company'),
51
  (r'بانک سرمایه', 'company'),
52
  (r'همراه اول', 'company'),
53
  (r'گروه همراه اول', 'company'),
54
 
55
- # نام اشخاص با عناوین
 
 
 
 
 
 
 
 
 
56
  (r'مهدی اخوان بهابادی، مدیرعامل همراه اول', 'person'),
 
57
  (r'فرج‌اله قدمی', 'person'),
58
 
59
- # مبالغ مالی - الگوهای دقیق
60
- (r'\d+,\d{3} میلیارد ریال', 'amount'), # 681,667 میلیارد ریال
61
- (r'\d+ هزار و \d+ میلیارد تومان', 'amount'), # 23 هزار و 296 میلیارد تومان
62
- (r'\d+ هزار و \d+ دستگاه', 'amount'), # 537 هزار و 736 دستگاه
63
- (r'بیش از \d+ همت', 'amount'), # بیش از 37 همت
64
- (r'حدود \d+ میلیون تومان', 'amount'), # حدود 69 میلیون تومان
65
- (r'بیش از \d+ همت', 'amount'), # بیش از 111 همت
66
- (r'\d+,\d{3},\d{3} میلیارد ریال', 'amount'), # 681,667 میلیارد ریال
67
- (r'\d+,\d{3} میلیارد ریال', 'amount'), # 86,278 میلیارد ریال
68
- (r'\d+,\d{3} میلیارد ریال', 'amount'), # 12,140 میلیارد ریال
69
- (r'\d+,\d{3} میلیارد ریال', 'amount'), # 51,670 میلیارد ریال
70
- (r'\d+,\d{3} میلیارد ریال', 'amount'), # 33,000 میلیارد ریال
71
- (r'\d+ هزار میلیارد ریالی', 'amount'), # 155 هزار میلیارد ریالی
72
- (r'\d+ میلیارد تومانی', 'amount'), # 2700 میلیارد تومانی
73
- (r'نزدیک به \d+ هزار میلیارد تومان', 'amount'), # نزدیک به 67 هزار میلیارد تومان
74
- (r'بیش از \d+ میلیارد تومان', 'amount'), # بیش از 6 میلیارد تومان
75
- (r'حدود \d+ میلیارد تومان', 'amount'), # حدود 30 میلیارد تومان
76
- (r'حدود \d+ میلیون دلار', 'amount'), # حدود 100 میلیون دلار
77
- (r'\d+ تا \d+\.\d+ میلیون تن', 'amount'), # 1 تا 1.5 میلیون تن
78
- (r'\d+ ریال', 'amount'), # 936 ریال
79
- (r'\d+ ریال', 'amount'), # 446 ریال
80
- (r'\d+ ریال', 'amount'), # 610 ریال
81
- (r'\d+ هزار و \d+ میلیارد تومان', 'amount'), # 70 هزار و 677 میلیارد تومان
82
- (r'\d+ میلیارد تومان', 'amount'), # 7101 میلیارد تومان
83
- (r'\d+ میلیارد تومان', 'amount'), # 8003 میلیارد تومان
84
- (r'\d+ هزار میلیارد تومان', 'amount'), # 49 هزار میلیارد تومان
85
- (r'\d+ میلیارد تومانی', 'amount'), # 178 میلیارد تومانی
86
- (r'\d+\.\d+ میلیون نفر', 'amount'), # 73.7 میلیون نفر
87
- (r'\d+ هزار و \d+ میلیارد تومان', 'amount'), # 16 هزار و 495 میلیارد تومان
88
- (r'\d+ هزار و \d+ میلیارد تومان', 'amount'), # 31 هزار و 756 میلیارد تومان
89
 
90
- # درصدها - الگوهای دقیق
91
- (r'\d+\.\d+ درصد', 'percent'), # 4.58 درصد
92
- (r'\d+ درصد', 'percent'), # 75 درصد
93
- (r'منفی \d+ درصد', 'percent'), # منفی 345 درصد
94
- (r'\d+ درصد', 'percent'), # 97 درصد
95
- (r'بیش از \d+ درصد', 'percent'), # بیش از 60 درصد
96
- (r'\d+ درصد', 'percent'), # 37 درصد
97
- (r'\d+ درصد', 'percent'), # 15 درصد
98
- (r'\d+ درصد', 'percent'), # 14 درصد
99
- (r'\d+ الی \d+ درصد', 'percent'), # 50 الی 70 درصد
100
- (r'\d+ درصدی', 'percent'), # 14 درصدی
101
- (r'\d+ درصدی', 'percent'), # 37 درصدی
102
- (r'\d+ درصدی', 'percent'), # 15 درصدی
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  ]
104
 
105
- # پردازش الگوها به ترتیب از طولانی‌ترین به کوتاه‌ترین
 
 
 
106
  for pattern, category in patterns:
107
  matches = list(re.finditer(pattern, anonymized, re.IGNORECASE))
108
 
109
- # مرتب‌سازی matches بر اساس طول (طولانی‌ترین اول)
110
- matches.sort(key=lambda x: len(x.group(0)), reverse=True)
111
-
112
  for match in matches:
113
  matched_text = match.group(0)
114
 
115
  # بررسی که قبلاً جایگزین نشده باشد
116
  if matched_text in anonymized and matched_text not in self.mapping_table:
117
  self.counters[category] += 1
118
- code = f"{category}-{self.counters[category]}"
119
  self.mapping_table[matched_text] = code
120
  anonymized = anonymized.replace(matched_text, code)
121
  logger.info(f"Replaced: {matched_text} -> {code}")
@@ -248,7 +261,7 @@ def get_mapping_table(language):
248
  if not anonymizer.mapping_table:
249
  return "❌ Mapping table is empty! Please process some text first." if lang == 'en' else "❌ جدول نگاشت خالی است! ابتدا متنی را پردازش کنید."
250
 
251
- result = "📋 **Precise Mapping Table:**\n\n" if lang == 'en' else "📋 **جدول نگاشت دقیق:**\n\n"
252
 
253
  # گروه‌بندی بر اساس نوع
254
  categories = {
@@ -281,28 +294,28 @@ def update_ui_text(language):
281
  """به‌روزرسانی متن‌های رابط کاربری"""
282
  if language == 'English':
283
  return {
284
- 'title': 'Precise Business Data Anonymization System',
285
  'step1': 'Input Text & Settings',
286
  'step2': 'Anonymized Text',
287
  'step3': 'Raw ChatGPT Response',
288
  'step4': 'Final Restored Response',
289
- 'input_placeholder': 'Enter your business text here...\nThe system will precisely detect company names, financial amounts, percentages, and executive names...',
290
- 'process_btn': 'Process with Precise Detection',
291
  'clear_btn': 'Clear All',
292
- 'mapping_btn': 'Show Precise Mapping Table',
293
  'direction': 'ltr'
294
  }
295
  else:
296
  return {
297
- 'title': 'سیستم ناشناس‌سازی دقیق اطلاعات تجاری',
298
  'step1': 'متن ورودی و تنظیمات',
299
  'step2': 'متن ناشناس‌شده',
300
  'step3': 'پاسخ خام ChatGPT',
301
  'step4': 'پاسخ نهایی بازگردانده شده',
302
- 'input_placeholder': 'متن تجاری خود را اینجا وارد کنید...\nسیستم به طور دقیق نام شرکت‌ها، مبالغ مالی، درصدها و نام مدیران را تشخیص می‌دهد...',
303
- 'process_btn': 'پردازش با تشخیص دقیق',
304
  'clear_btn': 'پاک کردن همه',
305
- 'mapping_btn': 'نمایش جدول نگاشت دقیق',
306
  'direction': 'rtl'
307
  }
308
 
@@ -332,7 +345,7 @@ def update_interface(language):
332
  ]
333
 
334
  # ایجاد instance
335
- anonymizer = PreciseAnonymizer()
336
 
337
  # CSS
338
  custom_css = """
@@ -415,7 +428,7 @@ h1 {
415
  """
416
 
417
  # رابط کاربری Gradio
418
- with gr.Blocks(title="📊 Precise Anonymization System", theme=gr.themes.Soft(), css=custom_css) as app:
419
 
420
  with gr.Row():
421
  language_selector = gr.Radio(
@@ -426,7 +439,7 @@ with gr.Blocks(title="📊 Precise Anonymization System", theme=gr.themes.Soft()
426
  )
427
 
428
  with gr.Column():
429
- title = gr.HTML("<h1 style='text-align: center; color: #FFD700; font-size: 3.5em; font-weight: bold; text-shadow: 3px 3px 6px rgba(0,0,0,0.5); margin: 20px 0; background: linear-gradient(45deg, #FFD700, #FFA500); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;'>📊 سیستم ناشناس‌سازی دقیق اطلاعات تجاری</h1>")
430
 
431
  with gr.Row(elem_classes="workflow rtl") as workflow_row:
432
  with gr.Column():
@@ -434,12 +447,12 @@ with gr.Blocks(title="📊 Precise Anonymization System", theme=gr.themes.Soft()
434
 
435
  input_text = gr.Textbox(
436
  lines=15,
437
- placeholder="متن تجاری خود را اینجا وارد کنید...\nسیستم به طور دقیق نام شرکت‌ها، مبالغ مالی، درصدها و نام مدیران را تشخیص می‌دهد...",
438
  label="",
439
  rtl=True
440
  )
441
 
442
- process_btn = gr.Button("🚀 پردازش با تشخیص دقیق", variant="primary")
443
  clear_btn = gr.Button("🗑️ پاک کردن همه", variant="stop")
444
 
445
  status = gr.Textbox(
@@ -485,8 +498,8 @@ with gr.Blocks(title="📊 Precise Anonymization System", theme=gr.themes.Soft()
485
 
486
  with gr.Row():
487
  with gr.Column():
488
- mapping_title = gr.HTML('<h2>🗂️ جدول نگاشت دقیق</h2>')
489
- mapping_btn = gr.Button("📋 نمایش جدول نگاشت دقیق")
490
 
491
  mapping_output = gr.Textbox(
492
  lines=10,
 
9
  logging.basicConfig(level=logging.INFO)
10
  logger = logging.getLogger(__name__)
11
 
12
+ class ImprovedAnonymizer:
13
  def __init__(self):
14
  self.mapping_table = {}
15
  self.counters = {
 
21
  self.api_key = os.getenv("OPENAI_API_KEY", "")
22
 
23
  def anonymize_text(self, original_text, lang='fa'):
24
+ """ناشناس‌سازی بهبود یافته براساس تحلیل مثال‌ها"""
25
  try:
26
  if not original_text or not original_text.strip():
27
  return "❌ Please enter input text!" if lang == 'en' else "❌ لطفاً متن ورودی را وارد کنید!"
 
32
 
33
  anonymized = original_text
34
 
35
+ # الگوهای بهبود یافته براساس تحلیل مثال‌ها
36
  patterns = [
37
+ # شرکت‌های کامل با مخفف
38
  (r'شرکت سرمایه‌گذاری دارویی تأمین \(تیپیکو\)', 'company'),
39
+ (r'شرکت گروه توسعه مالی مهر آیندگان \(ومهان\)', 'company'),
40
  (r'شرکت پتروشیمی بوعلی سینا', 'company'),
41
  (r'شرکت پتروشیمی پارس', 'company'),
42
  (r'شرکت آسان پادرو', 'company'),
43
  (r'شرکت پالایش نفت اصفهان', 'company'),
 
44
  (r'شرکت وانیا نیک تدبیر', 'company'),
45
+ (r'شرکت فولاد مبارکه اصفهان', 'company'),
46
+ (r'سرزمین هوشمند پاد \(زیرمجموعه بانک پاسارگاد\)', 'company'),
47
  (r'تدوین و همکاران', 'company'),
48
  (r'سازمان حسابرسی', 'company'),
49
+
50
+ # شرکت‌های ساده
51
  (r'ایران خودرو', 'company'),
52
+ (r'ایران‌خودرو', 'company'), # با نیم‌فاصله
53
  (r'بانک پاسارگاد', 'company'),
54
  (r'بانک ملت', 'company'),
55
  (r'بانک سرمایه', 'company'),
56
  (r'همراه اول', 'company'),
57
  (r'گروه همراه اول', 'company'),
58
 
59
+ # نام‌های مختصر شرکت‌ها
60
+ (r'بوعلی', 'company'), # مختصر شرکت پتروشیمی بوعلی سینا
61
+ (r'شپنا', 'company'), # مختصر شرکت پالایش نفت اصفهان
62
+ (r'فولاد مبارکه', 'company'),
63
+
64
+ # نام‌های در علامت نقل قول
65
+ (r'«پارس»', 'company'),
66
+ (r'"پارس"', 'company'),
67
+
68
+ # نام اشخاص کامل
69
  (r'مهدی اخوان بهابادی، مدیرعامل همراه اول', 'person'),
70
+ (r'مهدی اخوان بهابادی', 'person'),
71
  (r'فرج‌اله قدمی', 'person'),
72
 
73
+ # مبالغ مالی - الگوهای جامع‌تر
74
+
75
+ # مبالغ با ویرگول
76
+ (r'\d+,\d{3},\d{3} میلیارد ریال', 'amount'),
77
+ (r'\d+,\d{3} میلیارد ریال', 'amount'),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
 
79
+ # مبالغ با کلمات توضیحی
80
+ (r'\d+ هزار و \d+ میلیارد تومان', 'amount'),
81
+ (r'\d+ هزار و \d+ دستگاه', 'amount'),
82
+ (r'بیش از \d+ همت', 'amount'),
83
+ (r'حدود \d+ میلیون تومان', 'amount'),
84
+ (r'حدود \d+ میلیون دلار', 'amount'),
85
+ (r'نزدیک به \d+ هزار میلیارد تومان', 'amount'),
86
+ (r'بیش از \d+ میلیارد تومان', 'amount'),
87
+ (r'حدود \d+ میلیارد تومان', 'amount'),
88
+
89
+ # مبالغ با واحد همت
90
+ (r'\d+\.?\d* همت', 'amount'),
91
+ (r'\d+ همت', 'amount'),
92
+
93
+ # مبالغ ساده
94
+ (r'\d+ هزار میلیارد ریالی', 'amount'),
95
+ (r'\d+ میلیارد تومانی', 'amount'),
96
+ (r'\d+ میلیارد تومان', 'amount'),
97
+ (r'\d+ میلیون تومان', 'amount'),
98
+ (r'\d+ میلیارد ریال', 'amount'),
99
+ (r'\d+ ریال', 'amount'),
100
+
101
+ # بازه‌های مقداری
102
+ (r'یک تا \d+\.?\d* میلیون تن', 'amount'),
103
+ (r'\d+ تا \d+\.?\d* میلیون تن', 'amount'),
104
+
105
+ # مبالغ اعشاری
106
+ (r'\d+\.?\d* میلیون نفر', 'amount'),
107
+ (r'\d+\.?\d* میلیون دلار', 'amount'),
108
+
109
+ # درصدها - الگوهای جامع‌تر
110
+ (r'منفی \d+ درصد', 'percent'),
111
+ (r'\d+\.?\d* درصدی', 'percent'),
112
+ (r'\d+\.?\d* درصد', 'percent'),
113
+ (r'\d+ الی \d+ درصد', 'percent'),
114
+ (r'بیش از \d+ درصد', 'percent'),
115
+ (r'حدود \d+ درصد', 'percent'),
116
  ]
117
 
118
+ # مرتب‌سازی patterns بر اساس طول (طولانی‌ترین ا��ل)
119
+ patterns.sort(key=lambda x: len(x[0]), reverse=True)
120
+
121
+ # پردازش الگوها
122
  for pattern, category in patterns:
123
  matches = list(re.finditer(pattern, anonymized, re.IGNORECASE))
124
 
 
 
 
125
  for match in matches:
126
  matched_text = match.group(0)
127
 
128
  # بررسی که قبلاً جایگزین نشده باشد
129
  if matched_text in anonymized and matched_text not in self.mapping_table:
130
  self.counters[category] += 1
131
+ code = f"{category}-{self.counters[category]:02d}"
132
  self.mapping_table[matched_text] = code
133
  anonymized = anonymized.replace(matched_text, code)
134
  logger.info(f"Replaced: {matched_text} -> {code}")
 
261
  if not anonymizer.mapping_table:
262
  return "❌ Mapping table is empty! Please process some text first." if lang == 'en' else "❌ جدول نگاشت خالی است! ابتدا متنی را پردازش کنید."
263
 
264
+ result = "📋 **Improved Mapping Table:**\n\n" if lang == 'en' else "📋 **جدول نگاشت بهبود یافته:**\n\n"
265
 
266
  # گروه‌بندی بر اساس نوع
267
  categories = {
 
294
  """به‌روزرسانی متن‌های رابط کاربری"""
295
  if language == 'English':
296
  return {
297
+ 'title': 'Improved Business Data Anonymization System',
298
  'step1': 'Input Text & Settings',
299
  'step2': 'Anonymized Text',
300
  'step3': 'Raw ChatGPT Response',
301
  'step4': 'Final Restored Response',
302
+ 'input_placeholder': 'Enter your business text here...\nThe system will detect company names, financial amounts, percentages, and executive names with improved accuracy...',
303
+ 'process_btn': 'Process with Improved Detection',
304
  'clear_btn': 'Clear All',
305
+ 'mapping_btn': 'Show Improved Mapping Table',
306
  'direction': 'ltr'
307
  }
308
  else:
309
  return {
310
+ 'title': 'سیستم ناشناس‌سازی بهبود یافته اطلاعات تجاری',
311
  'step1': 'متن ورودی و تنظیمات',
312
  'step2': 'متن ناشناس‌شده',
313
  'step3': 'پاسخ خام ChatGPT',
314
  'step4': 'پاسخ نهایی بازگردانده شده',
315
+ 'input_placeholder': 'متن تجاری خود را اینجا وارد کنید...\nسیستم با دقت بهبود یافته نام شرکت‌ها، مبالغ مالی، درصدها و نام مدیران را تشخیص می‌دهد...',
316
+ 'process_btn': 'پردازش با تشخیص بهبود یافته',
317
  'clear_btn': 'پاک کردن همه',
318
+ 'mapping_btn': 'نمایش جدول نگاشت بهبود یافته',
319
  'direction': 'rtl'
320
  }
321
 
 
345
  ]
346
 
347
  # ایجاد instance
348
+ anonymizer = ImprovedAnonymizer()
349
 
350
  # CSS
351
  custom_css = """
 
428
  """
429
 
430
  # رابط کاربری Gradio
431
+ with gr.Blocks(title="📊 Improved Anonymization System", theme=gr.themes.Soft(), css=custom_css) as app:
432
 
433
  with gr.Row():
434
  language_selector = gr.Radio(
 
439
  )
440
 
441
  with gr.Column():
442
+ title = gr.HTML("<h1 style='text-align: center; color: #FFD700; font-size: 3.5em; font-weight: bold; text-shadow: 3px 3px 6px rgba(0,0,0,0.5); margin: 20px 0; background: linear-gradient(45deg, #FFD700, #FFA500); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;'>📊 سیستم ناشناس‌سازی بهبود یافته اطلاعات تجاری</h1>")
443
 
444
  with gr.Row(elem_classes="workflow rtl") as workflow_row:
445
  with gr.Column():
 
447
 
448
  input_text = gr.Textbox(
449
  lines=15,
450
+ placeholder="متن تجاری خود را اینجا وارد کنید...\nسیستم با دقت بهبود یافته نام شرکت‌ها، مبالغ مالی، درصدها و نام مدیران را تشخیص می‌دهد...",
451
  label="",
452
  rtl=True
453
  )
454
 
455
+ process_btn = gr.Button("🚀 پردازش با تشخیص بهبود یافته", variant="primary")
456
  clear_btn = gr.Button("🗑️ پاک کردن همه", variant="stop")
457
 
458
  status = gr.Textbox(
 
498
 
499
  with gr.Row():
500
  with gr.Column():
501
+ mapping_title = gr.HTML('<h2>🗂️ جدول نگاشت بهبود یافته</h2>')
502
+ mapping_btn = gr.Button("📋 نمایش جدول نگاشت بهبود یافته")
503
 
504
  mapping_output = gr.Textbox(
505
  lines=10,