Corona HelpBot
Dies ist ein Chatbot, der Antworten auf die meisten Ihrer Fragen / FAQ zu Corona gibt. Der Chatbot gibt Ihnen Antworten auf die Daten der WHO (https://www.who.int/). Dies hilft denjenigen, die Informationen benötigen oder mehr über diesen Virus erfahren möchten.
Es verwendet ein neuronales Netzwerk mit zwei verborgenen Schichten (genug für diese QnA), das vorhersagt, welches Muster mit der Frage des Benutzers übereinstimmt, und an diesen Knoten sendet. Aus den Fragen des Benutzers können weitere Muster hinzugefügt werden, um die Ergebnisse zu verbessern und weitere Informationen zu Coronavirus in die JSON-Datei aufzunehmen. Je mehr Sie diesen Chatbot trainieren, desto präziser wird er. Der Vorteil der Verwendung von Deep Learning besteht darin, dass Sie nicht dieselbe Frage stellen müssen, die in der JSON-Datei geschrieben wurde, da Stammwörter aus dem Muster mit der Benutzerfrage übereinstimmen
Voraussetzungen:
Python 3 NumPy nltk TensorFlow v.1.15 (keine GPU erforderlich) tflearn
Trainingsdaten:
Um die Daten an Chatbot weiterzuleiten, habe ich json mit möglichen Fragenmustern und unseren gewünschten Antworten verwendet.
Die für das Projekt verwendete JSON-Datei lautet WHO.
Für dieses Projekt habe ich meine JSON-Datei als WHO.json bezeichnet.
In der JSON-Datei befindet sich die Kategorie, in die alle diese Antworten fallen.
Muster werden verwendet, um alle möglichen Fragenmuster aufzulisten.
Antworten enthält alle Antworten in Bezug auf die gemusterten Fragen
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()