Primero probé con métodos vistos en clase pero para usar otros algoritmos me resulto mas difÃcil, por lo cual me apoyé de la solución del maestro y vectorizando el texto fue mas fácil probar otros algoritmos.
Con los atributos de frecuencia de palabras mayor a 50, los 250 biograms mas comunes y quitando las stopwords el RandomForestClassifier da un 95% de accuracy
# Abrimos el los archivos y los guardamos
f = open('/content/drive/My Drive/Colab Notebooks/NLP_resources/Algoritmos NLP/all_balanced.review', 'r')
text = f.read()
import nltk
from nltk.corpus import stopwords
bag_of_words = [] #Creamos el directorio de palabras
for line in text.split('\n'):
seq = line.split('#label#:')
if len(seq)==2:
for key_value in seq[0].split(' '):
bag_of_words.append(key_value.split(':')[0])
stopwords = stopwords.words('english')
bag_of_words = [w for w in bag_of_words if w.lower() not in stopwords] # Quitamos las stopwords
fdist = nltk.FreqDist(bag_of_words) # Sacamos las frecuencias
reduced_bow = [w for w in set(bag_of_words) if fdist[w]>50] # Separamos frecuencias que tengan mas de 50 repeticiones
bigram_text = nltk.Text(bag_of_words) # Sacamos los biogramas
bigrams = list(nltk.bigrams(bigram_text))
top_bigrams = (nltk.FreqDist(bigrams)).most_common(250) # Separamos bigramas mas comunes
# Vectorizamos el texto
import numpy as np
vectors = []
labels = []
for line in text.split('\n'):
seq = line.split('#label#:')
if len(seq)==2:
line_dict = {keyval.split(':')[0]: int(keyval.split(':')[1]) for keyval in seq[0].split(' ') if len(keyval.split(':'))==2}
line_vector = []
for word in reduced_bow:
if word in line_dict.keys():
line_vector.append(line_dict[word])
else:
line_vector.append(0)
vectors.append(line_vector) # Indicamos si el texto tiene palabras de las mas frecuentes
labels.append(float(seq[1]))
bigram_text = nltk.Text(line_dict.keys())
bigrams = list(nltk.bigrams(bigram_text))
for word in top_bigrams:
if word in bigrams:
line_vector.append(1)
else:
line_vector.append(0)
vectors.append(line_vector) # Indicamos si el texto tiene biogramas mas comunes
labels.append(float(seq[1]))
vectors = np.array(vectors)
from sklearn.model_selection import train_test_split
train_vectors, test_vectors, train_labels, test_labels = train_test_split(vectors, labels, test_size=0.1, random_state=42)
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier().fit(train_vectors, train_labels)
print('Score for RandomForestClassifier = {}'.format(clf.score(test_vectors, test_labels)))
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?