-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlab10.py
97 lines (89 loc) · 5.07 KB
/
lab10.py
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
import string
import re
from os import listdir
from numpy import array
from nltk.corpus import stopwords
from keras.preprocessing.text import Tokenizer
from tensorflow.keras.utils import plot_model
#from keras.utils.vis_utils import plot_model
from keras.models import Sequential
from keras.layers import Dense
# Función para definir el modelo de red neuronal
def define_model(n_words):
model = Sequential()
# Capa de entrada con 50 neuronas y función de activación ReLU
model.add(Dense(50, input_shape=(n_words,), activation='relu'))
# Capa de salida con una neurona y función de activación sigmoid (para clasificación binaria)
model.add(Dense(1, activation='sigmoid'))
# Compilación del modelo con binary_crossentropy como función de pérdida, adam como optimizador y accuracy como métrica
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Mostrar un resumen del modelo
model.summary()
# Guardar un diagrama del modelo en un archivo de imagen
plot_model(model, to_file='model.png', show_shapes=True)
return model
# Función para crear un tokenizador y ajustarlo a los datos de entrenamiento
def create_tokenizer(lines):
tokenizer = Tokenizer()
tokenizer.fit_on_texts(lines)
return tokenizer
# Función para cargar y limpiar el conjunto de datos
def load_clean_dataset(vocab, is_train):
# Cargar los documentos negativos y positivos, procesarlos y combinarlos
neg = process_docs(r'C:\Users\mini_\OneDrive\Documentos\Code Test\TEST 1\lab9\NEGATIVO', vocab, is_train)
pos = process_docs(r'C:\Users\mini_\OneDrive\Documentos\Code Test\TEST 1\lab9\POSITIVO', vocab, is_train)
docs = neg + pos
# Crear etiquetas para los documentos (0 para negativos, 1 para positivos)
labels = array([0 for _ in range(len(neg))] + [1 for _ in range(len(pos))])
return docs, labels
# Función para procesar los documentos de texto en un directorio
def process_docs(directory, vocab, is_train):
lines = list()
for filename in listdir(directory):
# Omitir documentos de prueba si is_train es True, y viceversa
if is_train and filename.startswith('cv9'):
continue
if not is_train and not filename.startswith('cv9'):
continue
# Construir la ruta completa al archivo
path = directory + '/' + filename
# Convertir el documento en una línea de texto limpia
line = doc_to_line(path, vocab)
lines.append(line)
return lines
def doc_to_line(filename, vocab):
# Función que lee un documento, lo limpia y lo convierte en una línea de texto
doc = load_doc(filename) # Carga el documento
tokens = clean_doc(doc) # Limpia el documento
tokens = [w for w in tokens if w in vocab] # Filtra los tokens por el vocabulario
return ' '.join(tokens) # Retorna los tokens como una línea de texto
def load_doc(filename):
# Función que carga un documento de texto
file = open(filename, 'r', encoding='utf-8') # Abre el archivo con codificación utf-8
text = file.read() # Lee el contenido del archivo
file.close() # Cierra el archivo
return text # Retorna el texto del documento
def clean_doc(doc):
# Función que limpia un documento de texto
tokens = doc.split() # Divide el texto en tokens
re_punc = re.compile('[%s]' % re.escape(string.punctuation)) # Compila una expresión regular para eliminar puntuaciones
tokens = [re_punc.sub('', w) for w in tokens] # Elimina las puntuaciones de los tokens
tokens = [word for word in tokens if word.isalpha()] # Elimina tokens que no son palabras
stop_words = set(stopwords.words('english')) # Obtiene las palabras de parada en inglés
tokens = [w for w in tokens if not w in stop_words] # Elimina las palabras de parada
tokens = [word for word in tokens if len(word) > 1] # Elimina tokens de longitud 1
return tokens # Retorna los tokens limpios
# Código principal
vocab_filename = r'C:\Users\mini_\OneDrive\Documentos\Code Test\TEST 1\lab10\vocabulario.txt' # Ruta al archivo de vocabulario
vocab = load_doc(vocab_filename) # Carga el vocabulario
vocab = set(vocab.split()) # Convierte el vocabulario en un conjunto de palabras únicas
train_docs, ytrain = load_clean_dataset(vocab, True) # Carga los documentos de entrenamiento limpios
test_docs, ytest = load_clean_dataset(vocab, False) # Carga los documentos de prueba limpios
tokenizer = create_tokenizer(train_docs) # Crea un tokenizador basado en los documentos de entrenamiento
Xtrain = tokenizer.texts_to_matrix(train_docs, mode='freq') # Convierte los documentos de entrenamiento en matrices de frecuencia
Xtest = tokenizer.texts_to_matrix(test_docs, mode='freq') # Convierte los documentos de prueba en matrices de frecuencia
n_words = Xtest.shape[1] # Obtiene el número de palabras
model = define_model(n_words) # Define el modelo de la red neuronal
model.fit(Xtrain, ytrain, epochs=10, verbose=2) # Entrena el modelo
loss, acc = model.evaluate(Xtest, ytest, verbose=0) # Evalúa el modelo con los datos de prueba
print('Test Accuracy: %f' % (acc*100)) # Imprime la precisión del modelo en los datos de prueba