SHOW:
|
|
- or go back to the newest paste.
| 1 | # ENGLISH: https://neculaifantanaru.com/en/python-analyzing-person-psychology.html | |
| 2 | ||
| 3 | # ROMANIAN: https://neculaifantanaru.com/python-analizarea-persoanei-psihologie.html | |
| 4 | ||
| 5 | ||
| 6 | import tkinter as tk | |
| 7 | from textblob import TextBlob | |
| 8 | from googletrans import Translator | |
| 9 | import re | |
| 10 | from unidecode import unidecode | |
| 11 | ||
| 12 | ||
| 13 | # Funcție pentru analiza sentimentului și subiectivității | |
| 14 | def analyze_sentiment(text): | |
| 15 | translator = Translator() | |
| 16 | translated_text = translator.translate(text, src='ro', dest='en').text | |
| 17 | blob = TextBlob(translated_text) | |
| 18 | sentiment = blob.sentiment.polarity | |
| 19 | subjectivity = blob.sentiment.subjectivity | |
| 20 | return sentiment, subjectivity | |
| 21 | ||
| 22 | # Dicționar cu cuvinte pozitive și negative | |
| 23 | positive_words = [ | |
| 24 | "da", "iubesc", "admir", "bunătate", "de acord", "fericit", "încrezător", "optimist", "satisfăcut", | |
| 25 | "energic", "vital", "plin de viață", "entuziasmat", "mulțumit", "recunoscător", "liniștit", "relaxat", | |
| 26 | "calm", "echilibrat", "armonios", "inspirat", "motivat", "curajos", "puternic", "rezistent", "înțelegător", | |
| 27 | "empatic", "generos", "amabil", "prietenos", "sincronizat", "conectat", "unit", "împăcat", "acceptant", | |
| 28 | "tolerant", "deschis", "onest", "autentic", "real", "veridic", "sincer", "franc", "direct", "clar", | |
| 29 | "luminos", "stralucitor", "radiant", "sclipitor", "măreț", "splendid", "magnific", "glorios", "sublim", | |
| 30 | "nobil", "onorabil", "demn", "respectuos", "politos", "curtenitor", "elegant", "rafinat", "distins", | |
| 31 | "înalt", "superior", "excelent", "perfect", "impecabil", "ireproșabil", "fără greșeală", "corect", | |
| 32 | "drept", "just", "echitabil", "imparțial", "necondiționat", "absolut", "complet", "integral", "total", | |
| 33 | "universal", "global", "general", "cuprinzător", "inclusiv", "extensiv", "larg", "vast", "imens", | |
| 34 | "profund", "intens", "puternic", "putere", "energie", "vigoare", "forță", "rezistență", "stabilitate", | |
| 35 | "splendidă", "liber", "calm" | |
| 36 | ] | |
| 37 | ||
| 38 | negative_words = [ | |
| 39 | "nu", "nu sunt", "neplăcere", "disconfort", "nasol", "urăsc", "nu vreau", "obosit", "stresat", | |
| 40 | "frustrat", "dezamăgit", "furios", "trist", "bolnav", "plictisit", "nervos", "gelos", "invidios", | |
| 41 | "dezgustat", "rușinat", "vinovat", "nefericit", "nemulțumit", "neîncrezător", "pesimist", "copleșit", | |
| 42 | "panicat", "îngrijorat", "speriat", "timorat", "neajutorat", "slăbit", "defetist", "dezorientat", | |
| 43 | "confuz", "neputincios", "iritat", "agitat", "furie", "ura", "invidie", "gelozie", "dispreț", | |
| 44 | "mânie", "răzbunare", "frică", "teamă", "anxietate", "depresie", "tristețe", "melancolie", "apatie", | |
| 45 | "plictiseală", "dezinteres", "nepăsare", "indiferență", "neîncredere", "suspiciune", "îndoială", | |
| 46 | "necredință", "neînțelegere", "conflict", "tensiune", "presiune", "stres", "nervozitate", "iritare", | |
| 47 | "agresivitate", "violenta", "ostilitate", "răutate", "cruel", "malițios", "vătămător", "distructiv", | |
| 48 | "nociv", "periculos", "amenințător", "sinistru", "fatal", "letal", "mortal", "dăunător", "murdar", "nesatisfacut", | |
| 49 | "dificil", "confuz", "neliniștit", "bou", "vaca" | |
| 50 | ] | |
| 51 | ||
| 52 | ||
| 53 | # Funcție pentru a prelua textul și a efectua analiza | |
| 54 | def analyze(): | |
| 55 | ||
| 56 | # Afișează mesajul de încărcare | |
| 57 | loading_label = tk.Label(root, text="Analiza în curs... Vă rugăm așteptați.") | |
| 58 | loading_label.pack(padx=10, pady=10) | |
| 59 | root.update_idletasks() # Actualizează interfața pentru a afișa mesajul de încărcare | |
| 60 | ||
| 61 | text = text_entry.get("1.0", tk.END)
| |
| 62 | journal_entries = re.split(r'[.!?]', text) | |
| 63 | ||
| 64 | positive_count = 0 | |
| 65 | negative_count = 0 | |
| 66 | ||
| 67 | # Ascunde mesajul de încărcare | |
| 68 | loading_label.destroy() | |
| 69 | ||
| 70 | # Afisare rezultate într-o fereastră nouă | |
| 71 | results_window = tk.Toplevel(root) | |
| 72 | results_window.title("Rezultate Analiză")
| |
| 73 | results_text = tk.Text(results_window, wrap=tk.WORD, width=80, height=20) | |
| 74 | results_text.pack(padx=10, pady=10) | |
| 75 | results_text.insert(tk.END, "Valoare Sentiment | Subiectivitate\n") | |
| 76 | results_text.insert(tk.END, "--------------------------------------------\n\n") | |
| 77 | for entry in journal_entries: | |
| 78 | entry = entry.strip() | |
| 79 | if entry: | |
| 80 | sentiment, subjectivity = analyze_sentiment(entry) | |
| 81 | results_text.insert(tk.END, entry + '\n') | |
| 82 | results_text.insert(tk.END, str(sentiment) + " | " + str(subjectivity) + '\n\n') | |
| 83 | ||
| 84 | # Contorizarea cuvintelor pozitive și negative | |
| 85 | for word in entry.split(): | |
| 86 | word_without_diacritics = unidecode(word.lower()) | |
| 87 | if any(word_without_diacritics.startswith(unidecode(w)) for w in positive_words): | |
| 88 | positive_count += 1 | |
| 89 | if any(word_without_diacritics.startswith(unidecode(w)) for w in negative_words): | |
| 90 | negative_count += 1 | |
| 91 | ||
| 92 | # Caracterizare persoană | |
| 93 | characterization = "Caracterizare persoană:\n------------------------\n" | |
| 94 | if positive_count > negative_count: | |
| 95 | characterization += "Persoana pare a fi optimistă și are o atitudine pozitivă.\n" | |
| 96 | elif negative_count > positive_count: | |
| 97 | characterization += "Persoana pare a fi pesimistă și are o atitudine negativă.\n" | |
| 98 | else: | |
| 99 | characterization += "Persoana pare a avea o atitudine echilibrată.\n" | |
| 100 | ||
| 101 | results_text.insert(tk.END, characterization) | |
| 102 | ||
| 103 | # Permiterea copierii și lipirii | |
| 104 | results_text.bind("<Control-c>", copy)
| |
| 105 | results_text.bind("<Control-v>", paste)
| |
| 106 | ||
| 107 | # Funcții pentru copiere | |
| 108 | def copy(event): | |
| 109 | widget = event.widget | |
| 110 | widget.clipboard_clear() | |
| 111 | widget.clipboard_append(widget.selection_get()) | |
| 112 | ||
| 113 | def paste(event): | |
| 114 | widget = event.widget | |
| 115 | widget.insert(tk.INSERT, widget.clipboard_get()) | |
| 116 | ||
| 117 | # Interfața grafică | |
| 118 | root = tk.Tk() | |
| 119 | root.title("Analiza Sentimentelor în Psihiatrie")
| |
| 120 | ||
| 121 | text_entry = tk.Text(root, wrap=tk.WORD, width=50, height=10) | |
| 122 | text_entry.pack(padx=10, pady=10) | |
| 123 | ||
| 124 | # Permiterea copierii | |
| 125 | text_entry.bind("<Control-c>", copy)
| |
| 126 | ||
| 127 | analyze_button = tk.Button(root, text="Analizează", command=analyze) | |
| 128 | analyze_button.pack(padx=10, pady=10) | |
| 129 | ||
| 130 | root.mainloop() | |
| 131 |