in

Una guía para principiantes sobre el análisis de sentimientos con Python

1sNd2NZUR4dMBQhN8l6Padw

Una guía para principiantes sobre el análisis de sentimientos con Python

Una guía de principio a fin sobre la creación de nubes de palabras, hermosas visualizaciones y modelos de aprendizaje automático utilizando datos de texto.

Natassha Selvaraj

12 de septiembre de 2020·7 min de lectura

Foto de Ryan McGuire en StockSnap

¿Qué es el análisis de sentimientos?

El análisis de sentimientos es una técnica que detecta el sentimiento subyacente en un fragmento de texto.

Es el proceso de clasificar el texto como positivo negativo, o neutral. Las técnicas de aprendizaje automático se utilizan para evaluar un fragmento de texto y determinar el sentimiento detrás de él.

¿Por qué es útil el análisis de sentimientos?

El análisis de sentimientos es esencial para que las empresas evalúen la respuesta de los clientes.

Imagínate esto: Su empresa acaba de lanzar un nuevo producto que se anuncia en varios canales diferentes.

Para medir la respuesta del cliente a este producto, se puede realizar un análisis de opinión.

Clientes usHablar de forma habitual sobre los productos en las redes sociales y en los foros de comentarios de los clientes. Estos datos se pueden recopilar y analizar para medir la respuesta general del cliente.

Llevando esto un paso más allá, también se pueden examinar las tendencias en los datos. Por ejemplo, los clientes de un determinado grupo de edad y demográfico pueden responder más favorablemente a un determinado producto que a otros.

Según la información recopilada, las empresas pueden posicionar el producto de manera diferente o cambiar su público objetivo.

El analisis

En este artículo, lo guiaré a través del proceso de un extremo a otro para realizar análisis de sentimiento en una gran cantidad de datos.

Estaremos usando el Reviews.csv archivo de Kaggle Conjunto de datos de Amazon Fine Food Reviews para realizar el análisis.

Utilizo un Jupyter Notebook para todos los análisis y visualización, pero cualquier IDE de Python hará el trabajo.

Paso 1: leer el marco de datos

import pandas as pd
df = pd.read_csv('Reviews.csv')
df.head()

Comprobando el encabezado del marco de datos:

Podemos ver que el marco de datos contiene información sobre productos, usuarios y reseñas.

Los datos que usaremos más para este análisis son «Resumen», «Texto», y «Puntaje.»

Texto – Esta variable contiene la información completa de la revisión del producto.

Resumen – Este es un resumen de la revisión completa.

Puntaje – La calificación del producto proporcionada por el cliente.

Paso 2: análisis de datos

Ahora, echaremos un vistazo a la variable «Puntaje”Para ver si la mayoría de las calificaciones de los clientes son positivas o negativas.

Para hacer esto, tendrá que instalar el Plotly biblioteca primero.

# Importsimport matplotlib.pyplot as plt
import seaborn as sns
color = sns.color_palette()
%matplotlib inline
import plotly.offline as py
py.init_notebook_mode(connected=True)
import plotly.graph_objs as go
import plotly.tools as tls
import plotly.express as px
# Product Scoresfig = px.histogram(df, x="Score")
fig.update_traces(marker_color="turquoise",marker_line_color='rgb(8,48,107)',
marker_line_width=1.5)
fig.update_layout(title_text='Product Score')
fig.show()

La trama resultante se ve así:

Desde aquí, podemos ver que la mayor parte de la calificación de los clientes es positiva. Esto me lleva a creer que la mayoría de las reseñas también serán bastante positivas, lo que se analizará en un tiempo.

Ahora, podemos crear algunos nubes de palabras para ver las palabras más utilizadas en las reseñas.

import nltk
from nltk.corpus import stopwords
# Create stopword list:
stopwords = set(STOPWORDS)
stopwords.update(["br", "href"])
textt = " ".join(review for review in df.Text)
wordcloud = WordCloud(stopwords=stopwords).generate(textt)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.savefig('wordcloud11.png')
plt.show()

Ejecutar el código anterior genera una nube de palabras que se ve así:

1*C5

Algunas palabras populares que se pueden observar aquí incluyen «gusto, «»producto, «»amor,» y «Amazonas. » Estas palabras son en su mayoría positivas, lo que también indica que la mayoría de las revisiones en el conjunto de datos expresan un sentimiento positivo.

Paso 3: clasificación de tweets

En este paso, clasificaremos las reseñas en «positivas» y «negativas», de modo que podamos usar esto como datos de entrenamiento para nuestro modelo de clasificación de opiniones.

Las críticas positivas se clasificarán como +1 y las críticas negativas se clasificarán como -1.

Clasificaremos todas las reseñas con ‘Puntuación’> 3 como +1, lo que indica que son positivas.

Todas las reseñas con ‘Puntuación’ <3 se clasificarán como -1. Las reseñas con 'Puntuación' = 3 se descartarán porque son neutrales. Nuestro modelo solo clasificará reseñas positivas y negativas.

# assign reviews with score > 3 as positive sentiment
# score < 3 negative sentiment
# remove score = 3
df = df[df['Score'] != 3]
df['sentiment'] = df['Score'].apply(lambda rating : +1 if rating > 3 else -1)

Mirando el encabezado del marco de datos ahora, podemos ver una nueva columna llamada ‘sentimiento:’

0*ii2yvmIT9 QBfS66

Paso 4: más análisis de datos

Ahora que hemos clasificado los tweets en positivos y negativos, ¡construyamos nubes de palabras para cada uno!

Primero, crearemos dos marcos de datos: uno con todas las críticas positivas y otro con todas las críticas negativas.

# split df - positive and negative sentiment:positive = df[df['sentiment'] == 1]
negative = df[df['sentiment'] == -1]

Wordcloud – Sentimiento positivo

stopwords = set(STOPWORDS)
stopwords.update(["br", "href","good","great"])
## good and great removed because they were included in negative sentimentpos = " ".join(review for review in positive.Summary)
wordcloud2 = WordCloud(stopwords=stopwords).generate(pos)
plt.imshow(wordcloud2, interpolation='bilinear')
plt.axis("off")
plt.show()
1*Pcvglyzl0HQaEdLpBhUNCg

Wordcloud – Sentimiento negativo

neg = " ".join(review for review in negative.Summary)
wordcloud3 = WordCloud(stopwords=stopwords).generate(neg)
plt.imshow(wordcloud3, interpolation='bilinear')
plt.axis("off")
plt.savefig('wordcloud33.png')
plt.show()

Como se vio anteriormente, la nube de palabras de sentimiento positivo estaba llena de palabras positivas, como «amor, «»mejor,» y «delicioso.«

La nube de palabras de sentimiento negativo se llenó en su mayoría de palabras negativas, como «decepcionado,» y «puaj.«

Las palabras «bien» y «estupendo”Apareció inicialmente en la nube de palabras de sentimiento negativo, a pesar de ser palabras positivas. Esto probablemente se deba a que se utilizaron en un contexto negativo, como «no es bueno. » Debido a esto, eliminé esas dos palabras de la nube de palabras.

Por último, podemos echar un vistazo a la distribución de reseñas con sentimiento en todo el conjunto de datos:

df['sentimentt'] = df['sentiment'].replace({-1 : 'negative'})
df['sentimentt'] = df['sentimentt'].replace({1 : 'positive'})
fig = px.histogram(df, x="sentimentt")
fig.update_traces(marker_color="indianred",marker_line_color='rgb(8,48,107)',
marker_line_width=1.5)
fig.update_layout(title_text='Product Sentiment')
fig.show()

Paso 5: construcción del modelo

¡Finalmente, podemos construir el modelo de análisis de sentimientos!

Este modelo tomará revisiones como entrada. Luego, hará una predicción sobre si la revisión es positiva o negativa.

Esta es una tarea de clasificación, por lo que entrenaremos un modelo de regresión logística simple para realizarla.

Como referencia, eche un vistazo al marco de datos nuevamente:

Hay algunos pasos que debemos seguir:

  • Limpieza de datos

Usaremos los datos resumidos para generar predicciones. Primero, debemos eliminar toda la puntuación de los datos.

def remove_punctuation(text):
final = "".join(u for u in text if u not in ("?", ".", ";", ":", "!",'"'))
return final
df['Text'] = df['Text'].apply(remove_punctuation)
df = df.dropna(subset=['Summary'])
df['Summary'] = df['Summary'].apply(remove_punctuation)
  • Dividir el marco de datos

El nuevo marco de datos solo debe tener dos columnas: «Resumen«(Los datos del texto de la reseña) y»sentimiento”(La variable de destino).

dfNew = df[['Summary','sentiment']]
dfNew.head()

Echando un vistazo al encabezado del nuevo marco de datos, estos son los datos que ahora contendrá:

0*hoGpWyYHJQ48RDbQ

Ahora dividiremos el marco de datos en conjuntos de prueba y de tren. El 80% de los datos se utilizará para formación y el 20% para pruebas.

# random split train and test dataindex = df.index
df['random_number'] = np.random.randn(len(index))
train = df[df['random_number'] <= 0.8]
test = df[df['random_number'] > 0.8]
  • Crea una bolsa de palabras

A continuación, usaremos un vectorizador de conteo de la biblioteca Scikit-learn.

Esto transformará el texto en nuestro marco de datos en un modelo de bolsa de palabras, que contendrá una matriz dispersa de números enteros. Se contará e imprimirá el número de ocurrencias de cada palabra.

Necesitaremos convertir el texto en un modelo de bolsa de palabras ya que el algoritmo de regresión logística no puede entender el texto.

# count vectorizer:from sklearn.feature_extraction.text import CountVectorizervectorizer = CountVectorizer(token_pattern=r'bw+b')train_matrix = vectorizer.fit_transform(train['Summary'])
test_matrix = vectorizer.transform(test['Summary'])
  • Importar regresión logística
# Logistic Regressionfrom sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
  • Dividir variables objetivo e independientes
X_train = train_matrix
X_test = test_matrix
y_train = train['sentiment']
y_test = test['sentiment']
  • Ajustar modelo a datos
lr.fit(X_train,y_train)
  • Hacer predicciones
predictions = lr.predict(X_test)

Hemos construido con éxito un modelo de regresión logística simple y hemos entrenado los datos en él. También hicimos predicciones usando el modelo.

Paso 6: prueba

¡Ahora podemos probar la precisión de nuestro modelo!

# find accuracy, precision, recall:from sklearn.metrics import confusion_matrix,classification_report
new = np.asarray(y_test)
confusion_matrix(predictions,y_test)

Obtendrá una matriz de confusión que se ve así:

print(classification_report(predictions,y_test))

El informe de clasificación:

La precisión general del modelo en los datos de prueba es de alrededor del 93%, lo cual es bastante bueno considerando que no hicimos ninguna extracción de características ni mucho preprocesamiento.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

07uYvkLmf9WDTlyB7FZOfjg 1.1632067918.fit lim.size 1200x630

NTSB impulsa los frenos en el despliegue de conducción autónoma total planificado de Tesla

¿Qué es el software PLM? | Gestión del ciclo de vida del producto