demo / as_bert_df.py
xerubin
commit inicial
1f9bcbb
# -*- coding: utf-8 -*-
"""
Created on Sun Dec 3 09:26:33 2023
@author: ideaUser
Modelo (huggingface)
https://huggingface.co/nlptown/bert-base-multilingual-uncased-sentiment
"""
#%%
import torch
from transformers import BertTokenizer, BertForSequenceClassification
from transformers import pipeline
import pandas as pd
#%%
# Download pretrained BERT from Hugging Face for sentiment analisis
model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name)
# function predict sentiment using BERT pretrained
def get_review_sentiment(text):
classifier = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer)
results = classifier(text)
return int(results[0]["label"][0])
#%%
# function for batch predict stars
def batch_predict_sentiment_stars(data):
sentiment = []
for index, row in data.iterrows():
sentiment.append(get_review_sentiment(row["review"]))
data_result = pd.DataFrame(
{
"review": list(data["review"]),
"predict": sentiment
})
return data_result
#%%
# function for batch predict sentiment label [NEGATIVE, NEUTRAL, POSITIVE]
def batch_predict_sentiment_3_label(data):
sentiment = []
for index, row in data.iterrows():
stars = get_review_sentiment(row["review"])
label = ""
if stars < 3:
label = "negative"
elif stars == 3:
label = "neutral"
elif stars > 3 & stars <= 5:
label = "positive"
sentiment.append(label)
data_result = pd.DataFrame(
{
"review": list(data["review"]),
"label": list(data["label"]),
"predict": sentiment
})
return data_result
#%%
# function for batch predict sentiment label [NEGATIVE, POSITIVE]
def batch_predict_sentiment_2_label(data):
total_rows = data.shape[0]
sentiment = []
i = 1
for index, row in data.iterrows():
stars = get_review_sentiment(row["review"])
label = ""
if stars < 3:
label = "negative"
elif stars >= 3 & stars <= 5:
label = "positive"
sentiment.append(label)
if i % 100 == 0:
print(i, " / " , total_rows )
i += 1
# return a dataframe
data_result = pd.DataFrame(
{
"review": list(data["review"]),
"label": list(data["label"]),
"predict": sentiment
})
return data_result
#%%
if __name__ == "__main__":
hotel_reviews = ["El fin de semana mi pareja y yo hicimos una reserva en este hotel, con el fin de descansar y desconectar, fue sólo una noche y menos mal. Nos llevaron a un ala bastante apartada del hotel porque nos dijeron que era mejor para descansar ya que la parte de fuera era muy “jaleosa”. Nos pareció bien porque era justo lo que buscábamos, y cuál fue nuestra sorpresa? Desde las 6 de la mañana con ruidos, primero lo que suponemos que eran unos tacones en la habitación de arriba (de eso no tiene culpa el hotel, obviamente) y después sobre las 7 o poco más, las limpiadoras moviendo muebles y arrastrando sofás o lo que fuera. Habíamos cogido sólo alojamiento para descansar, pensando en no tener que madrugar como habitualmente, pero fue IMPOSIBLE por los ruidos constantes. Por destacar algo…",
"El hotel en general está bien, las habtiaciones son espaciosas y el personal es muy amable (sobretodo el encargado del roof-top y la piscina) y la zona de la piscina es curiosa. Pero tiene dos grandes fallos: El primero es que el wifi no llegaba bien a la habitación ya que se cortaba continuamente. El segundo fallo es que no se les ocurre otra cosa que poner un edredón nórdico en vez de una sábana fina en pleno agosto en Sevilla.",
"El hotel es moderno, amplio y limpio, pero no hemos podido disfrutar de la experiencia porque con tanto ruido no hemos podido descansar. Además la piscina estaba llena de gente y no la hemos podido usar. Los empleados muy amables y la ubicación perfecta."
]
data_df = pd.DataFrame(
{
"review": hotel_reviews,
"label":['positive','negative','positive']
}
)
# save dataframe
data_df.to_csv('data/sa_data.csv', index=False)
#%%
# pruebas
# read csv
data_df = pd.read_csv('data/sa_data.csv')
#result = batch_predict_sentiment_stars(data_df)
#result = batch_predict_sentiment_3_label(data_df)
result = batch_predict_sentiment_2_label(data_df)
print("Columns:\n", result.dtypes)
print("\n(rows, cols): ", result.shape)
print("\nData:\n",result)
#%%