in

Conceptos básicos del análisis de texto en Python

1bj31A3JBbGQPwXWYZtgrcA

Empezando

Conceptos básicos del análisis de texto en Python

Bigrama / trigrama, análisis de sentimientos y modelado de temas

Sophia Yang

20 de oct de 2020·5 min de lectura

Este artículo habla sobre las herramientas de análisis de texto más básicas en Python. No vamos a entrar en los elegantes modelos de PNL. Solo lo básico. A veces, todo lo que necesitas son lo básico 🙂

Primero obtengamos algunos datos de texto. Aquí tenemos una lista de reseñas de cursos que hice. ¿Qué podemos hacer con estos datos? La primera pregunta que me viene a la mente es ¿podemos decir qué reseñas son positivas y cuáles negativas? ¿Podemos hacer un análisis de sentimiento sobre estas revisiones?

corpus = [
'Great course. Love the professor.',
'Great content. Textbook was great',
'This course has very hard assignments. Great content.',
'Love the professor.',
'Hard assignments though',
'Hard to understand.'
]

Análisis de los sentimientos

Genial, vamos a verok en el análisis de sentimiento general. Me gusta trabajar con un marco de datos de pandas. Entonces, creemos un marco de datos de pandas a partir de la lista.

import pandas as pd
df = pd.DataFrame(corpus)
df.columns = ['reviews']

A continuación, instalemos la biblioteca. textblob (conda install textblob -c conda-forge) e importar la biblioteca.

from textblob import TextBlob
df['polarity'] = df['reviews'].apply(lambda x: TextBlob(x).polarity)
df['subjective'] = df['reviews'].apply(lambda x: TextBlob(x).subjectivity)

Entonces podemos calcular el sentimiento a través de la polarity función. polarity varía de -1 a 1, siendo -1 negativo y 1 positivo. El TextBlob también puede usar el subjectivity función para calcular subjectivity, que va de 0 a 1, siendo 0 objetivo y 1 subjetivo.

Análisis de sentimiento de Bigram / Trigram

A continuación, podemos explorar algunas asociaciones de palabras. Los análisis de N-gramas se utilizan a menudo para ver qué palabras suelen aparecer juntas. A menudo me gusta investigar combinaciones de dos o tres palabras, es decir, Bigrams / Trigrams.

Un norte-gramo es una secuencia contigua de norte elementos de una muestra determinada de texto o discurso.

En el análisis de texto, a menudo es una buena práctica filtrar algunas palabras vacías, que son las palabras más comunes pero que no tienen un significado contextual significativo en una oración (por ejemplo, «a», «el», «y», » pero ”, y así sucesivamente). nltk nos proporciona una lista de dichas palabras vacías. También podemos agregar palabras vacías personalizadas a la lista. Por ejemplo, aquí agregamos la palabra «aunque».

from nltk.corpus import stopwords
stoplist = stopwords.words('english') + ['though']

Ahora podemos eliminar las palabras vacías y trabajar con algunos bigramas / trigramas. La función CountVectorizer “Convertir una colección de documentos de texto en una matriz de recuentos de tokens”. los stop_words El parámetro tiene una opción incorporada «inglés». Pero también podemos usar nuestras palabras vacías definidas por el usuario, como se muestra aquí. los ngram_range El parámetro define qué n-gramas nos interesan: 2 significa bigrama y 3 significa trigrama. El otro parámetro que vale la pena mencionar es lowercase, que tiene un valor predeterminado Cierto y convierte todos los caracteres a minúsculas automáticamente para nosotros. Ahora, con el siguiente código, podemos obtener todos los bigramas / trigramas y ordenarlos por frecuencias.

from sklearn.feature_extraction.text import CountVectorizer
c_vec = CountVectorizer(stop_words=stoplist, ngram_range=(2,3))
# matrix of ngrams
ngrams = c_vec.fit_transform(df['reviews'])
# count frequency of ngrams
count_values = ngrams.toarray().sum(axis=0)
# list of ngrams
vocab = c_vec.vocabulary_
df_ngram = pd.DataFrame(sorted([(count_values[i],k) for k,i in vocab.items()], reverse=True)
).rename(columns={0: 'frequency', 1:'bigram/trigram'})

De manera similar al análisis de sentimientos anterior, podemos calcular la polaridad y subjetividad para cada bigrama / trigrama.

df_ngram['polarity'] = df_ngram['bigram/trigram'].apply(lambda x: TextBlob(x).polarity)
df_ngram['subjective'] = df_ngram['bigram/trigram'].apply(lambda x: TextBlob(x).subjectivity)

Modelado de temas

También podemos hacer algunos modelos de temas con datos de texto. Hay dos formas de hacer esto: modelos NMF y modelos LDA. A continuación, mostraremos ejemplos utilizando ambos métodos.

Modelos NMF

La factorización de matrices no negativas (NMF) es un método de descomposición de matrices, que descompone una matriz en el producto de W y H de elementos no negativos. El método predeterminado optimiza la distancia entre la matriz original y WH, es decir, la norma de Frobenius. A continuación se muestra un ejemplo en el que usamos NMF para producir 3 temas y mostramos 3 bigramas / trigramas en cada tema.

Source: https://scikit-learn.org/stable/auto_examples/applications/plot_topics_extraction_with_nmf_lda.htmlfrom sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import NMF
from sklearn.pipeline import make_pipeline
tfidf_vectorizer = TfidfVectorizer(stop_words=stoplist, ngram_range=(2,3))
nmf = NMF(n_components=3)
pipe = make_pipeline(tfidf_vectorizer, nmf)
pipe.fit(df['reviews'])
def print_top_words(model, feature_names, n_top_words):
for topic_idx, topic in enumerate(model.components_):
message = "Topic #%d: " % topic_idx
message += ", ".join([feature_names[i]
for i in topic.argsort()[:-n_top_words - 1:-1]])
print(message)
print()
print_top_words(nmf, tfidf_vectorizer.get_feature_names(), n_top_words=3)

Aquí está el resultado. Parece que el tema 0 trata sobre el profesor y los cursos; el tema 1 trata sobre la tarea y el tema 3 trata sobre el libro de texto. Tenga en cuenta que no sabemos cuál es el mejor número de temas aquí. Usamos 3 solo porque nuestro tamaño de muestra es muy pequeño. En la práctica, es posible que deba realizar una búsqueda en cuadrícula para encontrar el número óptimo de temas.

Modelos LDA

La asignación de Dirichlet latente es un modelo probabilístico generativo para colecciones de conjuntos de datos discretos, como corpus de texto. También es un modelo de temas que se utiliza para descubrir temas abstractos de una colección de documentos.

Aquí, en nuestro ejemplo, usamos la función LatentDirichletAllocation, que “implementa el algoritmo de Bayes variacional en línea y admite métodos de actualización en línea y por lotes”. Aquí mostramos un ejemplo en el que el método de aprendizaje se establece en el valor predeterminado «en línea».

Source: https://scikit-learn.org/stable/auto_examples/applications/plot_topics_extraction_with_nmf_lda.htmlfrom sklearn.decomposition import LatentDirichletAllocation
tfidf_vectorizer = TfidfVectorizer(stop_words=stoplist, ngram_range=(2,3))
lda = LatentDirichletAllocation(n_components=3)
pipe = make_pipeline(tfidf_vectorizer, lda)
pipe.fit(df['reviews'])
def print_top_words(model, feature_names, n_top_words):
for topic_idx, topic in enumerate(model.components_):
message = "Topic #%d: " % topic_idx
message += ", ".join([feature_names[i]
for i in topic.argsort()[:-n_top_words - 1:-1]])
print(message)
print()
print_top_words(lda, tfidf_vectorizer.get_feature_names(), n_top_words=3)

Ahora sabe cómo hacer un análisis de texto básico en Python. Nuestro ejemplo tiene tamaños de datos muy limitados para fines de demostración. El análisis de texto en el mundo real será mucho más desafiante y divertido. Espero que disfrutes de este artículo. ¡Gracias!

Referencias

https://scikit-learn.org/stable/auto_examples/applications/plot_topics_extraction_with_nmf_lda.html

https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html

https://stackoverflow.com/questions/11763613/python-list-of-ngrams-with-frequencies/11834518

Deja una respuesta

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

5NyzBxijspGUiFyCiz9F4 1200 80

Llegó Android 11: características, fechas de lanzamiento y más

Propiedad de familia de fuentes CSS