Regresión Logística: Cómo predecir y clasificar tweets de bromas

Vesna Pivac
LCC-Unison
Published in
3 min readMay 20, 2022
Photo by visuals on Unsplash

La regresión logística es un algoritmo de Machine Learning, utilizado para la clasificación de dos clases. Este algoritmo es un método para problemas de clasificación binaria.

Utilizaremos el algoritmo de regresión logística para clasificar bromas de forma binaria para saber si una broma es chistosa. Todo el procedimiento se realizó en el lenguaje de programación Python.

Empecemos por la base de datos y su procesamiento. Tenemos un archivo llamado haha_2021_train.csv que contiene 24,000 datos. Después de eliminar las columnas que no nos servirán para nuestro modelo contiene:

  • text: tweets
  • is_humor: valor de sentimiento (1: Chistoso, 0: No chistoso).

Para poder utilizar la regresión se necesita primero tratar los datos. Para esto explicare algunos conceptos básicos del procesamiento del lenguaje natural (PLN):

  • Stopwords son palabras que carecen de un significado por sí solas. Suelen ser artículos, preposiciones, conjunciones, pronombres, etc.
  • La tokenización es una forma de separar un fragmento de texto en unidades más pequeñas llamadas tokens.
  • La Lematización es un proceso que elimina el afijo de una palabra para extraer la parte principal de la palabra.

Una vez comprendido estos conceptos empezaremos por crear las funciones LimpiarTexto, eliminar_stopwords, Tokenizacion y Stemming.

Después creamos nuevas columnas en el dataframe que contiene:

  • CleanText: El texto de los tweets después de quitar los signos de puntuación y las stopwords con la función LimpiarTexto.
def LimpiarTexto(tweet):
stopwords_english = stopwords.words('spanish')
tweet = re.sub(r'\$\w*', '', tweet)
tweet = re.sub(r'^RT[\s]+', '', tweet)
tweet = re.sub(r'https?:\/\/.*[\r\n]*', '', tweet)
tweet = re.sub(r'#', '', tweet)
tweet = re.sub(r'[^\w\s]','',tweet)
tweet = tweet.lower()
tweet = tweet.replace("ñ", "#")
tweet = unicodedata.normalize("NFKD", tweet)\
.encode("ascii","ignore").decode("ascii")\
.replace("#", "ñ") #Quita acentos
eliminar_stopwords(tweet, stopwords_english)
return tweetdef eliminar_stopwords(texto, stopwords):
return ' '.join([word for word in texto.split(' ') if word not in stopwords])
  • TokenizeText: El texto de CleanText después de tokenizar cada palabra con la función Tokenizacion.
def Tokenizacion(tweet):
tokenizer = TweetTokenizer(preserve_case=False, strip_handles=True, reduce_len=True)
tweet_tokens = tokenizer.tokenize(tweet)
return tweet_tokens
  • Text: El texto en TokenizeText después de aplicarle la lematización con la función Stemming.
def Stemming(tweet):
stemmer = SnowballStemmer("spanish")
tweets_clean = []
for word in tweet:
stem_word = stemmer.stem(word)
tweets_clean.append(stem_word)
return tweets_clean
  • Corpus: El texto en TokenizeText al convertirlo en dato de tipo string.
for i in range(len(df)):
df["Corpus"][i] = "".join(df['TokenizeText'][i])

Una vez ya procesado nuestra base de datos guardamos los valores de is_humor en la variable Y y las strings de Corpus en la variable X, después lo separamos con la función de train_test_split() el cual nos generará cuatro variables donde se guardaron los datos: train_x, test_x, train_y, test_y. De estas nuevas variables le aplicamos a train_y y test_y el LabelEncoder.

from sklearn.model_selection import train_test_split
x = df['Corpus']
y = df['is_humor']
train_x, test_x, train_y, test_y = train_test_split(x, y, test_size = 0.3)

Ahora convertimos nuestros datos en Corpus en una matriz TF-IDF con la función TfidfVectorizer de sklearn. Después convertimos nuestros datos en train_x, test_x en vectores Tf-IDF que nos crea Train_X_Tfidf y Test_X_Tfidf.

Predicción

Creamos el modelo con LogisticRegression y después lo entrenamos con nuestros datos en Train_X_Tfidf y train_y. Después evaluemos el modelo con nuestros datos de Test_X_Tfidf y test_y.

Esto nos generará la predicción del valor de humor de cada dato contenido en Test_X_Tfidf.

Clasificación

Creamos una variable en la que guardaremos un nuevo tweet o broma, este lo convertiremos en un vector de TF-IDF y lo usaremos en nuestro modelo de regresión logística.

X = 'Van dos ciegos y le dice uno al otro: -Ojala lloviera... -Ojala yo tambien...'prediccion_X = Tfidf_vect.transform([X])
modelLogisticRegression.predict(prediccion_X)

Conclusión

Al checar nuestro accuracy en nuestro modelo con ngramas de (1,2) con 100 features obtuvimos 72.4% en nuestro entrenamiento y lo mismo en la prueba lo que quiere decir que nuestro modelo de regresión logística no nos dice nada sobre su aprendizaje porque los datos son muy parecidos, podríamos mejorarlo al probarlo con con otros datos.

--

--