Advertisement
nicuf

python add text diacritics form

Aug 20th, 2023
816
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.27 KB | None | 0 0
  1. # ROMANIAN: https://neculaifantanaru.com/python-adauga-text-diacritice-form.html
  2.  
  3. # ENGLISH: https://neculaifantanaru.com/python-add-text-diacritics-form.html
  4.  
  5. import tkinter as tk
  6. import re
  7. from tkinter import messagebox, simpledialog
  8. from unidecode import unidecode  # Importați unidecode
  9.  
  10. punctuation = re.compile("[:;,\.\"'”“\?!]")
  11.  
  12. # Citim cuvintele din dictionar.txt
  13. with open('dictionar.txt', 'r', encoding='utf-8') as f:
  14.     dictionar = f.read().split(', ')
  15.  
  16. # Citim cuvintele din dictionar-2.txt
  17. with open('dictionar-2.txt', 'r', encoding='utf-8') as f:
  18.     dictionar_2 = f.read().split(', ')
  19.  
  20. def get_words(text, lower=False):
  21.     words = re.findall(r'\b\w+(?:-\w+)?\b', text)  # Ajustăm expresia regulată aici
  22.     if lower:
  23.         return [word.lower() for word in words]
  24.     return words
  25.  
  26. def replace(text, old, new):
  27.     if old[0].isupper():
  28.         new = new.capitalize()
  29.     return re.sub(r'\b' + re.escape(old) + r'\b', new, text, flags=re.IGNORECASE)
  30.  
  31. def adauga_diacritice():
  32.     # Extragem textul din widget-ul Text
  33.     text_original = text_input.get("1.0", tk.END)
  34.  
  35.     # Împărțim textul în linii
  36.     linii = text_original.split('\n')
  37.  
  38.     # Procesăm fiecare linie separat
  39.     linii_procesate = []
  40.     for linie in linii:
  41.         cuvinte_linie = re.split(r'(\W+)', linie)  # Folosim regex pentru a extrage cuvintele și semnele de punctuație separat
  42.         linie_finala = []
  43.         for cuvant in cuvinte_linie:
  44.             if cuvant and cuvant[0].isalpha():  # Verificăm dacă este cuvânt
  45.                 cuvant_fara_diacritice = unidecode(cuvant).lower()
  46.                 if cuvant_fara_diacritice in dictionar_2:
  47.                     idx = dictionar_2.index(cuvant_fara_diacritice)
  48.                     if cuvant[0].isupper():
  49.                         linie_finala.append(dictionar[idx].capitalize())
  50.                     else:
  51.                         linie_finala.append(dictionar[idx])
  52.                 else:
  53.                     linie_finala.append(cuvant)
  54.             else:
  55.                 linie_finala.append(cuvant)  # Adăugăm semnele de punctuație fără modificări
  56.         linii_procesate.append(''.join(linie_finala))
  57.  
  58.     # Construim textul final, păstrând alineatele
  59.     text_final = '\n'.join(linii_procesate)
  60.  
  61.     # Calculăm diferențele dintre textul original și cel procesat
  62.     diacritice_adaugate = sum(1 for char1, char2 in zip(text_original, text_final) if char1 != char2)
  63.     cuvinte_modificate = sum(1 for word1, word2 in zip(get_words(text_original), get_words(text_final)) if word1 != word2)
  64.  
  65.     # Ștergem conținutul actual și adăugăm textul procesat
  66.     text_input.delete("1.0", tk.END)
  67.     text_input.insert(tk.END, text_final)
  68.  
  69.     # Afișăm mesajul corespunzător
  70.     if diacritice_adaugate == 0:
  71.         messagebox.showinfo("Informare", "Nu s-au găsit diacritice de adăugat.")
  72.     else:
  73.         messagebox.showinfo("Informare", f"S-au adăugat {diacritice_adaugate} diacritice la {cuvinte_modificate} cuvinte.")
  74.  
  75.  
  76.  
  77. def elimina_sufix(cuvant):
  78.     for sufix in SUFIXE:
  79.         if cuvant.endswith(sufix):
  80.             return cuvant[:-len(sufix)]
  81.     return cuvant
  82.  
  83. def elimina_operatori(cuvant):
  84.     operatori = [":", '"', "'", ".", "”", "“", ",", ";", "?", "!"]
  85.     while cuvant and cuvant[0] in operatori:
  86.         cuvant = cuvant[1:]
  87.     while cuvant and cuvant[-1] in operatori:
  88.         cuvant = cuvant[:-1]
  89.     return cuvant
  90.  
  91. import pprint
  92.  
  93. def verifica_text(cuvinte_text):
  94.     text_input.tag_remove("evidentiat", "1.0", tk.END)
  95.     text_input.tag_remove("negasit", "1.0", tk.END)  # Adăugăm această linie pentru a șterge eticheta anterioară
  96.     cuvant_gasit = False
  97.  
  98.     words = get_words(text_input.get("1.0", tk.END))
  99.  
  100.     for cuv in words:
  101.         cuv_baza = elimina_sufix(cuv).lower()
  102.         cuv_baza = elimina_operatori(cuv_baza)
  103.  
  104.         if cuv_baza not in [d.lower() for d in dictionar] and cuv_baza not in [d.lower() for d in dictionar_2] and cuv_baza not in CUVINTE_SKIP:
  105.             start_indices = [match.start() for match in re.finditer(r'\b' + re.escape(cuv) + r'\b', text_input.get("1.0", tk.END))]
  106.  
  107.             for start_index in start_indices:
  108.                 # Convertim indexul absolut în formatul linie.colonă pentru widget-ul Text
  109.                 line_col_start = text_input.index(f"1.0 + {start_index} chars")
  110.                 line_col_end = text_input.index(f"{line_col_start} + {len(cuv)} chars")
  111.  
  112.                 if not cuvant_gasit:
  113.                     text_input.tag_add("evidentiat", line_col_start, line_col_end)
  114.                     text_input.tag_configure("evidentiat", background="yellow", font=("Arial", 12, "bold"))
  115.                     cuvant_gasit = True
  116.                     print(f"Cuvântul '{cuv}' nu a fost găsit în dicționare.")
  117.                 else:
  118.                     text_input.tag_add("negasit", line_col_start, line_col_end)
  119.                     text_input.tag_configure("negasit", foreground="red")
  120.  
  121.     if not cuvant_gasit:
  122.         messagebox.showinfo("Informare", "Totul este ok!")
  123.  
  124.  
  125. def modifica_cuvant():
  126.     global continut_dictionar, dictionar, dictionar_2
  127.     start_index = text_input.tag_ranges("evidentiat")[0]
  128.     end_index = text_input.tag_ranges("evidentiat")[1]
  129.     cuvant = text_input.get(start_index, end_index)
  130.  
  131.     cuvant_modificat = simpledialog.askstring("Modificare cuvânt", f"Modificați cuvântul '{cuvant}':")
  132.     if cuvant_modificat:
  133.         cuvant_modificat = elimina_sufix(cuvant_modificat).lower()
  134.         cuvant_modificat = elimina_operatori(cuvant_modificat)
  135.  
  136.         if cuvant_modificat:
  137.             text_input.delete(start_index, end_index)
  138.             text_input.insert(start_index, cuvant_modificat)
  139.             cuvant_baza = elimina_sufix(cuvant).lower()
  140.             cuvant_baza = elimina_operatori(cuvant_baza)
  141.             continut_dictionar += f", {cuvant_modificat}"
  142.             with open('dictionar.txt', 'a', encoding='utf-8') as f:
  143.                 f.write(f", {cuvant_modificat}")
  144.             if cuvant_baza in CUVINTE_SKIP:
  145.                 CUVINTE_SKIP.remove(cuvant_baza)
  146.  
  147.             # Adăugăm cuvântul modificat în dictionar-2.txt fără diacritice
  148.             cuvant_fara_diacritice = unidecode(cuvant_modificat)
  149.             with open('dictionar-2.txt', 'a', encoding='utf-8') as f:
  150.                 f.write(f", {cuvant_fara_diacritice}")
  151.  
  152.             # Actualizăm dicționarele globale
  153.             dictionar.append(cuvant_modificat)
  154.             dictionar_2.append(cuvant_fara_diacritice)
  155.  
  156.             # Re-verificăm textul după modificare
  157.             verifica_text(text_input.get("1.0", tk.END).split())
  158.  
  159.  
  160. def skip_cuvant():
  161.     tag_ranges = text_input.tag_ranges("evidentiat")
  162.     if tag_ranges:
  163.         start_index = tag_ranges[0]
  164.         end_index = tag_ranges[1]
  165.         cuvant = text_input.get(start_index, end_index)
  166.         cuvant_baza = elimina_sufix(cuvant).lower()
  167.         cuvant_baza = elimina_operatori(cuvant_baza)
  168.         if cuvant_baza not in continut_dictionar and cuvant_baza not in CUVINTE_SKIP:
  169.             CUVINTE_SKIP.append(cuvant_baza)
  170.             with open('dictionar.txt', 'a', encoding='utf-8') as f:
  171.                 f.write(f", {cuvant}")
  172.  
  173.             # Adăugăm cuvântul skip în dictionar-2.txt fără diacritice
  174.             cuvant_fara_diacritice = unidecode(cuvant)
  175.             with open('dictionar-2.txt', 'a', encoding='utf-8') as f:
  176.                 f.write(f", {cuvant_fara_diacritice}")
  177.  
  178.         verifica_text(text_input.get("1.0", tk.END).split())
  179.     else:
  180.         messagebox.showinfo("Eroare", "Nu există cuvinte evidențiate pentru a fi ignorate.")
  181.  
  182.  
  183. def make_diacritic_word_dictionary():
  184.     with open("dictionar.txt", "r", encoding="utf-8") as f1, open("dictionar-2.txt", "r", encoding="utf-8") as f2:
  185.         d = get_words(f1.read(), lower=True)
  186.         d2 = get_words(f2.read(), lower=True)
  187.     return {w2: w for w, w2 in zip(d, d2) if w != w2}
  188.  
  189. plain_2_diacritic = make_diacritic_word_dictionary()
  190.  
  191. SUFIXE = ["-mi", "-a", "-ti", "-au"]
  192. CUVINTE_SKIP = []
  193.  
  194. with open('dictionar.txt', 'r', encoding='utf-8') as f:
  195.     continut_dictionar = f.read().lower()
  196.  
  197.  
  198. # inceput form
  199.  
  200.  
  201. root = tk.Tk()
  202. root.title("Adăugare Diacritice")
  203. root.geometry("600x400")
  204.  
  205. frame = tk.Frame(root, bg="lightgray")
  206. frame.pack(pady=20, fill=tk.BOTH, expand=True)
  207.  
  208. # Creăm un nou frame pentru butoane
  209. menu_frame = tk.Frame(frame, bg="lightgray")
  210. menu_frame.pack(pady=10, fill=tk.X)
  211.  
  212. btn_verifica = tk.Button(menu_frame, text="Verificare", command=lambda: verifica_text(text_input.get("1.0", tk.END).split()))
  213. btn_verifica.pack(side=tk.LEFT, padx=10)
  214.  
  215. btn_modifica = tk.Button(menu_frame, text="Modificare", command=modifica_cuvant)
  216. btn_modifica.pack(side=tk.LEFT, padx=10)
  217.  
  218. btn_skip = tk.Button(menu_frame, text="Skip", command=skip_cuvant)
  219. btn_skip.pack(side=tk.LEFT, padx=10)
  220.  
  221. btn_diacritice = tk.Button(menu_frame, text="Diacritice", command=adauga_diacritice)
  222. btn_diacritice.pack(side=tk.LEFT, padx=10)
  223.  
  224.  
  225. text_input = tk.Text(frame, height=15, width=50, wrap=tk.WORD, padx=20, pady=20)  # Adăugăm pady=20 aici
  226. text_input.pack(pady=10, side=tk.LEFT, fill=tk.BOTH, expand=True)
  227.  
  228.  
  229. scrollbar = tk.Scrollbar(frame, command=text_input.yview)
  230. scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
  231.  
  232. text_input.config(yscrollcommand=scrollbar.set)
  233.  
  234. root.mainloop()
  235.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement