-
Notifications
You must be signed in to change notification settings - Fork 127
Expand file tree
/
Copy pathChatBot.py
More file actions
138 lines (107 loc) · 4.6 KB
/
Copy pathChatBot.py
File metadata and controls
138 lines (107 loc) · 4.6 KB
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
137
138
import nltk
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
class ChatBot:
def __init__(self, context="", lastDialog="", lastQuestion=""):
self.context = context
self.dialog = lastDialog
def getResponse(self, question):
return "aguarde..."
def RemoveStopWords(self, instancia):
stopwords = set(nltk.corpus.stopwords.words('portuguese'))
palavras = [i for i in instancia.split() if not i in stopwords]
return (" ".join(palavras))
def Stemming(self, instancia):
stemmer = nltk.stem.RSLPStemmer()
palavras = []
for w in instancia.split():
palavras.append(stemmer.stem(w))
return (" ".join(palavras))
def prepareTexts(self, texto):
#texto = RemoveStopWords(texto)
#texto = Stemming(texto)
return texto
def showResults(self, valor):
frase, resultado = valor
#resultadoT = "Frase positiva" if resultado[0] == '1' else "Frase negativa"
print(frase, ":", " se refere ao intenção: "+ resultado[0])
#print(frase, ":", resultado[0])
def analizer(self, classificador, vetorizador, frase):
return frase, classificador.predict(vetorizador.transform([frase]))
def generate_test_texts(self):
# ['..text', 'CATEGORY']
dados = [
['My xyz teste text', 'A_XYZ_TEST']
]
return dados
def prepareAllData(self, dados):
dados_tratados = []
for dado in dados:
dado[0] = self.prepareTexts(dado[0])
#print(dado[0])
dados_tratados.append(dado)
return dados_tratados
def splitData(self, dados):
quantidade_total = len(dados)
percentual_para_treino = 0.75
treino = []
validacao = []
for indice in range(0, quantidade_total):
if indice < quantidade_total * percentual_para_treino:
treino.append(dados[indice])
else:
validacao.append(dados[indice])
return treino, validacao
def prepare_text(self):
dados = self.generate_test_texts()
dados_tratados = self.prepareAllData(dados)
return self.splitData(dados_tratados)
def training(self, registros_de_treino, vetorizador):
treino_comentarios = [registro_treino[0] for registro_treino in registros_de_treino]
treino_respostas = [registro_treino[1] for registro_treino in registros_de_treino]
treino_comentarios = vetorizador.fit_transform(treino_comentarios)
return MultinomialNB().fit(treino_comentarios, treino_respostas)
def simple_execute(self, registros_para_avaliacao):
avaliacao_comentarios = [registro_avaliacao[0] for registro_avaliacao in registros_para_avaliacao]
avaliacao_respostas = [registro_avaliacao[1] for registro_avaliacao in registros_para_avaliacao]
total = len(avaliacao_comentarios)
acertos = 0
for indice in range(0, total):
resultado_analise = analizer(classificador, vetorizador, avaliacao_comentarios[indice])
frase, resultado = resultado_analise
acertos += 1 if resultado[0] == avaliacao_respostas[indice] else 0
return acertos * 100 / total
def execute(self, registros_para_avaliacao):
avaliacao_comentarios = [registro_avaliacao[0] for registro_avaliacao in registros_para_avaliacao]
avaliacao_respostas = [registro_avaliacao[1] for registro_avaliacao in registros_para_avaliacao]
total = len(avaliacao_comentarios)
verdadeiros_positivos = 0
verdadeiros_negativos = 0
falsos_positivos = 0
falsos_negativos = 0
for indice in range(0, total):
resultado_analise = analizer(classificador, vetorizador, avaliacao_comentarios[indice])
frase, resultado = resultado_analise
if resultado[0] == '0':
verdadeiros_negativos += 1 if avaliacao_respostas[indice] != '1' else 0
falsos_negativos += 1 if avaliacao_respostas[indice] == '1' else 0
else:
verdadeiros_positivos += 1 if avaliacao_respostas[indice] == '1' else 0
falsos_positivos += 1 if avaliacao_respostas[indice] != '1' else 0
return ( verdadeiros_positivos * 100 / total,
verdadeiros_negativos * 100 / total,
falsos_positivos * 100 / total,
falsos_negativos * 100 / total
)
def getItent(self, texto):
registros_de_treino, registros_para_avaliacao = self.prepare_text()
vetorizador = CountVectorizer(binary = 'false')
classificador = self.training(registros_de_treino, vetorizador)
return str(classificador.predict(vetorizador.transform([texto]))).replace("[",'').replace("]",'').replace("'",'')
def getItentProba(self, texto, termo):
registros_de_treino, registros_para_avaliacao = self.prepare_text()
vetorizador = CountVectorizer(binary = 'false')
classificador = self.training(registros_de_treino, vetorizador)
ps = pd.DataFrame(classificador.predict_proba(vetorizador.transform([texto])), columns=classificador.classes_)
return ps.loc[0,termo]