Gensim: una biblioteca de herramientas de Python para el reconocimiento de temas de texto

La extracción automática de los temas de los que habla la gente de grandes cantidades de texto (reconocimiento de temas) es una de las aplicaciones fundamentales del procesamiento del lenguaje natural. Los ejemplos de textos extensos incluyen suscripciones a redes sociales, reseñas de consumidores sobre hoteles, películas y otros negocios, reseñas de usuarios, noticias y correos electrónicos de clientes.

En este artículo, utilizaremos LDA para extraer un caso práctico de temas del conjunto de datos de 20Newsgroup . Bienvenido a la discusión en profundidad, si lo desea, recuerde dar me gusta, seguir y marcar como favorito.

[Nota] La versión completa del código, los datos y el intercambio técnico se pueden obtener al final del artículo.

Fundamentos del reconocimiento de temas

Esta sección cubrirá los principios de identificación y modelado de temas. Yun Duojun aprenderá a detectar y extraer temas de un texto utilizando el método de la bolsa de palabras y modelos simples de PNL.

lematización

La reducción de palabras a sus raíces o raíces se llama lematización.

Primero cree una instancia de WordNetLemmatizer. Llame al '.lemmatize()'método para crear una nueva lista de tokens llamada LEM. Luego llame a la clase Counter y genere bag_wordsun , y finalmente genere los seis temas más probables.

lemmatizer = WordNetLemmatizer() 
lem_tokens = [lemmatizer.lemmatize(t) for t in stopwords_removed] 
bag_words = Counter(lem_tokens) 
print(bag_words.most_common(6))

Gensim y LDA

El nombre completo de LDA es Asignación latente de Dirichlet, y en chino es Asignación latente de Dirichlet.

Gensim es una biblioteca de procesamiento de lenguaje natural (NLP) de código abierto que puede crear y consultar corpus. Funciona construyendo incrustaciones de palabras o vectores, que luego se utilizan para modelar temas.

Los algoritmos de aprendizaje profundo se utilizan para construir representaciones matemáticas multidimensionales de palabras llamadas vectores de palabras. Proporcionan información sobre las relaciones entre los términos del corpus. Por ejemplo, la distancia entre las palabras "India" y "Nueva Delhi" podría ser comparable a la distancia entre las palabras "China" y "Beijing" porque son vectores de capital de país.

Gensim para crear y consultar corpus

He aprendido el conocimiento relevante de gensim contigo antes, ¡y este artículo trabajará contigo para desarrollar el primer corpus y diccionario de gensim!

Estas estructuras de datos analizarán las tendencias de texto y otros temas interesantes en el conjunto de documentación. Primero, importamos algunos artículos de Wikipedia más desordenados que fueron preprocesados ​​para poner en minúsculas todas las palabras, tokenizar y eliminar las palabras vacías y la puntuación. Luego, estos archivos se guardan como artículos, que son una lista de etiquetas de documentos. Antes de crear un vocabulario y un corpus gensim, es necesario realizar un trabajo preliminar.

La bolsa de palabras de Gensim

Ahora use el nuevo corpus y diccionario de gensim para ver los términos usados ​​con más frecuencia en cada documento y en todos los documentos. Puedes buscar estos términos en un diccionario.

Puede usar defaultdict para crear un diccionario que asigne valores predeterminados a claves que no existen. Podemos usar el parámetro int para asegurarnos de que a cualquier clave inexistente se le asigne automáticamente un valor predeterminado de 0.

Matriz de términos del documento para LDA

Después de crear el modelo LDA, entrenaremos el objeto del modelo LDA en la matriz de términos del documento. Se debe especificar el número de temas y un diccionario. Podríamos limitar el número de temas a 2 o 3, ya que tenemos un pequeño corpus de solo 9 documentos.

La información de bolsa de palabras (LDA o TF-IDF) es muy buena para identificar temas al detectar palabras frecuentes cuando el texto en sí es coherente. Cuando el texto es incoherente (en términos de palabras u oraciones), se necesita más información contextual para reflejar completamente la idea del texto.

conjunto de datos

Este ejemplo utiliza el conjunto de datos 20Newsgroup que se puede descargar desde sklearn .

from sklearn.datasets import fetch_20newsgroups 
newsgroups_train = fetch_20newsgroups(subset='train', 
                                      shuffle = True) 
newsgroups_test = fetch_20newsgroups(subset='test', shuffle = True)

Las noticias en este conjunto de datos se han clasificado en temas clave.

print(list(newsgroups_train.target_names))

imagen

Como puede ver en los resultados, cubre una variedad de temas como ciencia, política, deportes, religión y tecnología. Veamos algunos ejemplos de noticias recientes.

newsgroups_train.data[:2]

imagen

Preprocesamiento de datos

Los pasos específicos son los siguientes:

  1. Use la tokenización para dividir el texto en oraciones y las oraciones en palabras.

  2. Elimine todos los signos de puntuación y convierta todas las palabras a minúsculas.

  3. Filtra palabras con menos de tres caracteres.

  4. Eliminar todas las palabras vacías.

  5. Los sustantivos se lematizan, por lo que los sustantivos de tercera persona se convierten en primera persona, y los verbos en tiempo pasado y futuro se cambian al tiempo presente.

  6. Redúzcalos a su forma de raíz más simple.

Preparación de bibliotecas relacionadas

Descargue las palabras vacías de nltk y los paquetes necesarios.

import gensim
from gensim.utils import simple_preprocess
from gensim.parsing.preprocessing import STOPWORDS
from nltk.stem import WordNetLemmatizer, SnowballStemmer
from nltk.stem.porter import *
import numpy as np
np.random.seed(400)
import nltk
nltk.download('wordnet')

lematizador

Antes de comenzar a preprocesar los datos, observe un ejemplo de lematización. ¿Qué sucede si lematizamos “Gone”esta palabra?

Tomemos, por ejemplo, convertir el tiempo pasado al tiempo presente.

print(WordNetLemmatizer().lemmatize('gone', pos = 'v'))
go

Ejemplo de extracción de raíz. Intente escribir algunas oraciones en el analizador de raíces y vea cuál es el resultado.

import pandas as pd
stemmer = SnowballStemmer("english")
original_words = ['sings', 'classes', 'dies', 'mules', 'denied','played', 'agreement', 'owner', 
           'humbled', 'sized','meeting', 'stating', 'siezing', 'itemization','sensational', 
           'traditional', 'reference', 'colon','plotting']
singles = [stemmer.stem(plural) for plural in original_words]
pd.DataFrame(data={
    
    'original word':original_words, 'stemmed':singles })

imagen

A continuación, escriba una función para ejecutar la etapa de preprocesamiento en todo el conjunto de datos.

def lemmatize_stemming(text):
    return stemmer.stem(WordNetLemmatizer().lemmatize(text, pos='v'))
# Tokenize and lemmatize
def preprocess(text):
    result=[]
    for token in gensim.utils.simple_preprocess(text) :
        if token not in gensim.parsing.preprocessing.STOPWORDS and len(token) > 3:
            result.append(lemmatize_stemming(token))
    return resul

Ahora obtenga una vista previa del documento preprocesado y obtenga documentos tokenizados y lemmizados.

document_number = 50
doc_sample = 'Sara did not like to read. She was not very good at it.'
print("Original document: ")
words = []
for word in doc_sample.split(' '):
    words.append(word)
print(words)
print("nnTokenized and lemmatized document: ")
print(preprocess(doc_sample))
Original document:
['Sara', 'did', 'not', 'like', 'to', 'read.',
'She', 'was', 'not', 'very', 'good', 'at', 'it.']
nnTokenized and lemmatized document: 
['sara', 'like', 'read', 'good']

Antes de comenzar a preprocesar todos los titulares de noticias. La lista de documentos en los ejemplos de capacitación debe revisarse cuidadosamente.

processed_docs = []
for doc in newsgroups_train.data:
    processed_docs.append(preprocess(doc))
# Preview 'processed_docs
print(processed_docs[:2])

imagen

"processed_docs" ahora se usará para crear un diccionario que contenga la cantidad de veces que aparece cada palabra en el conjunto de entrenamiento. Para hacer esto, llámelo "diccionario" y envíe el documento procesado a gensim.corpora.Dictionary()[1].

Crea una bolsa de palabras.

Crear una bolsa de palabras a partir de texto.

Antes del reconocimiento de temas, convertimos el texto tokenizado y lematizado en una bolsa de palabras, que puede pensarse como un diccionario, donde las claves son palabras y los valores son el número de veces que esa palabra aparece en el corpus .

Use gensim.corpora.Dictionary, from para "processed_docs"crear un diccionario que contenga el número de ocurrencias de un término en el conjunto de entrenamiento y asígnele el nombre "dictionary".

dictionary = gensim.corpora.Dictionary(processed_docs)

Primero verifique si se creó el diccionario.

count = 0 
for k, v in dictionary.iteritems(): 
    print(k, v) 
    count += 1 
    if count > 10: 
        break
0 addit1 bodi2 bricklin3 bring4 bumper5 
call6 colleg7 door8 earli9 engin10 enlighten

filtrar extremos

Todos los tokens siguientes aparecen en la lista de eliminación.

  • Mayor que (número absoluto) sin documentos por encima o menor que (número absoluto) sin documentos por debajo (fracción del tamaño total del corpus, no número absoluto).

  • Solo se conservan los primeros n tokens más comunes después de (1) y (2). (Si no hay ninguna, se conservan todas las banderas).

dictionary.filter_extremes(no_below=15,no_above=0.1,keep_n= 100000)

También puede filtrar palabras poco frecuentes o frecuentes.

Ahora use el objeto de diccionario resultante para convertir cada página preprocesada en una bolsa de palabras. Es decir, construya un diccionario para cada documento, almacenando cuántas palabras hay y cuántas veces aparecen esas palabras.

Gensim doc2bow

doc2bow(document)

Convierta el documento (lista de palabras) en una lista de 2 tuplas (recuento de tokens de identificación de token) en formato de palabra. Cada palabra es una cadena normalizada y tokenizada (codificación Unicode o utf8). Aplique tokenización, lematización y otros preprocesamientos a las palabras del documento antes de llamar a esta función.

Se debe crear un diccionario para cada documento utilizando el modelo Bag-of-words, y en este diccionario se almacena cuántas palabras hay y cuántas veces aparecen esas palabras. "bow corpus" es adecuado para sostener este diccionario.

bow_corpus = [dictionary.doc2bow(doc) for doc in processed_docs]

Ahora, obtenga una vista previa del BOW del documento de ejemplo preprocesado 11.

document_num = 11
bow_doc_x = bow_corpus[document_num]

for i in range(len(bow_doc_x)):
    print('Word {} ("{}") appears {} time.'.format(bow_doc_x[i][0],dictionary[bow_doc_x[i][0]],bow_doc_x[i][1]))

imagen

Ejecutar LDA

Usando bolsa de palabras

En el corpus del documento, nos centramos en diez temas. Para paralelizar y acelerar el entrenamiento de modelos, realizamos LDA en todos los núcleos de CPU.

Aquí hay algunos parámetros que ajustaremos:

  1. Se requiere que la cantidad de temas potenciales recuperados del corpus de capacitación sea 1 tema.

  2. El mapeo id2word convierte identificadores de palabras (enteros) en palabras (cadenas). Se utiliza para la depuración y la impresión de temas, y para determinar el tamaño del vocabulario.

  3. El número de procesos adicionales utilizados para la paralelización es el número de trabajadores. De forma predeterminada, se utilizan todos los núcleos disponibles.

  4. Los hiperparámetros alfa y eta afectan la escasez de las distribuciones documento-tema (theta) y tema-palabra (lambda), respectivamente. Por ahora, estos serán los valores predeterminados (el valor predeterminado es 1/número de temas).

La distribución temática de cada documento es Alfa.

  • Alfa alto: cada documento tiene varios temas (los documentos se parecen entre sí).

  • Alfa bajo: cada documento contiene algunos temas.

La distribución de palabras para cada tema se llama Eta

  • Eta alta: cada tema contiene una variedad de palabras (los temas se parecen entre sí).

  • Baja eta: Cada tema contiene un pequeño número de palabras.

Dado que podemos usar el modelo gensim LDA, esto es bastante sencillo. Pero se debe especificar el número de sujetos en la recopilación de datos. Supongamos que comenzamos con ocho temas diferentes. El número de pases de entrenamiento a través de este archivo se denomina número de pases.

gensim.modelsentrenará LDA model. LdaMulticorey lo pondrá en la "LDA model"carpeta.

lda_model = gensim.models.LdaMulticore(bow_corpus, num_topics = 8, id2word = dictionary, passes = 10,workers = 2)

Después de entrenar al modelo, mira las palabras que aparecen en el tema y su importancia proporcional a cada palabra.

for idx, topic in lda_model.print_topics(-1):
    print("Topic: {} nWords: {}".format(idx, topic ))
    print("n")

Fichas de tema

¿Qué categorías puedes derivar de las palabras en cada tema y sus pesos correspondientes?

  • 0: Violencia armada

  • 1: deportes

  • 2: Política

  • 3: Espacio

  • 4: Cifrado

  • 5: Tecnología

  • 6: Tarjetas gráficas

  • 7: Religión

Pruebas de modelos

Preprocesar datos para documentos desconocidos.

num = 70
unseen_document = newsgroups_test.data[num]print(unseen_document)

bow_vector = dictionary.doc2bow(preprocess(unseen_document))
for index, score in sorted(lda_model[bow_vector], 
                           key=lambda tup: -1*tup[1]):
    print("Score: {}t Topic: {}".format(score, lda_model.print_topic(index, 5)))

imagen

El modelo aquí está completo. Ahora piense en cómo interpretarlo y vea si los resultados tienen sentido.

El modelo produce salidas para ocho temas, cada uno clasificado por un conjunto de palabras. El modelo LDA no le da a estas palabras un nombre de tema.

Evaluación del modelo

① El modelo funciona bien en la extracción de diferentes temas del conjunto de datos, y el modelo se puede evaluar por nombre de destino.

② El modelo corre muy rápido. En solo unos minutos, los temas se pueden extraer del conjunto de datos.

③ Suponiendo que el conjunto de datos contiene temas discretos, si el conjunto de datos es una colección de tweets aleatorios, los resultados del modelo pueden ser difíciles de interpretar.

resumen sencillo

  1. Al combinar las probabilidades de los temas LDA y las incrustaciones de oraciones, el modelo de reconocimiento de temas contextuales utiliza tanto la bolsa de palabras como la información contextual.

  2. Aunque LDA se desempeña bien en las tareas de reconocimiento de temas, tiene problemas con los textos breves que deben modelarse y los documentos que no explican los temas de manera coherente. También tiene limitaciones ya que se basa en un montón de palabras.

  3. La información de bolsa de palabras (LDA o TF-IDF) es muy buena para identificar temas al detectar palabras frecuentes cuando el texto es coherente internamente. Cuando el texto es incoherente (en el sentido de palabras u oraciones), se necesita más información para reflejar la idea del texto.

artículo recomendado

Intercambio de Tecnología

¡Bienvenido a reimprimir, coleccionar, dar me gusta y apoyar!

inserte la descripción de la imagen aquí

En la actualidad, se ha abierto un grupo de intercambio técnico, con más de 2000 miembros . La mejor manera de comentar al agregar es: fuente + dirección de interés, que es conveniente para encontrar amigos de ideas afines.

  • Método 1. Envíe la siguiente imagen a WeChat, mantenga presionada para identificarla y responda en segundo plano: agregar grupo;
  • Método ②, agregar microseñal: dkl88191 , nota: de CSDN
  • Método ③, cuenta pública de búsqueda de WeChat: aprendizaje de Python y extracción de datos , respuesta en segundo plano: agregar grupo

pulsación larga seguir

Supongo que te gusta

Origin blog.csdn.net/weixin_38037405/article/details/124312855
Recomendado
Clasificación