File size: 3,509 Bytes
3a079ef | 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 | import nltk
import numpy as np
import tensorflow as tf
from keras.models import Sequential, load_model
from keras.layers import Dense
import random
import json
import pickle
###Deu certo###
nltk.download('punkt')
stemmer = nltk.stem.lancaster.LancasterStemmer()
# Carregando a base de dados
with open("/home/mrdev/Ollama_testes/tutorial_IA/intents.json") as file:
data = json.load(file)
# Separando as informações
try:
with open("/home/mrdev/Ollama_testes/tutorial_IA/data.pickle", "rb") as f:
words, labels, training, output = pickle.load(f)
except:
words = []
labels = []
docs_y = []
docs_x = []
# Loop para armazenar as informações de forma separada
for intent in data["intents"]:
for pattern in intent["pattern"]:
wrds = nltk.word_tokenize(pattern)
words.extend(wrds)
docs_x.append(wrds)
docs_y.append(intent["tag"])
if intent["tag"] not in labels:
labels.append(intent["tag"])
# Organizando/pre-processamento
words = [stemmer.stem(w.lower()) for w in words if w != "?"]
words = sorted(list(set(words)))
labels = sorted(labels)
# Iniciando a tokenização e treinamento
training = []
output = []
out_empty = [0 for _ in range(len(labels))]
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[labels.index(docs_y[x])] = 1
training.append(bag)
output.append(output_row)
training = np.array(training)
output = np.array(output)
with open("/home/mrdev/Ollama_testes/tutorial_IA/data.pickle", "wb") as f:
pickle.dump((words, labels, training, output), f)
#print(data["intents"])
# Iniciando a criação do modelo
tf.keras.backend.clear_session() # Limpa a sessão do TensorFlow
model = Sequential()
model.add(Dense(8, input_shape=(len(training[0]),), activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(len(output[0]), activation='softmax'))
# Compilando o modelo
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# Tentando carregar o modelo treinado
try:
model = load_model("/home/mrdev/Ollama_testes/tutorial_IA/model_keras.h5")
except:
# Treinando o modelo
model.fit(training, output, epochs=1000, batch_size=8, verbose=1)
# Salvando o modelo treinado
model.save("/home/mrdev/Ollama_testes/tutorial_IA/model_keras.h5")
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 np.array(bag)
# Iniciando o chat em tempo real
def chat():
print("__start__")
while True:
inp = input("Você: ")
if inp.lower() == "sair":
print("Saindo")
break
else:
results = model.predict(np.array([bag_of_words(inp, words)]))
results_index = np.argmax(results)
tag = labels[results_index]
for tg in data["intents"]:
if tg["tag"] == tag:
responses = tg["responses"]
print(random.choice(responses))
chat()
|