/
makster
/
clear_text
Обзор
Документация
Войти
/
makster
/
clear_text
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
scripts/make_pairs_script.py
118 строк
4 KB
admin
add pair maker script
06 ноя 2025, 18:39
06 ноя 2025, 18:39
901e9b4
Код
Авторство
О чём код?
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import json import tkinter as tk from tkinter import ttk, filedialog, messagebox def parse_rules(s: str): # разделители: запятая, точка с запятой, перевод строки/точка с запятой raw = [x.strip() for x in s.replace(";", ",").split(",")] items = [x for x in raw if x] return items class App(tk.Tk): def __init__(self): super().__init__() self.title("Pair Packer (3 fields) — JSONL") self.geometry("900x640") self.out_path = tk.StringVar(value="dataset.jsonl") top = ttk.Frame(self, padding=10) top.pack(fill="x") ttk.Label(top, text="Output JSONL").grid(row=0, column=0, sticky="w") ttk.Entry(top, textvariable=self.out_path, width=60).grid( row=0, column=1, sticky="ew", padx=6 ) ttk.Button(top, text="Browse…", command=self._browse).grid(row=0, column=2) top.columnconfigure(1, weight=1) panes = ttk.Panedwindow(self, orient=tk.HORIZONTAL) panes.pack(fill="both", expand=True, padx=10, pady=10) left = ttk.Frame(panes) right = ttk.Frame(panes) panes.add(left, weight=1) panes.add(right, weight=1) ttk.Label(left, text="Source (плохой)").pack(anchor="w") self.source = tk.Text(left, wrap="word", height=18) self.source.pack(fill="both", expand=True) ttk.Label(right, text="Target (исправленный)").pack(anchor="w") self.target = tk.Text(right, wrap="word", height=18) self.target.pack(fill="both", expand=True) rules_frame = ttk.LabelFrame( self, text="Нарушенные правила (через запятую или с новой строки)", padding=10, ) rules_frame.pack(fill="both", expand=False, padx=10, pady=(0, 10)) self.rules = tk.Text(rules_frame, wrap="word", height=6) self.rules.pack(fill="both", expand=True) actions = ttk.Frame(self, padding=10) actions.pack(fill="x") ttk.Button(actions, text="Сохранить пару", command=self._save).pack( side="right" ) ttk.Button(actions, text="Новая пара", command=self._clear).pack( side="right", padx=(0, 8) ) def _browse(self): path = filedialog.asksaveasfilename( title="Выбрать JSON файл", defaultextension=".jsonl", filetypes=[("JSON Lines", "*.jsonl"), ("Все файлы", "*.*")], ) if path: self.out_path.set(path) def _collect(self): src = self.source.get("1.0", "end-1c").strip() tgt = self.target.get("1.0", "end-1c").strip() rtxt = self.rules.get("1.0", "end-1c").strip() return src, tgt, rtxt def _validate(self, src, tgt, rtxt): errs = [] if not src: errs.append("Пустой исходный текст") if not tgt: errs.append("Пустой исправленный текст") if not rtxt: errs.append("Не указаны нарушенные правила") return errs def _save(self): src, tgt, rtxt = self._collect() errs = self._validate(src, tgt, rtxt) if errs: messagebox.showwarning("Проверка данных", "\n".join(errs)) return item = { "source_text": src, "target_text": tgt, "rules_violated": parse_rules(rtxt), } try: with open(self.out_path.get(), "a", encoding="utf-8") as f: f.write(json.dumps(item, ensure_ascii=False) + "\n") messagebox.showinfo( "Сохранено", f"Данные добавлены в файл: {self.out_path.get()}" ) except Exception as e: messagebox.showerror("Ошибка записи", f"Не удалось записать файл: {str(e)}") def _clear(self): self.source.delete("1.0", "end") self.target.delete("1.0", "end") self.rules.delete("1.0", "end") if __name__ == "__main__": App().mainloop()