Análisis de sentimiento de Twitter de Indonesia utilizando un transformador de red neuronal preentrenado (BERT) | de Muhammad Rizqi Nur | agosto de 2022

Baca dalam Bahasa Indonesia

Estaba haciendo un análisis de sentimientos para un artículo de periodismo de datos para el proyecto final de un bootcamp. Los tweets son tweets de Indonesia sobre el reciente bloqueo de Steam por parte de Kominfo (y algunas otras plataformas en el extranjero). Puedes leer mi artículo aquí (aunque solo está en indonesio). De paso, Estoy usando Python en Google Colab.

En primer lugar, yo estaba usando TextBlob como se explica aquípero el resultado fue malo. Estaba seguro de que al menos para los tweets de #BlokirKominfo, debe ser mayoritariamente negativo. Sin embargo, fue mayormente neutral o positivodependiendo de dónde dibuje las líneas (porque TextBlob genera polaridad en el rango de -1.0 a +1.0). Bueno, TextBlob solo admite ingles, por lo que los tuits fueron traducidos al inglés. Además, TextBlob está basado en reglas, mientras que la PNL de última generación utiliza redes neuronales. Pero no es que pueda entrenar mi propio modelo de red neuronal en unos pocos días. Soy un novato total en PNL. Afortunadamente, cara de abrazo Tiene mucho de preentrenado modelo disponible gratisy existe uno indonesio.

Entonces empecemos.

Twitter ahora ofrece una fácil y libre registro de cuenta de desarrollador. Por supuesto, tendrá muchos limites. por ejemplo, el Las llamadas API que puede hacer en 15 minutos son limitadas. También solo se pueden consultar los últimos 7 días. Si necesita más, puede actualizar su cuenta esencial (básica) pagando o solicitando para una cuenta elevada o académica. si solo necesita más llamadas a la API, vaya a la elevada uno, ya que todavía es bastante fácil. También le da acceso a la API V1. De manera predeterminada, tiene acceso a la API V2 y aún está incompleta, por ejemplo, no puede obtener datos de tendencias. Si usted necesita ir más allá de 7 días, ir por el académico uno, pero es muy difícilya que necesita tener una investigación legítima como investigador o estudiante de posgrado.

Página de inicio de la plataforma para desarrolladores de Twitter

Bien, entonces, ¿cómo obtener una cuenta de desarrollador? Ir https://developer.twitter.com/ haga clic inscribirse en la esquina superior derecha, luego inicie sesión con su cuenta de Twitter. A continuación, obtendrá un formulario. Rellena el formulario, envíalo y listo. Asegúrate que guardar todas las fichas y secretos. Pero aquí solo usaremos el ficha al portador.

Primero, necesitas instalar llorona. Puedes hacer esto usando pip.

pip install tweepy

Si está utilizando google colab o jupyter, ponga un «!» en la parte delantera.

!pip install tweepy

A continuación, impórtelo. “tw” aquí es solo un alias para acortarlo.

import tweepy as tw

Ahora creamos un objeto de cliente usando el ficha al portador. El argumento wait_on_rate_limit siendo Verdadero le dice a Tweepy que Espere para el tiempo de reutilización si superó los límites de tasa de API.

client = tw.Client(
bearer_token=bearer_token,
wait_on_rate_limit=True
)

Entonces finalmente podemos consultar tweets. estaremos usando buscar_recent_tweets. Si tiene una cuenta académica o una cuenta paga que admita los últimos 7 días, puede usar buscar_todos_los_tweets en cambio.

result = client.search_recent_tweets(
query,
start_time=start_time,
end_time=end_time,
max_results=max_results,
next_token=next_token,
tweet_fields=tweet_fields
)

2.1. Explicación de argumentos

consulta sería su consulta de búsqueda; es un parámetro requerido. Puede agregar «-is:retweet» al final de su consulta para excluir retuits.

start_time y end_time definen la ventana de tiempo de su búsqueda. Están en Formato de fecha y hora ISO 8601/RFC 3339que es AAAA-MM-DDTHH:mm:ssZ. esta en UTCasí que asegúrate de sustraer su diferencia de zona horaria. La hora de Indonesia occidental es UTC+7, por lo que hoy a las 00:00 sería ayer a las 17:00 en UTC.

max_results es el número máximo de tweets en una llamada API. Solo puedes tenerlo 100 como máximo. Si su consulta produce más que eso, obtendrá un atributo «next_token» en los metadatos del resultado (no nulo). Puedes proporcione este next_token para obtener la «página siguiente» de su consulta. Si no quedan más tweets para recuperar, next_token será nulo. Esto debería encajar perfectamente en un bucle do-while, pero Python no tiene eso, así que configuremos una bandera.

first = True
next_token = None
data = [] # This is just an example of combining the result
while first or next_token:
result = client.search_recent_tweets(...)
data = result.data
next_token = result.meta["next_token"]
# This is just an example of combining the result
data += data
...

tweet_fields le dice a la API qué atributos/campos de tweet recuperar. En Tweepy, es una lista de cadenas o una cadena separada por comas de nombres de campo. Por ejemplo, si desea recuperar el como contar etc., querrá el campo public_metrics. En mi proyecto, utilicé estos campos:

tweet_fields=[
"author_id",
"conversation_id",
"created_at",
"id",
"lang",
"public_metrics",
"text"
]

Bueno, eso es todo por la API de búsqueda de tweets.

A continuación, usaremos BERT para realizar un análisis de sentimiento. usaremos Este modelo por Mdhugol. Es un modelo de clasificación de sentimientos basado en IndoBERT. Clasifica el texto en positivo, neutro y negativo (en este orden de etiqueta). El sitio web proporciona un campo para que pruebe el modelo fácilmente.

Campo para probar el modelo en Huggingface; LABEL_2 significa negativo

3.1. En eso

De acuerdo, para el modelo necesitaremos instalar un transformador y un emoji. El paquete de transformadores será para el modelo, mientras que los emoji se usarán para convertir emojis en texto que lo represente. Al igual que antes, agregue «!» en la parte delantera si está utilizando google colab o jupyter.

pip install transformers emoji --upgrade

A continuación, los importamos y definimos algunas constantes. Además de esos paquetes, también usaremos expresiones regulares y html para la limpieza.

from transformers import AutoTokenizer, AutoModelForSequenceClassification
from transformers import pipeline
import emoji
import re
import html
pretrained_id = "mdhugol/indonesia-bert-sentiment-classification"
label_id =

3.2. Limpieza de texto

Antes de hacer el análisis de sentimiento, primero debemos limpiar el texto. No es mucho, solo quitar o reemplazar algunas cosas. Esta función se basa en preprocesamiento de indoBERTweet por indolema. Reemplaza las etiquetas de usuario con @USER y las URL con HTTPURL.

Además de eso, estaré reemplazando emojis con su representación de texto usando emoji.demojize para que el modelo tenga en cuenta los emojis al determinar el sentimiento. Sin embargo, hace que los tweets sean más largosespecialmente en aquellos que emojis spameados. Mientras tanto, por defecto, el modelo no admite texto muy largo. Twitter ya tiene un límite de longitud de tweet y se ajusta al modelo, pero debido a la conversión de emojis, algunos tweets se vuelven muy largos. Así que estoy mitigando esto por limitar la repetición de emojis a 3 repeticiones como máximo. Yo uso expresiones regulares para hacer esto.

tweet = emoji.demojize(tweet).lower()
tweet = re.sub(r"#w+", "#HASHTAG", tweet)
tweet = re.sub(r"(:[^:]+:)1", r"111", tweet)
tweet = re.sub(r"(:[^:]+:)(:[^:]+:)(1+2+)", r"121212", tweet)

Por último, yo unescape HTML-caracteres escapados usando html.unescape. Al usar TextBlob, descubrí que algunos tweets usan caracteres HTML escapados. Eso hizo que TextBlob arrojara un error. No estoy seguro de lo que le hace a BERT, pero simplemente los recuperaré.

De todos modos, aquí están las funciones completas de preprocesamiento. Simplemente use la función preprocess_tweet.

def find_url(string):
# with valid conditions for urls in string
regex = r"(?i)b((?:https?://|wwwd[.]|[a-z0-9.-]+[.][a-z]/)(?:[^s()<>]+|(([^s()<>]+|(([^s()<>]+)))*))+(?:(([^s()<>]+|(([^s()<>]+)))*)|[^s`!()[];:'".,<>?«»“”‘’]))"
url = re.findall(regex,string)
return [x[0] for x in url]
def preprocess_tweet(tweet):
tweet = emoji.demojize(tweet).lower()
tweet = re.sub(r"#w+", "#HASHTAG", tweet)
tweet = re.sub(r"(:[^:]+:)1", r"111", tweet)
tweet = re.sub(r"(:[^:]+:)(:[^:]+:)(1+2+)", r"121212", tweet)
new_tweet = []
for word in tweet.split():
if word[0] == '@' or word == '[username]':
new_tweet.append('@USER')
elif find_url(word) != []:
new_tweet.append('HTTPURL')
elif word == 'httpurl' or word == '[url]':
new_tweet.append('HTTPURL')
else:
new_tweet.append(word)
tweet = ' '.join(new_tweet)
tweet = html.unescape(tweet)
return tweet

3.3. modelo BERT

Bien, ahora que el texto está bien, podemos hacer el análisis de sentimiento. Creamos un tokenizador y un modelo utilizando el nombre del modelo preentrenado (pretrained_id). Se descargará desde Huggingface, por lo que necesita conexión a Internet. Es bastante grande, pero Google Colab se ejecuta en los servidores de Google y utiliza la conexión rápida de Google. A continuación, creamos una canalización de análisis de opiniones utilizando el modelo y el tokenizador.

tokenizer = AutoTokenizer.from_pretrained(pretrained_id)
model = AutoModelForSequenceClassification.from_pretrained(pretrained_id)
sentiment_analysis = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer)

Luego, solo usamos la canalización y convertimos la etiqueta de resultado.

text = preprocess_tweet(text)
result = sentiment_analysis(text)
status = label_id[result[0]['label']]
score = result[0]['score']
print(f'Text: | Label : (%)')

Eso es todo. En realidad. Análisis de sentimiento realizado. Los modelos preentrenados Huggingface lo hicieron muy fácil de hacer. Bueno, si puede encontrar el modelo correcto que se ajuste a su caso de uso, eso es. De lo contrario, tendrá que ajustarlo o incluso volver a entrenar al modelo.

A pesar de que la consulta es un evento de Indonesia, no todos los tweets están en indonesio. Podemos use el campo «idioma» del tuit para saber en qué idioma está (según Twitter). Con eso, podemos hacer un análisis de sentimiento de un tweet utilizando el modelo adecuado para el idioma del tweet. En mi proyecto, usé BERT enviado por rabindralamsal para tweets en inglés. Sin embargo, tenga en cuenta que diferentes modelos pueden usar diferentes etiquetas. BERTsent, por ejemplo, también clasifica los tweets en positivos, neutrales y negativos, pero en orden inverso. En el modelo de Indonesia, LABEL_2 significa negativo, pero en BERTsent significa positivo. Aquí están las constantes por cierto:

pretrained_en = "rabindralamsal/BERTsent"
label_en =

Bueno, eso es todo. Me tomó un tiempo descubrir cómo hacerlo, pero una vez que sabes cómo, en realidad es bastante fácil. Pero, por supuesto, no hice mucho preprocesamiento de texto. Yo tampoco hice el modelo. En realidad, ni siquiera tengo los conceptos básicos de PNL, así que corrígeme si escribí algo mal. O, tal vez, si desea agregar algo, simplemente hágalo en los comentarios. Gracias por leer.



Fuente del artículo

Deja un comentario