Corona HelpBot
Este é um chatbot que dará respostas para a maioria de suas perguntas / FAQ relacionadas ao corona. O chatbot lhe dará respostas a partir dos dados fornecidos pela OMS (https://www.who.int/). Isso ajudará quem precisa de informações ou ajuda a saber mais sobre este vírus.
Ele usa uma rede neural com duas camadas ocultas (o suficiente para esses QnA) que prevê qual padrão combina com a pergunta do usuário e envia em direção a esse nó. Mais padrões podem ser adicionados a partir das perguntas do usuário para treiná-lo para resultados mais aprimorados e adicionar mais informações sobre o coronavírus no arquivo JSON. Quanto mais você treina este chatbot, mais ele se torna preciso. A vantagem de usar o deep learning é que você não precisa fazer a mesma pergunta que foi escrita no arquivo JSON, porque palavras derivadas do padrão são correspondidas com a pergunta do usuário
Pré-requisitos:
Python 3 NumPy nltk TensorFlow v.1.15 (sem necessidade de GPU) tflearn
Dados de treinamento:
para alimentar os dados para o chatbot, usei json com possíveis padrões de perguntas e as respostas desejadas.
O arquivo JSON usado para o projeto é WHO
Para este projeto, denominei meu arquivo JSON como WHO.json.
Na tag do arquivo JSON está a categoria em que todas essas respostas se enquadram.
padrões são usados para listar todos os padrões de pergunta possíveis.
respostas contém todas as respostas com respeito às perguntas padronizadas
import
nltk
import
numpy
import
tflearn
import
tensorflow
import
pickle
import
random
import
json
nltk.download(
'punkt'
)
from
nltk.stem.lancaster
import
LancasterStemmer
stemmer
=
LancasterStemmer()
with
open
(
"WHO.json"
) as
file
:
data
=
json.load(
file
)
try
:
with
open
(
"data.pickle"
,
"rb"
) as f:
words, l, training, output
=
pickle.load(f)
except
:
words
=
[]
l
=
[]
docs_x
=
[]
docs_y
=
[]
for
i
in
data[
"intents"
]:
for
p
in
i[
"patterns"
]:
wrds
=
nltk.word_tokenize(p)
words.extend(wrds)
docs_x.append(wrds)
docs_y.append(i[
"tag"
])
if
i[
"tag"
]
not
in
l:
l.append(i[
"tag"
])
words
=
[stemmer.stem(w.lower())
for
w
in
words
if
w !
=
"?"
]
words
=
sorted
(
list
(
set
(words)))
l
=
sorted
(l)
training
=
[]
output
=
[]
out_empty
=
[
0
for
_
in
range
(
len
(l))]
for
x, doc
in
enumerate
(docs_x):
bag
=
[]
wrds
=
[stemmer.stem(w)
for
w
in
doc]
for
w
in
words:
if
w
in
wrds:
bag.append(
1
)
else
:
bag.append(
0
)
output_row
=
out_empty[:]
output_row[l.index(docs_y[x])]
=
1
training.append(bag)
output.append(output_row)
training
=
numpy.array(training)
output
=
numpy.array(output)
with
open
(
"data.pickle"
,
"wb"
) as f:
pickle.dump((words, l, training, output), f)
tensorflow.reset_default_graph()
net
=
tflearn.input_data(shape
=
[
None
,
len
(training[
0
])])
net
=
tflearn.fully_connected(net,
8
)
net
=
tflearn.fully_connected(net,
8
)
net
=
tflearn.fully_connected(net,
len
(output[
0
]), activation
=
"softmax"
)
net
=
tflearn.regression(net)
model
=
tflearn.DNN(net)
model.fit(training, output, n_epoch
=
1000
, batch_size
=
8
, show_metric
=
True
)
model.save(
"model.tflearn"
)
def
bag_of_words(s, words):
bag
=
[
0
for
_
in
range
(
len
(words))]
s_words
=
nltk.word_tokenize(s)
s_words
=
[stemmer.stem(word.lower())
for
word
in
s_words]
for
se
in
s_words:
for
i, w
in
enumerate
(words):
if
w
=
=
se:
bag[i]
=
1
return
numpy.array(bag)
def
chat():
(
)
while
True
:
inp
=
input
(
"You: "
)
if
inp.lower()
=
=
"quit"
:
break
results
=
model.predict([bag_of_words(inp, words)])[
0
]
results_index
=
numpy.argmax(results)
tag
=
l[results_index]
if
results[results_index] >
0.7
:
for
tg
in
data[
"intents"
]:
if
tg[
'tag'
]
=
=
tag:
responses
=
tg[
'responses'
]
(random.choice(responses))
else
:
(
"I am sorry but I can't understand"
)
chat()
As postagens do blog Acervo Lima te ajudaram? Nos ajude a manter o blog no ar!
Faça uma doação para manter o blog funcionando.
70% das doações são no valor de R$ 5,00...
Diógenes Lima da Silva