Skip to content

Commit c909164

Browse files
author
rmsantos
committed
A text intention discovery - NLP
1 parent 3815b5a commit c909164

File tree

1 file changed

+138
-0
lines changed

1 file changed

+138
-0
lines changed

IntentionTextDiscover/ChatBot.py

+138
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
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

Comments
 (0)