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()