[Python] Extracción de temas de texto chino del modelo LDA 丨 El uso de la herramienta de visualización pyLDAvis

La realización del modelo de tema LDA y su visualización pyLDAvis

  1. Extracción no supervisada de temas de documentos: modelo LDA
    1.1 Trabajo de preparación
    1.2 Modelo de implementación de API de llamada
  2. Análisis visual interactivo de LDA-pyLDAvis
    2.1 Instalar pyLDAvis
    2.2 Combinar gensim para llamar a la API para lograr la visualización
    ps Guardar el resultado como una página web independiente
    pps ¿Acelerar la preparación?
    2.3 Cómo analizar los resultados de visualización de pyLDAvis
    2.3.1 ¿Qué significa cada tema?
    2.3.2 ¿Qué tan común es cada tema?
    2.3.3 ¿Cuáles son las conexiones entre los temas?
  3. Extracción no supervisada de temas de documentos: modelo LDA
    La introducción específica de este modelo, los escenarios de aplicación, etc. no se discutirán, usted sabe que puede darle retroalimentación de un montón de textos para darle un número específico de grupos de temas.

Debido a que es un algoritmo no supervisado, significa que no necesita preparar el conjunto de entrenamiento y no tiene que hacer el etiquetado duro. Se guarda al menos la mitad de las tareas en la fase de preparación de datos.

Como novato en matemáticas, siempre he sido reacio a entrar en los principios específicos a menos que sea necesario. Siempre que alguien demuestre que es factible, lo usaré. Las cabezas inteligentes deberían hacer su mejor uso (risas

Pero tal vez no pueda escapar de ahora en adelante y tengo que aprender el principio. Ponga la explicación del principio aquí primero, y luego léalo más tarde cuando lo necesite.

Por lo tanto, este artículo presenta principalmente cómo comenzar y cómo analizar los resultados. Esto es lo que debe hacer el científico de datos.

1. Extracción no supervisada de temas de documentos: modelo LDA

1.1 Preparación

El libro vuelve a la historia principal. Tomando este trabajo como ejemplo, necesito analizar los temas de 50 páginas de Weibo por persona de 500 usuarios, alrededor de 500 * 50 * 10 = 250.000 textos de Weibo. En otras palabras, quiero ver qué es lo que más les preocupa a los microblogs de estas personas y qué aspectos les preocupan juntos.

Entorno de programación:
python 3.6 + pycharm 2018,
el paquete utilizado para la implementación de LDA es gensim,
y la palabra segmentación sigue siendo nuestra vieja amiga jieba.

Preparación de datos: Los
datos originales rastreados se almacenan en csv. Lo que quiero es leer todos los textos de Weibo en un txt, y luego dividir las palabras en palabras vacías, y cumplirá con el estándar de entrada de gensim.

Antes de la segmentación de palabras:
Inserte la descripción de la imagen aquí
Después de la segmentación de palabras:
Inserte la descripción de la imagen aquí
[código]
Se utiliza para procesar el texto original.

def stopwordslist(filepath):
    stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
    return stopwords

# 对句子进行分词
def seg_sentence(sentence):
    sentence = re.sub(u'[0-9\.]+', u'', sentence)
    jb.add_word('光线摄影学院')		# 这里是加入用户自定义的词来补充jieba词典。
    jb.add_word('曾兰老师')			# 同样,如果你想删除哪个特定的未登录词,就先把它加上然后放进停用词表里。
    jb.add_word('网页链接')
    jb.add_word('微博视频')
    jb.add_word('发布了头条文章')
    jb.add_word('青春有你')
    jb.add_word('青你')
    sentence_seged = jb.cut(sentence.strip())
    stopwords = stopwordslist('stopWords/stopwords.txt')  # 这里加载停用词的路径
    outstr = ''
    for word in sentence_seged:
        if word not in stopwords and word.__len__()>1:
            if word != '\t':
                outstr += word
                outstr += " "
    return outstr


inputs = open('input/like_mi10_user_all_retweet.txt', 'r', encoding='utf-8')

outputs = open('output1/mi10_user_retweet_fc.txt', 'w',encoding='utf-8')
for line in inputs:
    line_seg = seg_sentence(line)  # 这里的返回值是字符串
    outputs.write(line_seg + '\n')
outputs.close()
inputs.close()

1.2 Llamar al modelo de implementación de api

Prepare los datos durante dos horas, llame a la interfaz durante tres minutos y espere el resultado durante dos horas.

Gensim es muy amigable, el diccionario, el modelo de bolsa de palabras y el modelo lda se hacen en una sola oración.

【código】

from gensim import corpora
from gensim.models import LdaModel
from gensim.corpora import Dictionary


train = []

fp = codecs.open('output1/mi10_user_retweet_fc.txt','r',encoding='utf8')
for line in fp:
    if line != '':
        line = line.split()
        train.append([w for w in line])

dictionary = corpora.Dictionary(train)

corpus = [dictionary.doc2bow(text) for text in train]

lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=20, passes=60)
# num_topics:主题数目
# passes:训练伦次
# num_words:每个主题下输出的term的数目

for topic in lda.print_topics(num_words = 20):
    termNumber = topic[0]
    print(topic[0], ':', sep='')
    listOfTerms = topic[1].split('+')
    for term in listOfTerms:
        listItems = term.split('*')
        print('  ', listItems[1], '(', listItems[0], ')', sep='')

La salida final es

0:
  "北京" (0.024)
  "疫情" ( 0.021)
  "中国联通" ( 0.019)
  "领券" ( 0.019)
  "购物" ( 0.016)
  "新冠" ( 0.016)
  "专享" ( 0.012)
  "元券" ( 0.012)
  "确诊" ( 0.012)
  "上海" ( 0.011)
  "优惠" ( 0.011)
  "肺炎" ( 0.010)
  "新闻" ( 0.010)
  "病例" ( 0.010)
  "汽车"( 0.009)
1:
  "小米" (0.133)
  "Redmi" ( 0.019)
  "新浪" ( 0.019)
  "智慧" ( 0.018)
  "雷军" ( 0.014)
  "众测" ( 0.012)
  "体验" ( 0.012)
  "智能" ( 0.012)
  "MIUI" ( 0.012)
  "电视" ( 0.012)
  "红米" ( 0.011)
  "空调" ( 0.009)
  "产品" ( 0.009)
  "品牌" ( 0.009)
  "价格"( 0.008)
2:
  "抽奖" (0.056)
  "平台" ( 0.032)
  "评测" ( 0.022)
  "生活" ( 0.013)
  "红包" ( 0.013)
  "关注" ( 0.012)
  "这条" ( 0.012)
  "视频" ( 0.012)
  "工具" ( 0.011)
  "获得" ( 0.011)
  "有效" ( 0.011)
  "进行" ( 0.010)
  "恭喜" ( 0.010)
  "用户" ( 0.010)
  "公正"( 0.010)
 .....

Este tipo de. Él solo le devolverá cuántas palabras bajo el número prescrito de temas. El decimal después de cada palabra se puede considerar como la probabilidad de que la palabra pertenezca al tema. La suma de las probabilidades de todas las palabras bajo el tema es 1; y cuál debe ser el tema Se define posteriormente en su análisis manual.

Luego, mirando este montón de palabras frías y números, tal vez puedas medir la relación entre esta palabra y este tema por probabilidad, pero ¿puedes ver la relación entre diferentes temas? ¿Puedes ver la relación entre una palabra y otros temas?

Un poco dificil. En este momento, presentaremos nuestra herramienta de análisis visual LDA.

2. Análisis visual interactivo de LDA-pyLDAvis

Primero en las representaciones:
Inserte la descripción de la imagen aquí

2.1 Instalar pyLDAvis

pip install pyldavis

2.2 Combine gensim para llamar a api para lograr la visualización

pyLDAvis admite la entrada directa de modelos lda en tres paquetes: sklearn, gensim, graphlab, y parece que puede calcularlo usted mismo. Por supuesto, el modelo lda obtenido por gensim sigue directamente lo anterior.
pyLDAvis también es muy amigable y completa la implementación en la misma oración:

import pyLDAvis.gensim

'''插入之前的代码片段'''

d=pyLDAvis.gensim.prepare(lda, corpus, dictionary)

'''
lda: 计算好的话题模型

corpus: 文档词频矩阵

dictionary: 词语空间
'''

pyLDAvis.show(d)		#展示在浏览器
# pyLDAvis.displace(d) #展示在notebook的output cell中

La cantidad de datos es grande y el tiempo de ejecución es un poco más largo.

ps guardar el resultado como una página web independiente

Al mismo tiempo, si desea poder guardar este resultado como una página web separada para compartirlo o ponerlo en el sistema web, puede hacerlo.

d=pyLDAvis.gensim.prepare(lda, corpus, dictionary)

pyLDAvis.save_html(d, 'lda_pass10.html')	# 将结果保存为该html文件

No tiene que esperar mucho tiempo para ejecutar el resultado cada vez. .

pps para acelerar la preparación?

Sí, este proceso de visualización es realmente lento. . Usé de vez en cuando. Para ahorrar tiempo durante la prueba, gensim solo se entrena una vez, lo que toma 58 segundos, y luego espera la renderización de pyLDAvis. . ¿Ha esperado más de una hora? 4200s ... finalmente salió.
Luego, guárdelo pronto como una página web.
Inserte la descripción de la imagen aquí

d=pyLDAvis.gensim.prepare(lda, corpus, dictionary, mds='mmds')

Salsa morada.
Realmente probado, se puede decir que no hay efecto. . . . .

Al mismo tiempo, el parámetro de este algoritmo de selección también puede ser tsne La diferencia entre los diferentes algoritmos está aún por ver la documentación.

2.3 Cómo analizar los resultados de visualización de pyLDAvis

La página que salió es complicada y no complicada. La distribución de burbujas de la izquierda es de diferentes temas, y la de la derecha son las primeras 30 palabras destacadas del tema. El color azul claro representa la frecuencia (peso) de la palabra en todo el documento y el color rojo oscuro representa el peso de la palabra en el tema. Puede ajustar un parámetro λ en la esquina superior derecha y luego mirar hacia abajo.
Inserte la descripción de la imagen aquí
Así que finalmente damos respuesta a las tres preguntas que el autor de LDAvis tiene que resolver en el desarrollo de esta herramienta:

2.3.1 ¿Qué significa cada tema?

Al pasar el mouse sobre la burbuja de la izquierda, podemos elegir ver un tema específico. Después de la selección, el panel de la derecha mostrará el vocabulario relacionado con este tema. Al resumir el significado de estas palabras, podemos concluir el significado del tema.

Al mismo tiempo, ¿qué palabra tiene mayor peso en el tema? La relevancia de un determinado tema de palabra se ajusta mediante el parámetro λ.

如果λ接近1,那么在该主题下更频繁出现的词,跟主题更相关;
如果λ越接近0,那么该主题下更特殊、更独有(exclusive)的词,跟主题更相关(有点TF-IDF的意思了)。

Por lo tanto, podemos cambiar la relevancia de las palabras y los temas ajustando el tamaño de λ y explorar más el sentido del significado del tema.

2.3.2 ¿Qué tan común es cada tema?

Después de ejecutar el modelado de temas, podemos conocer la frecuencia de cada tema. El autor de LDAvis usa el tamaño de un círculo para representar este número, y también está etiquetado 1 ~ n en orden. Por lo tanto, el tamaño y el número de burbujas indican la frecuencia del tema.
Inserte la descripción de la imagen aquí

2.3.3 ¿Cuáles son las conexiones entre los temas?

Aquí el autor utiliza análisis de escala multidimensional para extraer los componentes principales como dimensiones y distribuir los temas en estas dos dimensiones La distancia entre los temas expresa la proximidad entre los temas. La distancia de la burbuja utiliza la distancia JSD, que (debería) puede considerarse como el grado de diferencia entre los temas. La superposición de las burbujas indica que las palabras principales en los dos temas se superponen.

Después de saber esto, simplemente lea las palabras para hablar. Mire lo que deberían decir estas palabras y extraiga diferentes temas Este es el resultado del valor de la aplicación práctica. Si no hay un resultado final, todo lo que hizo antes es un trozo de papel de desecho.

Concluyamos aquí primero, dejando de lado el nivel teórico, debería ser suficiente.

Supongo que te gusta

Origin blog.csdn.net/kz_java/article/details/114982528
Recomendado
Clasificación