前言
本文已参与「新人创作礼」活动,一起开启掘金创作之路。之前我用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()
具体效果如下图:
大家注意,pd.read_csv生成的是一个date_frame的结构,需要转换成list,具体函数为df.values.tolist,由于版本不同,有的python语句可能是,df.content.values.tolist(),还有一点需要注意,一般在提取关键词时,需要去除停用词,因为本文的语料库时已经处理好的,所以便省略了。
结尾
拜拜,欢迎交流指正