Neculai Fantanaru

Totul depinde de cine conduce

Python: диакритические знаки (àâîșt ) - автоматически преобразовывать слова в текст с диакритическими знаками

On August 20, 2023
, in
Python Scripts Examples by Neculai Fantanaru

Вы можете просмотреть весь код здесь: https://pastebin.com/8j96Q4sN

diacritics

Проверка – проверьте, существуют ли слова в словаре.txt и в словаре-2.txt.

Modificare - (After pressing the Check button) Edit the word and save it in both dictionaries.

Skip - (After pressing the Check button) - Automatically saves the word in both dictionaries.

Diacritice - Add diacritics to the text. Look for the words that exist in both dictionaries, compare them, and depending on the differences, add diacritics.

-------------------------

dictionar.txt - It includes all the words, separated by a comma, including those which contain diacritics. Examples of words from dictionary.txt:

să, de, trebuie, leadershipul, se, ghideze, după, calitate, următorul, principiu, sufletească, inimă

dictionar.txt - It contains exactly the same words from dictionary.txt, separated by a comma, but which do not contain diacritics. Examples of words from dictionary.txt:

sa, de, trebuie, leadershipul, se, ghideze, dupa, calitate, urmatorul, principiu, sufleteasca, inima

# VERSIUNEA: "Diacritice-Gata"
import tkinter as tk
import re
from tkinter import messagebox, simpledialog
from unidecode import unidecode  # Importați unidecode
punctuation = re.compile("[:;,\.\"'\?!]")
# Citim cuvintele din dictionar.txt
# Citim cuvintele din dictionar.txt și le convertim la lowercase
with open('dictionar.txt', 'r', encoding='utf-8') as f:
   dictionar = [word.lower() for word in f.read().split(', ')]
# Citim cuvintele din dictionar-2.txt și le convertim la lowercase
with open('dictionar-2.txt', 'r', encoding='utf-8') as f:
   dictionar_2 = [word.lower() for word in f.read().split(', ')]
def get_words(text, lower=False):
   words = re.findall(r'\b\w+(?:-\w+)?\b', text)  # Ajustăm expresia regulată aici
   if lower:
       return [word.lower() for word in words]
   return words
def replace(text, old, new):
   if old[0].isupper():
       new = new.capitalize()
   return re.sub(r'\b' + re.escape(old) + r'\b', new, text, flags=re.IGNORECASE)
def adauga_diacritice():
   # Extragem textul din widget-ul Text
   text_original = text_input.get("1.0", tk.END)
   # Împărțim textul în linii
   linii = text_original.split('\n')
   # Procesăm fiecare linie separat
   linii_procesate = []
   for linie in linii:
       cuvinte_linie = re.split(r'(\W+)', linie)  # Folosim regex pentru a extrage cuvintele și semnele de punctuație separat
       linie_finala = []
       for cuvant in cuvinte_linie:
           if cuvant and cuvant[0].isalpha():  # Verificăm dacă este cuvânt
               cuvant_fara_diacritice = unidecode(cuvant).lower()
               print(f"Verificăm cuvântul: {cuvant} ({cuvant_fara_diacritice})")
               if cuvant_fara_diacritice in dictionar_2:
                   idx = dictionar_2.index(cuvant_fara_diacritice)
                   cuvant_nou = dictionar[idx] if cuvant[0].islower() else dictionar[idx].capitalize()
                   print(f"Înlocuim {cuvant} cu {cuvant_nou}")
                   linie_finala.append(cuvant_nou)
               else:
                   print(f"Cuvântul {cuvant} nu a fost găsit în dicționar.")
                   linie_finala.append(cuvant)
           else:
               linie_finala.append(cuvant)  # Adăugăm semnele de punctuație fără modificări
       linii_procesate.append(''.join(linie_finala))
   # Construim textul final, păstrând alineatele
   text_final = '\n'.join(linii_procesate)
   # Calculăm diferențele dintre textul original și cel procesat
   diacritice_adaugate = sum(1 for char1, char2 in zip(text_original, text_final) if char1 != char2)
   cuvinte_modificate = sum(1 for word1, word2 in zip(get_words(text_original), get_words(text_final)) if word1 != word2)
   # Ștergem conținutul actual și adăugăm textul procesat
   text_input.delete("1.0", tk.END)
   text_input.insert(tk.END, text_final)
   # Afișăm mesajul corespunzător
   if diacritice_adaugate == 0:
       messagebox.showinfo("Informare", "Nu s-au găsit diacritice de adăugat.")
   else:
       messagebox.showinfo("Informare", f"S-au adăugat {diacritice_adaugate} diacritice la {cuvinte_modificate} cuvinte.")
def elimina_sufix(cuvant):
   for sufix in SUFIXE:
       if cuvant.endswith(sufix):
           return cuvant[:-len(sufix)]
   return cuvant
def elimina_operatori(cuvant):
   operatori = [":", '"', "'", ".", "", "", ",", ";", "?", "!"]
   while cuvant and cuvant[0] in operatori:
       cuvant = cuvant[1:]
   while cuvant and cuvant[-1] in operatori:
       cuvant = cuvant[:-1]
   return cuvant
import pprint
def verifica_text(cuvinte_text):
   text_input.tag_remove("evidentiat", "1.0", tk.END)
   text_input.tag_remove("negasit", "1.0", tk.END)
   cuvant_gasit = False
   words = get_words(text_input.get("1.0", tk.END))
   for cuv in words:
       cuv_baza = elimina_sufix(cuv).lower()
       cuv_baza = elimina_operatori(cuv_baza)
       if cuv_baza in CUVINTE_SARITE:
           continue  # Sărim peste acest cuvânt
       pattern = re.compile(r'\b' + re.escape(cuv_baza) + r'\b')
       if not any(pattern.search(d) for d in dictionar) and not any(pattern.search(d) for d in dictionar_2) and cuv_baza not in CUVINTE_ADD:
           start_indices = [match.start() for match in re.finditer(r'\b' + re.escape(cuv) + r'\b', text_input.get("1.0", tk.END))]
           for start_index in start_indices:
               line_col_start = text_input.index(f"1.0 + {start_index} chars")
               line_col_end = text_input.index(f"{line_col_start} + {len(cuv)} chars")
               if not cuvant_gasit:
                   text_input.tag_add("evidentiat", line_col_start, line_col_end)
                   text_input.tag_configure("evidentiat", background="yellow", font=("Arial", 12, "bold"))
                   cuvant_gasit = True
                   print(f"Cuvântul '{cuv}' nu a fost găsit în dicționare.")
               else:
                   text_input.tag_add("negasit", line_col_start, line_col_end)
                   text_input.tag_configure("negasit", foreground="red")
   if not cuvant_gasit:
       messagebox.showinfo("Informare", "Totul este ok!")
def modifica_cuvant():
   global continut_dictionar, dictionar, dictionar_2
   start_index = text_input.tag_ranges("evidentiat")[0]
   end_index = text_input.tag_ranges("evidentiat")[1]
   cuvant = text_input.get(start_index, end_index)
   cuvant_modificat = simpledialog.askstring("Modificare cuvânt", f"Modificați cuvântul '{cuvant}':")
   if cuvant_modificat:
       cuvant_modificat = elimina_sufix(cuvant_modificat).lower()
       cuvant_modificat = elimina_operatori(cuvant_modificat)
       if cuvant_modificat:
           text_input.delete(start_index, end_index)
           text_input.insert(start_index, cuvant_modificat)
           cuvant_baza = elimina_sufix(cuvant).lower()
           cuvant_baza = elimina_operatori(cuvant_baza)
           continut_dictionar += f", {cuvant_modificat}"
           with open('dictionar.txt', 'a', encoding='utf-8') as f:
               f.write(f", {cuvant_modificat}")
           if cuvant_baza in CUVINTE_ADD:
               CUVINTE_ADD.remove(cuvant_baza)
           # Adăugăm cuvântul modificat în dictionar-2.txt fără diacritice
           cuvant_fara_diacritice = unidecode(cuvant_modificat)
           with open('dictionar-2.txt', 'a', encoding='utf-8') as f:
               f.write(f", {cuvant_fara_diacritice}")
           # Actualizăm dicționarele globale
           dictionar.append(cuvant_modificat)
           dictionar_2.append(cuvant_fara_diacritice)
           # Re-verificăm textul după modificare
           verifica_text(text_input.get("1.0", tk.END).split())
def add_cuvant():
   tag_ranges = text_input.tag_ranges("evidentiat")
   if tag_ranges:
       for start_index, end_index in zip(tag_ranges[0::2], tag_ranges[1::2]):
           cuvant = text_input.get(start_index, end_index)
           cuvant_baza = elimina_sufix(cuvant).lower()
           cuvant_baza = elimina_operatori(cuvant_baza)
           este_inclus = False
           for cuvant_existent in dictionar + dictionar_2:
               if re.search(r'\b' + re.escape(cuvant_baza) + r'\b', cuvant_existent, flags=re.IGNORECASE):
                   este_inclus = True
                   break
           if not este_inclus:
               CUVINTE_ADD.append(cuvant_baza)
               with open('dictionar.txt', 'a', encoding='utf-8') as f:
                   f.write(f", {cuvant}")
               # Adăugăm cuvântul add în dictionar-2.txt fără diacritice
               cuvant_fara_diacritice = unidecode(cuvant)
               with open('dictionar-2.txt', 'a', encoding='utf-8') as f:
                   f.write(f", {cuvant_fara_diacritice}")
               # Actualizăm dictionarul intern pentru a include noul cuvânt
               dictionar.append(cuvant_baza)
               dictionar_2.append(cuvant_fara_diacritice)
               # Ștergem tag-urile de evidențiere pentru cuvantul actual
               text_input.tag_remove("evidentiat", start_index, end_index)
               print(f"Am adăugat cuvântul '{cuvant}' în dicționar.")
               print(f"Am adăugat cuvântul '{cuvant_fara_diacritice}' în dictionar-2.txt.")
       verifica_text(text_input.get("1.0", tk.END).split())
   else:
       messagebox.showinfo("Eroare", "Nu există cuvinte evidențiate pentru a fi ignorate.")
def make_diacritic_word_dictionary():
   with open("dictionar.txt", "r", encoding="utf-8") as f1, open("dictionar-2.txt", "r", encoding="utf-8") as f2:
       d = get_words(f1.read(), lower=True)
       d2 = get_words(f2.read(), lower=True)
   return {w2: w for w, w2 in zip(d, d2) if w != w2}
plain_2_diacritic = make_diacritic_word_dictionary()
SUFIXE = ["-mi", "-a", "-ti", "-au"]
CUVINTE_ADD = []
with open('dictionar.txt', 'r', encoding='utf-8') as f:
   continut_dictionar = f.read().lower()
CUVINTE_SARITE = []
def skip_cuvant():
   tag_ranges = text_input.tag_ranges("evidentiat")
   if tag_ranges:
       start_index = tag_ranges[0]
       end_index = tag_ranges[1]
       cuvant_sarit = text_input.get(start_index, end_index)
       CUVINTE_SARITE.append(cuvant_sarit.lower())
       text_input.tag_remove("evidentiat", start_index, end_index)
       verifica_text(text_input.get("1.0", tk.END).split())
   else:
       messagebox.showinfo("Eroare", "Nu există cuvinte evidențiate pentru a fi sărite.")
# inceput form
root = tk.Tk()
root.title("Adăugare Diacritice")
root.geometry("600x400")
frame = tk.Frame(root, bg="lightgray")
frame.pack(pady=20, fill=tk.BOTH, expand=True)
# Creăm un nou frame pentru butoane
menu_frame = tk.Frame(frame, bg="lightgray")
menu_frame.pack(pady=10, fill=tk.X)
btn_verifica = tk.Button(menu_frame, text="Verificare", command=lambda: verifica_text(text_input.get("1.0", tk.END).split()))
btn_verifica.pack(side=tk.LEFT, padx=10)
btn_modifica = tk.Button(menu_frame, text="Modificare", command=modifica_cuvant)
btn_modifica.pack(side=tk.LEFT, padx=10)
btn_add = tk.Button(menu_frame, text="Add", command=add_cuvant)
btn_add.pack(side=tk.LEFT, padx=10)
btn_skip = tk.Button(menu_frame, text="Skip", command=skip_cuvant)
btn_skip.pack(side=tk.LEFT, padx=10)
btn_diacritice = tk.Button(menu_frame, text="Diacritice", command=adauga_diacritice)
btn_diacritice.pack(side=tk.LEFT, padx=10)
text_input = tk.Text(frame, height=15, width=50, wrap=tk.WORD, padx=20, pady=20)  # Adăugăm pady=20 aici
text_input.pack(pady=10, side=tk.LEFT, fill=tk.BOTH, expand=True)
scrollbar = tk.Scrollbar(frame, command=text_input.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
text_input.config(yscrollcommand=scrollbar.set)
root.mainloop()


That's all folks.


Также ознакомьтесь с другими моими скриптами Python ---ЗДЕСЬ---

Alatura-te Comunitatii Neculai Fantanaru
63 качества лидера
Cele 63 de calităţi ale liderului

Почему должен сколько ты это читаешь? книга? Потому что имеет решающее значение для оптимизации вашей производительности. Существование уделяет больше внимания человеческой сторонеă а не на бизнес-концепции, которая легко позволяет читая и понимая это.

Лидерство - Magia măiestriei
Leadership - Magia măiestriei

Самый важный поезд этой дороги, faţă из других, существующих на рынкеţă из этой области, это то, что описывает на примерах идеальные компетенции лидера. Я никогда не поддерживал сă это легко ты станешь очень хорошим руководителем, но еслиă вы будете следовать шаг за шагом...

Прикосновение мастера
Atingerea maestrului

Для некоторых лидеров “ведущие” îсреднееă больше играть в игру «ах, в игру ума!» şи понимание; для других это азартная игра, игра, в которой я думаю, что смогу выиграть каждый раз, когда зайду. рискуя şи ставя все на одногоă книга.

Руководитель и ведущий
Лидерство - включено î выбор не каждого

Цель этой книги — показать вам предложить как можно больше ценной информации на конкретных примерах и был бы способ он показал способность определять других и я вижуă вещи с этой точки зрения как ты.

Лидерство - Пе înţизбранный наставник
Лидерство - Вкл. ˆ по выбору каждого

Я следую в рядах этого ордена, чтобы пробудить в простом человеке интерес к действию и успеху. Смысл этого тома заключается в том, что сильная нация он состоит из сильных и успешных людей. И у каждого из нас есть потенциал, поэтому успех…