基于LDA主题模型对关键词进行提取

659 阅读2分钟

前言

本文已参与「新人创作礼」活动,一起开启掘金创作之路。之前我用matlab自己实现了LDA主题模型(注意不是线性判别模型),当时简历语料库,以及做Gibbs采样,并且去理解其中的数学道理花了我很长时间,今天看到python中有现成的函数来实现对关键词进行提取的功能,真的很棒。

正文

在NLP领域中,对关键词的提取很重要,不同的方法效果不同,最简单的便是TF-IDF方法,但经过实践,这种方法提取关键词的效果好像比较差。下面可能会介绍一些其他的方法,本次介绍基于LDA主题模型提起关键词,具体代码如下:

import jieba.analyse as analyse
import jieba
import pandas as pd
from gensim import corpora,models,similarities
import numpy as np
import matplotlib.pyplot as plt
import gensim

dir='D:/Desktop1/wxchallenge_example_data/annotations/'
file_desc="".join([dir,'word_dict.csv'])
#加载语料
df=pd.read_csv(file_desc,encoding='utf8')
#删除nan行
df.dropna(inplace=True)
lines=df.values.tolist()
dictionary=corpora.Dictionary(lines)

corpus = [dictionary.doc2bow(word) for word in lines]

lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=10)

print(lda.print_topic(1, topn=5))

# 显示中文matplotlib
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 在可视化部分,我们首先画出了九个主题的7个词的概率分布图
num_show_term = 8  # 每个主题下显示几个词
num_topics = 10
for i, k in enumerate(range(num_topics)):
    ax = plt.subplot(2, 5, i+ 1)
    item_dis_all = lda.get_topic_terms(topicid=k)
    item_dis = np.array(item_dis_all[:num_show_term])
    ax.plot(range(num_show_term), item_dis[:, 1], 'b*')
    item_word_id = item_dis[:, 0].astype(np.int)
    word = [dictionary.id2token[i] for i in item_word_id]
    ax.set_ylabel(u"概率")
    for j in range(num_show_term):
        ax.text(j, item_dis[j, 1], word[j], bbox=dict(facecolor='green', alpha=0.1))
plt.suptitle(u'9个主题及其7个主要词的概率', fontsize=18)
plt.show()

具体效果如下图:

image.png

大家注意,pd.read_csv生成的是一个date_frame的结构,需要转换成list,具体函数为df.values.tolist,由于版本不同,有的python语句可能是,df.content.values.tolist(),还有一点需要注意,一般在提取关键词时,需要去除停用词,因为本文的语料库时已经处理好的,所以便省略了。

结尾

拜拜,欢迎交流指正

引用

1