View difference between Paste ID: jZXt2qeP and kiEfMCt5
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