skatzR commited on
Commit
7f63d50
·
verified ·
1 Parent(s): 6e5c5f6

Update inference.py

Browse files
Files changed (1) hide show
  1. inference.py +174 -64
inference.py CHANGED
@@ -1,15 +1,14 @@
1
  # ============================================================
2
- # RQA UX Inference — FINAL
3
  # Google Colab + CLI friendly
4
  # ============================================================
5
 
6
  import os
7
  import sys
8
  import json
9
- import argparse
10
  import csv
11
  import torch
12
- from typing import List, Union
13
  from transformers import AutoTokenizer, AutoModel
14
 
15
  # ============================================================
@@ -193,72 +192,183 @@ def load_texts_from_file(path: str) -> List[str]:
193
  raise ValueError("Неподдерживаемый формат файла")
194
 
195
  # ============================================================
196
- # CLI / Colab entrypoint
197
  # ============================================================
198
 
199
- def main():
200
- parser = argparse.ArgumentParser(
201
- description="RQA — анализ логических ошибок"
202
- )
203
-
204
- parser.add_argument(
205
- "--text",
206
- type=str,
207
- help="Один текст для анализа"
208
- )
209
-
210
- parser.add_argument(
211
- "--file",
212
- type=str,
213
- help="Файл с текстами (.txt, .csv, .json)"
214
- )
215
-
216
- parser.add_argument(
217
- "--multiline",
218
- action="store_true",
219
- help="Ввод нескольких строк (каждая строка — отдельный текст)"
220
- )
221
-
222
- args, unknown = parser.parse_known_args()
223
-
224
- judge = RQAJudge()
225
-
226
- texts = []
227
-
228
- # ---------- FILE MODE ----------
229
- if args.file:
230
- if not os.path.exists(args.file):
231
- raise FileNotFoundError(args.file)
232
- texts = load_texts_from_file(args.file)
233
-
234
- # ---------- SINGLE TEXT ----------
235
- elif args.text:
236
- texts = [args.text]
237
-
238
- # ---------- MULTILINE ----------
239
- elif args.multiline:
240
- print("Введите тексты (пустая строка — конец ввода):")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
241
  while True:
242
- line = input()
243
- if not line.strip():
244
- break
245
- texts.append(line.strip())
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
246
 
247
- # ---------- INTERACTIVE FALLBACK ----------
248
- else:
249
- print("Введите текст для анализа:")
250
- line = input().strip()
251
- if line:
252
- texts = [line]
253
- else:
254
- print("❌ Пустой ввод — выхожу")
255
- return
256
 
257
- # ---------- RUN ----------
258
- for t in texts:
259
- result = judge.infer(t)
260
- judge.pretty_print(result)
261
 
 
 
 
262
 
263
  if __name__ == "__main__":
264
- main()
 
1
  # ============================================================
2
+ # RQA UX Inference — IMPROVED INTERACTIVE VERSION
3
  # Google Colab + CLI friendly
4
  # ============================================================
5
 
6
  import os
7
  import sys
8
  import json
 
9
  import csv
10
  import torch
11
+ from typing import List
12
  from transformers import AutoTokenizer, AutoModel
13
 
14
  # ============================================================
 
192
  raise ValueError("Неподдерживаемый формат файла")
193
 
194
  # ============================================================
195
+ # Interactive CLI Interface
196
  # ============================================================
197
 
198
+ class InteractiveCLI:
199
+ def __init__(self):
200
+ self.judge = RQAJudge()
201
+ self.mode_stack = []
202
+
203
+ def clear_screen(self):
204
+ """Очистка экрана для Google Colab"""
205
+ print("\n" * 2)
206
+
207
+ def show_mode_menu(self):
208
+ """Показать меню выбора режима"""
209
+ self.clear_screen()
210
+ print("=" * 60)
211
+ print("🤖 RQA — АНАЛИЗ ЛОГИЧЕСКИХ ОШИБОК")
212
+ print("=" * 60)
213
+ print("\nВыберите режим работы:")
214
+ print("1. 📝 Одиночный ввод (одна фраза для анализа)")
215
+ print("2. 📄 Множественный ввод (несколько фраз, каждая с новой строки)")
216
+ print("3. 📂 Загрузка из файла (.txt, .csv, .json)")
217
+ print("\nНажмите Enter без ввода для выхода.")
218
+ print("-" * 60)
219
+
220
+ def process_single_mode(self):
221
+ """Обработка одиночного режима"""
222
+ self.clear_screen()
223
+ print("[📝 РЕЖИМ: ОДИНОЧНЫЙ ВВОД]")
224
+ print("Введите текст для анализа:")
225
+ print("(Нажмите Enter без ввода для возврата в меню)")
226
+ print("-" * 40)
227
+
228
+ text = input("> ").strip()
229
+ if not text:
230
+ return True # Возврат в меню
231
+
232
+ result = self.judge.infer(text)
233
+ self.judge.pretty_print(result)
234
+
235
+ print("\n" + "-" * 40)
236
+ input("Нажмите Enter для продолжения...")
237
+ return False # Остаемся в том же режиме
238
+
239
+ def process_multiline_mode(self):
240
+ """Обработка режима множественного ввода"""
241
+ self.clear_screen()
242
+ print("[📄 РЕЖИМ: МНОЖЕСТВЕННЫЙ ВВОД]")
243
+ print("Введите тексты для анализа (каждый с новой строки).")
244
+ print("Оставьте строку пустой для завершения ввода.")
245
+ print("(Нажмите Enter без ввода для возврата в меню)")
246
+ print("-" * 40)
247
+
248
+ texts = []
249
+ print("Ввод текстов:")
250
+ while True:
251
+ line = input("> ").strip()
252
+ if not line:
253
+ if not texts: # Пустой ввод сразу - возврат в меню
254
+ return True
255
+ break # Завершение ввода
256
+ texts.append(line)
257
+
258
+ if texts:
259
+ self.clear_screen()
260
+ print(f"[📄 РЕЖИМ: МНОЖЕСТВЕННЫЙ ВВОД] — найдено {len(texts)} текстов")
261
+ print("-" * 40)
262
+
263
+ for i, text in enumerate(texts, 1):
264
+ print(f"\n🔍 Текст #{i}:")
265
+ result = self.judge.infer(text)
266
+ self.judge.pretty_print(result)
267
+
268
+ print("\n" + "=" * 60)
269
+ input("Нажмите Enter для продолжения...")
270
+
271
+ return False # Остаемся в том же режиме
272
+
273
+ def process_file_mode(self):
274
+ """Обработка режима загрузки из файла"""
275
+ self.clear_screen()
276
+ print("[📂 РЕЖИМ: ЗАГРУЗКА ИЗ ФАЙЛА]")
277
+ print("Поддерживаемые форматы: .txt, .csv, .json")
278
+ print("Укажите путь к файлу:")
279
+ print("(Нажмите Enter без ввода для возврата в меню)")
280
+ print("-" * 40)
281
+
282
+ file_path = input("Путь к файлу> ").strip()
283
+ if not file_path:
284
+ return True # Возврат в меню
285
+
286
+ try:
287
+ # Проверка существования файла
288
+ if not os.path.exists(file_path):
289
+ print(f"\n❌ Ошибка: Файл '{file_path}' не найден!")
290
+ input("\nНажмите Enter для продолжения...")
291
+ return False # Остаемся в том же режиме
292
+
293
+ # Загрузка текстов
294
+ texts = load_texts_from_file(file_path)
295
+
296
+ if not texts:
297
+ print(f"\n⚠️ Файл '{file_path}' пуст или не содержит текстов!")
298
+ input("\nНажмите Enter для продолжения...")
299
+ return False # Остаемся в том же режиме
300
+
301
+ # Обработка текстов
302
+ self.clear_screen()
303
+ print(f"[📂 РЕЖИМ: ЗАГРУЗКА ИЗ ФАЙЛА] — загружено {len(texts)} текстов")
304
+ print(f"Файл: {file_path}")
305
+ print("-" * 40)
306
+
307
+ for i, text in enumerate(texts, 1):
308
+ print(f"\n🔍 Текст #{i}:")
309
+ result = self.judge.infer(text)
310
+ self.judge.pretty_print(result)
311
+
312
+ print("\n" + "=" * 60)
313
+ input("Нажмите Enter для продолжения...")
314
+
315
+ except Exception as e:
316
+ print(f"\n❌ Ошибка при обработке файла: {str(e)}")
317
+ input("\nНажмите Enter для продолжения...")
318
+
319
+ return False # Остаемся в том же режиме
320
+
321
+ def run_interactive(self):
322
+ """Основной цикл интерактивного интерфейса"""
323
+ current_mode = None
324
+
325
  while True:
326
+ # Если нет текущего режима, показываем главное меню
327
+ if not current_mode:
328
+ self.show_mode_menu()
329
+ choice = input("Ваш выбор (1-3)> ").strip()
330
+
331
+ if not choice: # Пустой ввод - выход
332
+ print("\n👋 Выход из программы...")
333
+ break
334
+
335
+ if choice == "1":
336
+ current_mode = "single"
337
+ elif choice == "2":
338
+ current_mode = "multiline"
339
+ elif choice == "3":
340
+ current_mode = "file"
341
+ else:
342
+ print("\n❌ Неверный выбор! Попробуйте снова.")
343
+ input("Нажмите Enter для продолжения...")
344
+ continue
345
+
346
+ # Обработка текущего режима
347
+ should_return_to_menu = False
348
+
349
+ if current_mode == "single":
350
+ should_return_to_menu = self.process_single_mode()
351
+ elif current_mode == "multiline":
352
+ should_return_to_menu = self.process_multiline_mode()
353
+ elif current_mode == "file":
354
+ should_return_to_menu = self.process_file_mode()
355
+
356
+ # Возврат в меню при необходимости
357
+ if should_return_to_menu:
358
+ current_mode = None
359
 
360
+ # ============================================================
361
+ # Точка входа
362
+ # ============================================================
 
 
 
 
 
 
363
 
364
+ def main():
365
+ """Основная функция - запускает интерактивный интерфейс"""
366
+ cli = InteractiveCLI()
367
+ cli.run_interactive()
368
 
369
+ # ============================================================
370
+ # Запуск
371
+ # ============================================================
372
 
373
  if __name__ == "__main__":
374
+ main()