-
Notifications
You must be signed in to change notification settings - Fork 0
/
bigrama_trigrama_tkinter.pyw
136 lines (96 loc) · 3.96 KB
/
bigrama_trigrama_tkinter.pyw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import collections
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
print("Este programa precisa do Python 3.x, podendo nao funcionar em outras versoes.")
#Para recursos não encontrados:
import nltk
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('rslp')
# Importação das Bibliotecas
from nltk.tokenize import sent_tokenize
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
with open('memorial_de_ayres.txt', 'r', encoding="utf-8") as myfile:
data_pt=myfile.read().replace('\n', ' ')
txtfiltrado_pt = [w for w in word_tokenize(data_pt.replace(',',' ').replace('.',' '))]
def sobre():
messagebox.showinfo("Sobre o Preditor de Palavras:", "Este programa foi feito como nota para segunda avaliação de Inteligência Artificial, utilizando de bigramas e trigramas para adivinhar a mais provavel palavra dada uma sequencia de 2 ou 3 palavras.")
def adivinhar(*args):
if(len(texto.get().split(" "))==2):
n=bigramas(txtfiltrado_pt, texto.get().split(" "))
if(len(n)==0):
messagebox.showwarning("Erro", "Não há nenhuma sugestão dentro da base de dados.")
else:
print()
messagebox.showwarning("Sucesso!!", "Sugestões para '"+texto.get()+"' são:\n\n"+', '.join(n))
elif(len(texto.get().split(" "))==3):
n=trigramas(txtfiltrado_pt, texto.get().split(" "))
if(len(n)==0):
messagebox.showwarning("Erro", "Não há nenhuma sugestão dentro da base de dados.")
else:
print()
messagebox.showwarning("Sucesso!!", "Sugestões para '"+texto.get()+"' são:\n\n"+', '.join(n))
else:
messagebox.showerror("Erro:", "Apenas textos com 2 ou 3 palavras são aceitos.")
def bigramas(fonte, palavras):
bigrams = []
suggestions = []
for i in range(0, len(fonte)):
if (i == len(fonte)-1):
break
else:
if(fonte[i].lower()==palavras[1].lower() and fonte[i-1].lower()==palavras[0].lower()):
bigrams.append(fonte[i+1])
counter = collections.Counter(bigrams)
for i in range(0,len(counter.most_common())):
if(i>=3):
break
else:
suggestions.append(counter.most_common()[i][0])
return suggestions
def trigramas(fonte, palavras):
trigrams = []
suggestions = []
for i in range(0, len(fonte)):
if (i == len(fonte)-2):
break
else:
if(fonte[i].lower()==palavras[2].lower()
and fonte[i-1].lower()==palavras[1].lower()
and fonte[i-2].lower()==palavras[0].lower()):
trigrams.append(fonte[i+1])
counter = collections.Counter(trigrams)
for i in range(0,len(counter.most_common())):
if(i>=3):
break
else:
suggestions.append(counter.most_common()[i][0])
return suggestions
root = Tk()
root.title("Preditor de Palavras v0.3 - By Adriano Martins")
#root.wm_iconbitmap('Icon.ico')
menu = Menu(root)
root.config(menu=menu)
arquivo = Menu(menu)
menu.add_cascade(label="Arquivo", menu=arquivo)
arquivo.add_separator()
arquivo.add_command(label="Sair", command=quit)
ajuda = Menu(menu)
menu.add_cascade(label="Ajuda", menu=ajuda)
#ajuda.add_separator()
ajuda.add_command(label="Sobre o programa...", command=sobre)
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)
texto = StringVar()
ntexto = ttk.Entry(mainframe, width=15, textvariable=texto)
ntexto.grid(column=2, row=1, sticky=(W, E))
ttk.Label(mainframe, text="Digite um texto:\n(2 e 3 palavras)").grid(column=1, row=1, sticky=W)
ttk.Button(mainframe, text="Analisar", command=adivinhar).grid(column=3, row=1, sticky=W)
for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)
ntexto.focus()
root.bind('<Return>', adivinhar)
root.mainloop()