1
+ import nltk
2
+ import pandas as pd
3
+
4
+ from sklearn .feature_extraction .text import CountVectorizer
5
+ from sklearn .naive_bayes import MultinomialNB
6
+
7
+ class ChatBot :
8
+ def __init__ (self , context = "" , lastDialog = "" , lastQuestion = "" ):
9
+ self .context = context
10
+ self .dialog = lastDialog
11
+ def getResponse (self , question ):
12
+ return "aguarde..."
13
+
14
+ def RemoveStopWords (self , instancia ):
15
+ stopwords = set (nltk .corpus .stopwords .words ('portuguese' ))
16
+ palavras = [i for i in instancia .split () if not i in stopwords ]
17
+ return (" " .join (palavras ))
18
+
19
+ def Stemming (self , instancia ):
20
+ stemmer = nltk .stem .RSLPStemmer ()
21
+ palavras = []
22
+ for w in instancia .split ():
23
+ palavras .append (stemmer .stem (w ))
24
+ return (" " .join (palavras ))
25
+
26
+ def prepareTexts (self , texto ):
27
+ #texto = RemoveStopWords(texto)
28
+ #texto = Stemming(texto)
29
+ return texto
30
+
31
+ def showResults (self , valor ):
32
+ frase , resultado = valor
33
+ #resultadoT = "Frase positiva" if resultado[0] == '1' else "Frase negativa"
34
+ print (frase , ":" , " se refere ao intenção: " + resultado [0 ])
35
+ #print(frase, ":", resultado[0])
36
+
37
+ def analizer (self , classificador , vetorizador , frase ):
38
+ return frase , classificador .predict (vetorizador .transform ([frase ]))
39
+
40
+ def generate_test_texts (self ):
41
+ # ['..text', 'CATEGORY']
42
+
43
+ dados = [
44
+ ['My xyz teste text' , 'A_XYZ_TEST' ]
45
+ ]
46
+ return dados
47
+
48
+ def prepareAllData (self , dados ):
49
+ dados_tratados = []
50
+
51
+ for dado in dados :
52
+ dado [0 ] = self .prepareTexts (dado [0 ])
53
+ #print(dado[0])
54
+ dados_tratados .append (dado )
55
+
56
+ return dados_tratados
57
+
58
+ def splitData (self , dados ):
59
+ quantidade_total = len (dados )
60
+ percentual_para_treino = 0.75
61
+ treino = []
62
+ validacao = []
63
+
64
+ for indice in range (0 , quantidade_total ):
65
+ if indice < quantidade_total * percentual_para_treino :
66
+ treino .append (dados [indice ])
67
+ else :
68
+ validacao .append (dados [indice ])
69
+
70
+ return treino , validacao
71
+
72
+ def prepare_text (self ):
73
+ dados = self .generate_test_texts ()
74
+ dados_tratados = self .prepareAllData (dados )
75
+
76
+ return self .splitData (dados_tratados )
77
+
78
+
79
+ def training (self , registros_de_treino , vetorizador ):
80
+ treino_comentarios = [registro_treino [0 ] for registro_treino in registros_de_treino ]
81
+ treino_respostas = [registro_treino [1 ] for registro_treino in registros_de_treino ]
82
+
83
+ treino_comentarios = vetorizador .fit_transform (treino_comentarios )
84
+
85
+ return MultinomialNB ().fit (treino_comentarios , treino_respostas )
86
+
87
+ def simple_execute (self , registros_para_avaliacao ):
88
+ avaliacao_comentarios = [registro_avaliacao [0 ] for registro_avaliacao in registros_para_avaliacao ]
89
+ avaliacao_respostas = [registro_avaliacao [1 ] for registro_avaliacao in registros_para_avaliacao ]
90
+
91
+ total = len (avaliacao_comentarios )
92
+ acertos = 0
93
+ for indice in range (0 , total ):
94
+ resultado_analise = analizer (classificador , vetorizador , avaliacao_comentarios [indice ])
95
+ frase , resultado = resultado_analise
96
+ acertos += 1 if resultado [0 ] == avaliacao_respostas [indice ] else 0
97
+
98
+ return acertos * 100 / total
99
+
100
+ def execute (self , registros_para_avaliacao ):
101
+ avaliacao_comentarios = [registro_avaliacao [0 ] for registro_avaliacao in registros_para_avaliacao ]
102
+ avaliacao_respostas = [registro_avaliacao [1 ] for registro_avaliacao in registros_para_avaliacao ]
103
+
104
+ total = len (avaliacao_comentarios )
105
+ verdadeiros_positivos = 0
106
+ verdadeiros_negativos = 0
107
+ falsos_positivos = 0
108
+ falsos_negativos = 0
109
+
110
+ for indice in range (0 , total ):
111
+ resultado_analise = analizer (classificador , vetorizador , avaliacao_comentarios [indice ])
112
+ frase , resultado = resultado_analise
113
+ if resultado [0 ] == '0' :
114
+ verdadeiros_negativos += 1 if avaliacao_respostas [indice ] != '1' else 0
115
+ falsos_negativos += 1 if avaliacao_respostas [indice ] == '1' else 0
116
+ else :
117
+ verdadeiros_positivos += 1 if avaliacao_respostas [indice ] == '1' else 0
118
+ falsos_positivos += 1 if avaliacao_respostas [indice ] != '1' else 0
119
+
120
+ return ( verdadeiros_positivos * 100 / total ,
121
+ verdadeiros_negativos * 100 / total ,
122
+ falsos_positivos * 100 / total ,
123
+ falsos_negativos * 100 / total
124
+ )
125
+ def getItent (self , texto ):
126
+ registros_de_treino , registros_para_avaliacao = self .prepare_text ()
127
+ vetorizador = CountVectorizer (binary = 'false' )
128
+ classificador = self .training (registros_de_treino , vetorizador )
129
+ return str (classificador .predict (vetorizador .transform ([texto ]))).replace ("[" ,'' ).replace ("]" ,'' ).replace ("'" ,'' )
130
+
131
+
132
+ def getItentProba (self , texto , termo ):
133
+ registros_de_treino , registros_para_avaliacao = self .prepare_text ()
134
+ vetorizador = CountVectorizer (binary = 'false' )
135
+ classificador = self .training (registros_de_treino , vetorizador )
136
+ ps = pd .DataFrame (classificador .predict_proba (vetorizador .transform ([texto ])), columns = classificador .classes_ )
137
+ return ps .loc [0 ,termo ]
138
+
0 commit comments