leilaghomashchi commited on
Commit
8026ab1
·
verified ·
1 Parent(s): 5643528

Delete app.py

Browse files
Files changed (1) hide show
  1. app.py +0 -345
app.py DELETED
@@ -1,345 +0,0 @@
1
- import gradio as gr
2
- import re
3
- import os
4
- import requests
5
- import logging
6
- from typing import Dict, List, Tuple
7
-
8
- logging.basicConfig(level=logging.INFO)
9
- logger = logging.getLogger(__name__)
10
-
11
- class AnonymizerComplete:
12
- """ناشناس‌ساز کامل با ChatGPT Integration"""
13
-
14
- def __init__(self, cerebras_key: str = None, gpt_key: str = None):
15
- self.cerebras_key = cerebras_key or os.getenv("CEREBRAS_API_KEY")
16
- self.gpt_key = gpt_key or os.getenv("OPENAI_API_KEY")
17
- self.mapping_table = {}
18
-
19
- logger.info("✅ Anonymizer Complete مقداردهی شد")
20
-
21
- def anonymize_with_regex(self, text: str) -> Tuple[str, Dict]:
22
- """ناشناس‌سازی ساده با Regex"""
23
- logger.info("🔍 شروع ناشناس‌سازی Regex...")
24
-
25
- anonymized = text
26
- mapping = {}
27
- counters = {'person': 0, 'company': 0, 'amount': 0, 'percent': 0}
28
-
29
- # الگوهای Regex
30
- patterns = {
31
- 'person': r'\b[ء-ي]+\s+[ء-ي]+(?:\s+[ء-ي]+)*\b',
32
- 'amount': r'\d+\s*(?:میلیارد|میلیون|هزار|تومان|ریال|دلار|تن)',
33
- 'percent': r'\d+\s*(?:درصد|%|درصدی)',
34
- 'company': r'(?:شرکت|بانک|سازمان|گروه|هلدینگ)\s+[ء-ي]+(?:\s+[ء-ي]+)*',
35
- }
36
-
37
- # ناشناس‌سازی
38
- for entity_type, pattern in patterns.items():
39
- matches = re.finditer(pattern, anonymized)
40
- for match in matches:
41
- text_match = match.group()
42
- key = text_match.lower()
43
-
44
- if key not in mapping:
45
- counters[entity_type] += 1
46
- placeholder = f"{entity_type}-{counters[entity_type]:02d}"
47
- mapping[key] = placeholder
48
- anonymized = anonymized.replace(text_match, placeholder, 1)
49
-
50
- logger.info(f"✅ {sum(counters.values())} موجودیت ناشناس شد")
51
- self.mapping_table = {v: {'original': k, 'type': 'unknown'} for k, v in mapping.items()}
52
-
53
- return anonymized, mapping
54
-
55
- def anonymize_with_cerebras(self, text: str) -> Tuple[str, Dict]:
56
- """ناشناس‌سازی با Cerebras API"""
57
- logger.info("🔄 فراخوانی Cerebras API...")
58
-
59
- if not self.cerebras_key:
60
- logger.warning("⚠️ Cerebras API Key نیست - استفاده از Regex")
61
- return self.anonymize_with_regex(text)
62
-
63
- try:
64
- response = requests.post(
65
- "https://api.cerebras.ai/v1/chat/completions",
66
- headers={
67
- "Authorization": f"Bearer {self.cerebras_key}",
68
- "Content-Type": "application/json"
69
- },
70
- json={
71
- "model": "llama-3.3-70b",
72
- "messages": [
73
- {
74
- "role": "system",
75
- "content": "شما ناشناس‌ساز متون هستید. اسامی → person-01، شرکت‌ها → company-01، مقادیر → amount-01، درصدها → percent-01"
76
- },
77
- {
78
- "role": "user",
79
- "content": f"ناشناس کنید:\n{text}"
80
- }
81
- ],
82
- "max_tokens": 4096,
83
- "temperature": 0.1
84
- },
85
- timeout=60
86
- )
87
-
88
- if response.status_code == 200:
89
- anonymized_text = response.json()['choices'][0]['message']['content'].strip()
90
- logger.info("✅ ناشناس‌سازی کامل شد")
91
- return anonymized_text, {}
92
- else:
93
- logger.error(f"❌ Cerebras Error: {response.text}")
94
- return self.anonymize_with_regex(text)
95
-
96
- except Exception as e:
97
- logger.error(f"❌ Cerebras Exception: {e}")
98
- return self.anonymize_with_regex(text)
99
-
100
- def analyze_with_gpt(self, anonymized_text: str) -> str:
101
- """تحلیل متن ناشناس‌شده با ChatGPT"""
102
- logger.info("🤖 فراخوانی ChatGPT...")
103
-
104
- if not self.gpt_key:
105
- logger.warning("⚠️ GPT API Key نیست")
106
- return "❌ API Key موجود نیست"
107
-
108
- try:
109
- prompt = f"""متن مالی ناشناس‌شده زیر را تحلیل و خلاصه کنید:
110
-
111
- متن:
112
- {anonymized_text}
113
-
114
- لطفاً:
115
- 1. خلاصه‌ای مختصر ارائه دهید
116
- 2. نکات اصلی را مشخص کنید
117
- 3. تمام توکن‌های ناشناس (person-01، company-01 و غیره) را حفظ کنید
118
- 4. تنها اطلاعات موجود در متن را بیان کنید"""
119
-
120
- response = requests.post(
121
- "https://api.openai.com/v1/chat/completions",
122
- headers={
123
- "Authorization": f"Bearer {self.gpt_key}",
124
- "Content-Type": "application/json"
125
- },
126
- json={
127
- "model": "gpt-4o-mini",
128
- "messages": [
129
- {
130
- "role": "system",
131
- "content": "شما دستیار تحلیل متون مالی فارسی هستید."
132
- },
133
- {
134
- "role": "user",
135
- "content": prompt
136
- }
137
- ],
138
- "max_tokens": 1500,
139
- "temperature": 0.7
140
- },
141
- timeout=60
142
- )
143
-
144
- if response.status_code == 200:
145
- gpt_response = response.json()['choices'][0]['message']['content']
146
- logger.info("✅ تحلیل GPT کامل شد")
147
- return gpt_response
148
- else:
149
- logger.error(f"❌ GPT Error: {response.text}")
150
- return f"❌ خطای GPT: {response.status_code}"
151
-
152
- except Exception as e:
153
- logger.error(f"❌ GPT Exception: {e}")
154
- return f"❌ خطا: {str(e)}"
155
-
156
- def get_mapping_table_str(self) -> str:
157
- """تبدیل جدول نگاشت به string"""
158
- if not self.mapping_table:
159
- return "### 📋 جدول نگاشت\nخالی است"
160
-
161
- table = "### 📋 جدول نگاشت\n\n"
162
- table += "| ID | نوع | متن اصلی |\n"
163
- table += "|----|----|----------|\n"
164
-
165
- for token, info in sorted(self.mapping_table.items()):
166
- entity_type = info.get('type', 'نامشخص')
167
- original = info.get('original', '')
168
- table += f"| {token} | {entity_type} | {original} |\n"
169
-
170
- return table
171
-
172
- # متغیر سراسری
173
- anonymizer = None
174
-
175
- def process(input_text: str, api_choice: str = "regex", analyze_gpt: bool = False):
176
- """پردازش متن (5 مرحله)"""
177
- global anonymizer
178
-
179
- if not input_text.strip():
180
- return "", "", "", ""
181
-
182
- # مقداردهی
183
- cerebras_key = os.getenv("CEREBRAS_API_KEY")
184
- gpt_key = os.getenv("OPENAI_API_KEY")
185
-
186
- if not anonymizer:
187
- anonymizer = AnonymizerComplete(cerebras_key, gpt_key)
188
-
189
- try:
190
- logger.info("=" * 60)
191
- logger.info("🚀 شروع پردازش...")
192
- logger.info("=" * 60)
193
-
194
- # ============================================
195
- # مرحله 1: ناشناس‌سازی
196
- # ============================================
197
- logger.info("مرحله 1️⃣: ناشناس‌سازی...")
198
-
199
- if api_choice == "cerebras" and cerebras_key:
200
- anonymized_text, _ = anonymizer.anonymize_with_cerebras(input_text)
201
- else:
202
- anonymized_text, _ = anonymizer.anonymize_with_regex(input_text)
203
-
204
- if not anonymized_text or anonymized_text == input_text:
205
- logger.warning("⚠️ متن تغییری نکرد - شاید موجودیتی نیست")
206
-
207
- logger.info(f"✅ ناشناس‌سازی کامل: {len(input_text)} → {len(anonymized_text)}")
208
-
209
- # ============================================
210
- # مرحله 2: جدول نگاشت
211
- # ============================================
212
- logger.info("مرحله 2️⃣: ایجاد جدول نگاشت...")
213
- mapping_str = anonymizer.get_mapping_table_str()
214
- logger.info(f"✅ {len(anonymizer.mapping_table)} موجودیت نگاشت شد")
215
-
216
- # ============================================
217
- # مرحله 3 و 4: تحلیل GPT
218
- # ============================================
219
- gpt_response = ""
220
-
221
- if analyze_gpt and gpt_key:
222
- logger.info("مرحله 3️⃣: ارسال به ChatGPT...")
223
- gpt_response = anonymizer.analyze_with_gpt(anonymized_text)
224
- logger.info(f"✅ تحلیل دریافت شد: {len(gpt_response)} کاراکتر")
225
- else:
226
- logger.info("⏭️ تحلیل GPT غیرفعال است")
227
-
228
- # ============================================
229
- # خلاصه
230
- # ============================================
231
- logger.info("=" * 60)
232
- logger.info("✅ پردازش کامل!")
233
- logger.info(f" متن ورودی: {len(input_text)} کاراکتر")
234
- logger.info(f" متن ناشناس: {len(anonymized_text)} کاراکتر")
235
- logger.info(f" موجودیت‌ها: {len(anonymizer.mapping_table)}")
236
- logger.info(f" تحلیل GPT: {len(gpt_response)} کاراکتر")
237
- logger.info("=" * 60)
238
-
239
- return input_text, anonymized_text, mapping_str, gpt_response
240
-
241
- except Exception as e:
242
- logger.error(f"❌ خطا عمومی: {str(e)}", exc_info=True)
243
- return input_text, "", "", f"❌ خطا: {str(e)}"
244
-
245
- def clear():
246
- """پاک کردن"""
247
- return "", "", "", ""
248
-
249
- # Gradio Interface
250
- css_rtl = """
251
- #input_text textarea { direction: rtl; text-align: right; }
252
- #anonymized_text textarea { direction: rtl; text-align: right; }
253
- #mapping_table textarea { direction: rtl; text-align: right; }
254
- #gpt_analysis textarea { direction: rtl; text-align: right; }
255
- """
256
-
257
- with gr.Blocks(title="سیستم ناشناس‌سازی متون", theme=gr.themes.Soft(), css=css_rtl) as app:
258
-
259
- gr.Markdown("# 🔐 سیستم ناشناس‌سازی متون مالی فارسی (کامل)")
260
- gr.Markdown("""
261
- ### ✨ ویژگی‌ها:
262
- 1️⃣ ناشناس‌سازی دقیق با Entity Linking
263
- 2️⃣ جدول نگاشت کامل
264
- 3️⃣ تحلیل هوشمند با ChatGPT
265
- 4️⃣ دو روش: Cerebras API یا Regex
266
- """)
267
-
268
- with gr.Row():
269
- with gr.Column(scale=2):
270
- input_text = gr.Textbox(
271
- lines=10,
272
- placeholder="متن مالی/خبری را وارد کنید...",
273
- label="📝 متن ورودی",
274
- elem_id="input_text"
275
- )
276
-
277
- with gr.Column(scale=1):
278
- gr.HTML("<div style='text-align: center; margin-bottom: 10px;'></div>")
279
-
280
- api_choice = gr.Radio(
281
- ["cerebras", "regex"],
282
- value="regex",
283
- label="🔧 انتخاب روش"
284
- )
285
-
286
- analyze_gpt = gr.Checkbox(
287
- value=False,
288
- label="🤖 تحلیل با ChatGPT"
289
- )
290
-
291
- gr.Markdown("---")
292
- process_btn = gr.Button("▶️ پردازش", variant="primary", size="lg")
293
- clear_btn = gr.Button("🗑️ پاک کردن", variant="stop", size="lg")
294
-
295
- # نتایج
296
- with gr.Tabs():
297
- with gr.TabItem("📄 متن ناشناس‌شده"):
298
- anonymized_text = gr.Textbox(
299
- lines=10,
300
- label="🔒 متن ناشناس‌شده",
301
- interactive=False,
302
- elem_id="anonymized_text"
303
- )
304
-
305
- with gr.TabItem("📋 جدول نگاشت"):
306
- mapping_table = gr.Textbox(
307
- lines=10,
308
- label="📋 جدول نگاشت",
309
- interactive=False,
310
- elem_id="mapping_table"
311
- )
312
-
313
- with gr.TabItem("🤖 تحلیل ChatGPT"):
314
- gpt_analysis = gr.Textbox(
315
- lines=10,
316
- label="🤖 تحلیل و خلاصه",
317
- interactive=False,
318
- elem_id="gpt_analysis"
319
- )
320
-
321
- # Event handlers
322
- process_btn.click(
323
- fn=process,
324
- inputs=[input_text, api_choice, analyze_gpt],
325
- outputs=[input_text, anonymized_text, mapping_table, gpt_analysis]
326
- )
327
-
328
- clear_btn.click(
329
- fn=clear,
330
- outputs=[input_text, anonymized_text, mapping_table, gpt_analysis]
331
- )
332
-
333
- if __name__ == "__main__":
334
- print("🚀 سیستم ناشناس‌سازی متون در حال راه‌اندازی...")
335
- print("\n📋 نحوه استفاده:")
336
- print("1. CEREBRAS_API_KEY را تنظیم کنید (اختیاری)")
337
- print("2. OPENAI_API_KEY را تنظیم کنید (برای ChatGPT)")
338
- print("3. http://localhost:7860 را باز کنید\n")
339
-
340
- app.launch(
341
- server_name="0.0.0.0",
342
- server_port=7860,
343
- share=False,
344
- show_error=True
345
- )