Rahil80/intent-chatbot-space
0
1import os
2import json
3import random
4import pickle
5import numpy as np
6import nltk
7from nltk.stem import WordNetLemmatizer
8from tensorflow.keras.models import Sequential
9from tensorflow.keras.layers import Dense, Dropout
10from tensorflow.keras.optimizers import SGD
11
12# Download NLTK data
13nltk.download('punkt')
14nltk.download('wordnet')
15
16# Initialize
17lemmatizer = WordNetLemmatizer()
18
19# Paths
20INTENTS_FILE = 'models/intents.json'
21MODEL_DIR = 'models'
22MODEL_PATH = os.path.join(MODEL_DIR, 'model.h5')
23TEXTS_PATH = os.path.join(MODEL_DIR, 'texts.pkl')
24LABELS_PATH = os.path.join(MODEL_DIR, 'labels.pkl')
25
26# Ensure /models directory exists
27if not os.path.exists(MODEL_DIR):
28 os.makedirs(MODEL_DIR)
29
30# Load intents
31with open(INTENTS_FILE, encoding='utf-8') as f:
32 intents = json.load(f)
33
34# Data containers
35words = []
36classes = []
37documents = []
38ignore_chars = ['?', '!', '.', ',']
39
40# Tokenize and collect data
41for intent in intents['intents']:
42 for pattern in intent['patterns']:
43 word_list = nltk.word_tokenize(pattern)
44 words.extend(word_list)
45 documents.append((word_list, intent['tag']))
46 if intent['tag'] not in classes:
47 classes.append(intent['tag'])
48
49# Lemmatize, lowercase, and sort
50words = [lemmatizer.lemmatize(w.lower()) for w in words if w not in ignore_chars]
51words = sorted(set(words))
52classes = sorted(set(classes))
53
54# Save texts (vocab) and labels
55pickle.dump(words, open(TEXTS_PATH, 'wb'))
56pickle.dump(classes, open(LABELS_PATH, 'wb'))
57
58# Create training data
59training = []
60output_empty = [0] * len(classes)
61
62for doc in documents:
63 bag = []
64 pattern_words = [lemmatizer.lemmatize(w.lower()) for w in doc[0]]
65
66 # Bag of Words
67 for w in words:
68 bag.append(1 if w in pattern_words else 0)
69
70 output_row = list(output_empty)
71 output_row[classes.index(doc[1])] = 1
72
73 training.append([bag, output_row])
74
75random.shuffle(training)
76training = np.array(training, dtype=object)
77
78train_x = np.array(list(training[:, 0]))
79train_y = np.array(list(training[:, 1]))
80
81# Build Keras model
82model = Sequential()
83model.add(Dense(128, input_shape=(len(train_x[0]),), activation='relu'))
84model.add(Dropout(0.5))
85model.add(Dense(64, activation='relu'))
86model.add(Dropout(0.5))
87model.add(Dense(len(train_y[0]), activation='softmax'))
88
89# Compile model
90sgd = SGD(learning_rate=0.01, decay=1e-6, momentum=0.9, nesterov=True)
91model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
92
93# Train
94hist = model.fit(train_x, train_y, epochs=200, batch_size=5, verbose=1)
95
96# Save model
97model.save(MODEL_PATH)
98print(f"Model trained and saved at: {MODEL_PATH}")
99print(f"Texts and labels saved in: {MODEL_DIR}")
100 