Saltar al contenido

Procesamiento del Lenguaje Natural – Identificación del tema

Gensim es una biblioteca de PNL de código abierto que puede utilizarse para crear y consultar un corpus. Funciona construyendo incrustaciones de palabras o vectores que luego se utilizan para realizar el modelado del tema.

Los vectores de palabras son representaciones matemáticas multidimensionales de palabras creadas con métodos de aprendizaje profundo. Nos dan una visión de las relaciones entre los términos de un corpus. Por ejemplo, la distancia entre las dos palabras “India” y “Nueva Delhi” podría ser similar a la distancia entre “China” y “Beijing”, ya que éstas representan los vectores “País-Capital”.

Procesamiento del Lenguaje Natural – Identificación del tema
Procesamiento del Lenguaje Natural – Identificación del tema

Para empezar, hemos creado nueve documentos de muestra tomados del sitio web. Estos están representados como muestra1 a muestra9 en las líneas de código abajo. Finalmente, hemos creado una colección de estos documentos en la última línea de código .

123456789101112sample1 ="Nuestra junta directiva cuenta con 11 líderes experimentados en tecnología y negocios de Adobe, GSK, HGGC y más. "sample2 ="Nuestros ejecutivos lideran con el ejemplo y nos guían para lograr grandes cosas todos los días. "sample3 ="Trabajar en Pluralisght significa estar rodeado de gente inteligente y apasionada que nos inspira a hacer nuestro mejor trabajo. "sample4 ="Un equipo de liderazgo con visión. "sample5 ="Cursos sobre nube, microservicios, aprendizaje automático, seguridad, Agilidad y más. "sample6 ="Cursos y proyectos interactivos. "sample7 ="Recomendaciones personalizadas de cursos de Iris. "sample8 ="Estamos emocionados de anunciar que ha sido clasificado #9 en la lista de los mejores lugares de trabajo para trabajar en 2018. "sample9 ="Pocas de las oportunidades de trabajo incluyen Consultor de Implementación - Analítica, Gerente - producción de evaluación, Jefe de Información, Director de Comunicaciones. "# compilar documentoscompileddoc =[sample1, sample2, sample3, sample4, sample5, sample6, sample7, sample8, sample9]

pitón

Examinemos el primer documento que se puede hacer con el código que aparece a continuación.

1print(compileddoc[0])

pitón

Salida:

1Nuestra junta directiva cuenta con 11 líderes experimentados en tecnología y negocios de Adobe, GSK, HGGC y más.

En secciones posteriores de esta guía, intentaremos realizar un modelado de temas en el corpus “compileddoc”. Como siempre, el primer paso es el preprocesamiento del texto.

Las tres primeras líneas de código a continuación establecen el marco básico para la limpieza del documento. En la cuarta a ocho líneas , definimos una función para limpiar el documento. Finalmente, en la última línea de código , utilizamos la función para crear el documento limpiado llamada $0027final_doc$0027.

1234567891011stopwords =set(stopwords.words($0027inglés$0027))exclude =set(string.punctuation)lemma = WordNetLemmatizer()defclean(document): stopwordremoval =" ".join([i for i in document.lower().split()if i notin stopwords]) punctuationremoval =$0027$0027. join(ch para ch en stopwordremoval si ch noin excluye) normalized =" ".join(lemma.lemmatize(word)for word en punctuationremoval.split())return normalizedfinal_doc =[clean(document).split()for document in compileddoc]

pitón

Veamos ahora el primer documento – pre y post limpieza de texto – con el siguiente código.

123print("Before text-cleaning:", compiladodoc[0])print("After text-cleaning:",final_doc[0])

pitón

Salida:

12Antes de la limpieza de textos: Nuestra junta directiva cuenta con 11 líderes experimentados en tecnología y negocios de Adobe, GSK, HGGC y más. Después de la limpieza de textos: [$0027junta$0027, $0027director$0027, $0027alarde$0027, $002711$0027, $0027experimentado$0027, $0027tecnología$0027, $0027negocios$0027, $0027líder$0027, $0027adobe$0027, $0027gsk$0027, $0027hggc$0027, $0027más$0027]

Ahora estamos listos para llevar a cabo el modelado de temas en el corpus $0027final_doc$0027, usando un poderoso método estadístico llamado Latent Dirichlet Allocation (LDA). LDA utiliza un enfoque generativo para encontrar textos que son similares. No es una técnica de clasificación y no requiere etiquetas para inferir los patrones. En su lugar, el algoritmo es más bien un método no supervisado que utiliza un modelo probabilístico para identificar grupos de temas.

Preparación de la matriz de documentos para el LDA

El primer paso es convertir el corpus en una representación matricial, como se hace en el siguiente código.

La primera línea de código crea el diccionario de términos del corpus, donde cada término único tiene asignado un índice. La segunda línea convierte el corpus en una Matriz de Términos del Documento utilizando el diccionario preparado anteriormente. Finalmente, con la matriz de documentos-términos preparada, creamos el objeto para el modelo LDA en la tercera línea de código .

12345diccionario = corpora.Dictionary(final_doc)DT_matrix =[dictionary.doc2bow(doc)for doc in final_doc]Lda_object = gensim.models.ldamodel.LdaModel

pitón

Después de crear el objeto modelo de LDA, lo entrenaremos en la matriz del documento. La primera línea de código de abajo realiza esta tarea pasando el objeto LDA en la $0027DT_matrix$0027. También necesitamos especificar el número de temas y el diccionario. Como tenemos un pequeño corpus de nueve documentos, podemos limitar el número de temas a dos o tres.

En las líneas de código de abajo, hemos establecido el número de temas como 2. La segunda línea imprime el resultado.

123lda_model_1 = Lda_object(DT_matrix, num_topics=2, id2word = diccionario)print(lda_model_1.print_topics(num_topics=2, num_words=5))

pitón

Salida:

1[(0, $00270.042*"curso" + 0.031*"más" + 0.022*"ágil" + 0.022*"nube" + 0.022*"microservicios"$0027), (1, $00270.026*"trabajo" + 0.025*"gran" + 0.025*"mejor" + 0.022*"director" + 0.021*"u"$0027)]

En el resultado anterior, cada línea representa un tema con términos y ponderaciones de términos individuales. El primer tema parece ser más sobre los “cursos” ofrecidos por Pluralisght, mientras que el segundo tema parece indicar sobre el “trabajo”.

También podemos cambiar el número de temas y ver cómo cambia el resultado. En el siguiente código, hemos seleccionado tres temas.

123lda_model_2 = Lda_object(DT_matrix, num_topics=3, id2word = diccionario)print(lda_model_2.print_topics(num_topics=3, num_words=5))

pitón

Salida:

1[(0, $00270.030*"u" + 0.027*"gran" + 0.024*"trabajo" + 0.023*"director" + 0.022*"día"$0027), (1, $00270.061*"curso" + 0.025*"más" + 0.025*"aprendizaje" + 0. 025*"nube" + 0,025*"seguridad"$0027), (2, $00270,033*"mejor" + 0,029*"trabajo" + 0,022*"inteligente" + 0,022*"trabajo" + 0,022*"rodeado"$0027)]

El resultado es casi el mismo, con el Tema 2 indicando “cursos”, mientras que los Temas 1 y 3 parecen parecerse a “trabajo”.