leilaghomashchi commited on
Commit
2941845
·
verified ·
1 Parent(s): f1f2e2e

Delete app.py

Browse files
Files changed (1) hide show
  1. app.py +0 -252
app.py DELETED
@@ -1,252 +0,0 @@
1
- import gradio as gr
2
- import re
3
- import json
4
- from typing import Dict, Tuple, List
5
-
6
- class TextAnonymizer:
7
- def __init__(self):
8
- self.reset_counters()
9
-
10
- def reset_counters(self):
11
- """ریست کردن شمارنده‌ها و mapping ها"""
12
- self.company_counter = 1
13
- self.amount_counter = 1
14
- self.percent_counter = 1
15
- self.person_counter = 1
16
-
17
- self.company_mapping = {}
18
- self.amount_mapping = {}
19
- self.percent_mapping = {}
20
- self.person_mapping = {}
21
-
22
- def anonymize_companies(self, text: str) -> str:
23
- """ناشناس‌سازی نام شرکت‌ها"""
24
- # الگوهای شناسایی شرکت
25
- company_patterns = [
26
- r'شرکت\s+[\u0600-\u06FF\s]+',
27
- r'بانک\s+[\u0600-\u06FF\s]+',
28
- r'بیمه\s+[\u0600-\u06FF\s]+',
29
- r'پتروشیمی\s+[\u0600-\u06FF\s]+',
30
- r'فولاد\s+[\u0600-\u06FF\s]+',
31
- r'گروه\s+[\u0600-\u06FF\s]+',
32
- r'هلدینگ\s+[\u0600-\u06FF\s]+',
33
- r'سازمان\s+[\u0600-\u06FF\s]+',
34
- r'مؤسسه\s+[\u0600-\u06FF\s]+',
35
- r'موسسه\s+[\u0600-\u06FF\s]+',
36
- r'ایران\s*خودرو',
37
- r'همراه\s*اول',
38
- r'ایرانسل',
39
- r'سایپا',
40
- r'پارسیان',
41
- r'پاسارگاد',
42
- r'ملت',
43
- r'صبا\s*تامین',
44
- r'تیپیکو'
45
- ]
46
-
47
- for pattern in company_patterns:
48
- matches = re.finditer(pattern, text, re.IGNORECASE)
49
- for match in matches:
50
- company_name = match.group().strip()
51
-
52
- if company_name not in self.company_mapping:
53
- self.company_mapping[company_name] = f"company-{self.company_counter:02d}"
54
- self.company_counter += 1
55
-
56
- text = text.replace(company_name, self.company_mapping[company_name])
57
-
58
- return text
59
-
60
- def anonymize_amounts(self, text: str) -> str:
61
- """ناشناس‌سازی مقادیر مالی و اعداد"""
62
- # الگوهای اعداد و مقادیر مالی
63
- amount_patterns = [
64
- r'\d+[،,]?\d*\s*هزار\s*(و\s*\d+)?\s*(میلیارد|میلیون)?\s*(تومان|ریال|دلار)',
65
- r'\d+[،,]?\d*\s*(میلیارد|میلیون|هزار)\s*(تومان|ریال|دلار)',
66
- r'\d+[،,]?\d*\s*(تومان|ریال|دلار)',
67
- r'\d+[،,]?\d*\s*همت',
68
- r'\d+[،,]?\d*\s*(میلیارد|میلیون|هزار)',
69
- r'\d+[،,]?\d*\s*تن',
70
- r'\d+[،,]?\d*\s*دستگاه',
71
- r'\d+[،,]?\d*\s*نفر',
72
- r'\d+[،,]?\d*\s*مگاوات',
73
- r'\d+[،,]?\d*\s*تُن',
74
- r'\d+[،,]?\d*\s*واحد',
75
- r'\d+[،,]?\d*\s*سال',
76
- r'\d+[،,]?\d*\s*ماه',
77
- r'\d+[،,]?\d*\s*روز'
78
- ]
79
-
80
- for pattern in amount_patterns:
81
- matches = re.finditer(pattern, text)
82
- for match in matches:
83
- amount = match.group().strip()
84
-
85
- if amount not in self.amount_mapping:
86
- self.amount_mapping[amount] = f"amount-{self.amount_counter:02d}"
87
- self.amount_counter += 1
88
-
89
- text = text.replace(amount, self.amount_mapping[amount])
90
-
91
- return text
92
-
93
- def anonymize_percentages(self, text: str) -> str:
94
- """ناشناس‌سازی درصدها"""
95
- percent_patterns = [
96
- r'\d+[،,]?\d*\s*درصد',
97
- r'٪\s*\d+[،,]?\d*',
98
- r'\d+[،,]?\d*\s*٪'
99
- ]
100
-
101
- for pattern in percent_patterns:
102
- matches = re.finditer(pattern, text)
103
- for match in matches:
104
- percent = match.group().strip()
105
-
106
- if percent not in self.percent_mapping:
107
- self.percent_mapping[percent] = f"percent-{self.percent_counter:02d}"
108
- self.percent_counter += 1
109
-
110
- text = text.replace(percent, self.percent_mapping[percent])
111
-
112
- return text
113
-
114
- def anonymize_persons(self, text: str) -> str:
115
- """ناشناس‌سازی نام افراد"""
116
- # الگوی نام افراد ایرانی (نام + نام خانوادگی)
117
- person_patterns = [
118
- r'(?:آقای|خانم|دکتر|مهندس|استاد)?\s*[\u0600-\u06FF]{2,10}\s+[\u0600-\u06FF]{2,15}(?:\s+[\u0600-\u06FF]{2,15})?',
119
- # نام‌های خاص که در متن مشاهده شدند
120
- r'مهدی\s+اخوان\s+بهابادی',
121
- r'فرج‌اله\s+قدمی',
122
- r'محمد\s+ایروانی',
123
- r'جواد\s+شکرخواه',
124
- r'بهرنگ\s+اسدی\s+قره\s+جلو',
125
- r'سید\s+محمدجواد\s+میرطاهر',
126
- r'جواد\s+زارع‌پور',
127
- r'محمدرضا\s+فرزین',
128
- r'ابوالفضل\s+نجارزاده'
129
- ]
130
-
131
- for pattern in person_patterns:
132
- matches = re.finditer(pattern, text)
133
- for match in matches:
134
- person_name = match.group().strip()
135
-
136
- # حذف عناوین
137
- person_name = re.sub(r'^(آقای|خانم|دکتر|مهندس|استاد)\s+', '', person_name)
138
-
139
- if person_name not in self.person_mapping and len(person_name) > 3:
140
- self.person_mapping[person_name] = f"person-{self.person_counter:02d}"
141
- self.person_counter += 1
142
-
143
- text = text.replace(match.group(), self.person_mapping[person_name])
144
-
145
- return text
146
-
147
- def anonymize_text(self, text: str) -> Tuple[str, Dict]:
148
- """ناشناس‌سازی کامل متن"""
149
- if not text.strip():
150
- return "متن وارد شده خالی است.", {}
151
-
152
- # ناشناس‌سازی به ترتیب اولویت
153
- anonymized_text = text
154
- anonymized_text = self.anonymize_persons(anonymized_text)
155
- anonymized_text = self.anonymize_companies(anonymized_text)
156
- anonymized_text = self.anonymize_amounts(anonymized_text)
157
- anonymized_text = self.anonymize_percentages(anonymized_text)
158
-
159
- # ایجاد گزارش mapping
160
- mapping_report = {
161
- "شرکت‌ها": self.company_mapping,
162
- "مقادیر": self.amount_mapping,
163
- "درصدها": self.percent_mapping,
164
- "اشخاص": self.person_mapping
165
- }
166
-
167
- return anonymized_text, mapping_report
168
-
169
- # ایجاد instance کلاس
170
- anonymizer = TextAnonymizer()
171
-
172
- def process_text(input_text: str, reset_mappings: bool = False) -> Tuple[str, str]:
173
- """پردازش متن ورودی"""
174
- if reset_mappings:
175
- anonymizer.reset_counters()
176
-
177
- anonymized_text, mapping_report = anonymizer.anonymize_text(input_text)
178
-
179
- # تبدیل mapping به فرمت قابل نمایش
180
- mapping_display = json.dumps(mapping_report, ensure_ascii=False, indent=2)
181
-
182
- return anonymized_text, mapping_display
183
-
184
- # ایجاد رابط کاربری Gradio
185
- def create_interface():
186
- with gr.Blocks(title="ناشناس‌ساز متون فارسی", theme=gr.themes.Soft()) as interface:
187
- gr.Markdown("""
188
- # 🔒 ناشناس‌ساز متون فارسی
189
-
190
- این برنامه اطلاعات حساس در متون فارسی را شناسایی و ناشناس می‌کند:
191
- - 🏢 نام شرکت‌ها و سازمان‌ها
192
- - 💰 مقادیر مالی و اعداد
193
- - 📊 درصدها
194
- - 👤 نام اشخاص
195
- """)
196
-
197
- with gr.Row():
198
- with gr.Column():
199
- input_text = gr.Textbox(
200
- label="متن ورودی",
201
- placeholder="متن خود را اینجا وارد کنید...",
202
- lines=10
203
- )
204
-
205
- with gr.Row():
206
- process_btn = gr.Button("ناشناس‌سازی متن", variant="primary")
207
- reset_btn = gr.Button("ریست شمارنده‌ها", variant="secondary")
208
-
209
- with gr.Column():
210
- output_text = gr.Textbox(
211
- label="متن ناشناس‌سازی شده",
212
- lines=10,
213
- interactive=False
214
- )
215
-
216
- mapping_display = gr.Code(
217
- label="گزارش تبدیل‌ها",
218
- language="json",
219
- interactive=False
220
- )
221
-
222
- # نمونه متن
223
- gr.Examples(
224
- examples=[
225
- ["شرکت ایران خودرو در سال 1402 حدود 23 هزار میلیارد تومان درآمد داشت و مدیرعامل آن مهدی احمدی است."],
226
- ["بانک پاسارگاد با سود 155 هزار میلیارد ریالی و بانک ملت رقابت نزدیکی دارند. فرج‌اله قدمی مدیرعامل بانک سرمایه است."],
227
- ["همراه اول با 37 درصد رشد درآمد به 70 هزار میلیارد تومان رسید و 73.7 میلیون مشترک فعال دارد."]
228
- ],
229
- inputs=[input_text]
230
- )
231
-
232
- process_btn.click(
233
- fn=lambda text: process_text(text, False),
234
- inputs=[input_text],
235
- outputs=[output_text, mapping_display]
236
- )
237
-
238
- reset_btn.click(
239
- fn=lambda: (anonymizer.reset_counters(), "��مارنده‌ها ریست شدند"),
240
- outputs=[gr.Textbox(visible=False)]
241
- )
242
-
243
- return interface
244
-
245
- if __name__ == "__main__":
246
- # ایجاد و اجرای رابط کاربری
247
- demo = create_interface()
248
- demo.launch(
249
- share=True, # برای ایجاد لینک عمومی
250
- server_name="0.0.0.0", # برای دسترسی از شبکه
251
- server_port=7860 # پورت پیش‌فرض Hugging Face Spaces
252
- )