7.1 目标i任务
1.熟悉LDA在自然语言处理中的应用
2.掌握python-lda库
3.测试LDA模型训练中,不同参数的设置对结果产生的影响
7.2 实验环境
1.python2.7、Numpy、Sklearn
2.Python-jieba:结巴分词,用于对语料文件进行分词处理
3.python-lda:基于Gibbs抽样的LDA模型的python实现。下载地址:http://pypi.python.org/pypi/lda/
4.gensim库
7.3 实验数据
搜狗新闻数据集,下载地址:http://www.sogou.com/labs/resource/ftp.php?dir=/Data/SogouCA/SogouCA.reduced.tar.gz
文本格式:
对数据集一需要对原始数据进行处理,生成便于处理的文本文件。处理过程如下:
(1)数据清洗:
1.抽取语料文件中
2.提出空格、回车等空白字符
3.对正文文本进行分词
4.剔除标点、日期、数字等类型的词
5.根据停用词表剔除停用词
(2)生成训练数据:生成一个每行为一个新闻语料的分词文件news.dat
7.4 实验设计
本次实验使用gensim库中的LDA模型对数据集进行训练
# coding:utf-8
import numpy as np
from gensim import corpora, models
import time
import sys
import argparse
reload(sys)
sys.setdefaultencoding('utf8')
def load_stopword():
f_stop = open('./stopword.txt','r+')
sw = [line.strip() for line in f_stop]
f_stop.close()
return sw
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='parse argument')
parser.add_argument('--file',type=str,default='./news.dat')
parser.add_argument('--a',type=float,default=0.1)
parser.add_argument('--b',type=float,default=0.01)
parser.add_argument('--n',type=int,default=10)
parser.add_argument('--iter',type=int,default=500)
args = parser.parse_args()
filepath = args.file
num_topics = args.n
alpha = args.a
eta = args.b
chunksize = args.iter
t_start = time.time()
stop_words = load_stopword()
f = open(filepath)
texts = [[word for word in line.strip().lower().split() if word not in stop_words] for line in f]
print 'INFO:load data:%.3fs' % (time.time() - t_start)
f.close()
M = len(texts)
print 'INFO:n_documents: %d' % M
dictionary = corpora.Dictionary(texts)
V = len(dictionary)
print 'INFO:vocab_size: ', V
corpus = [dictionary.doc2bow(text) for text in texts]
print 'INFO:n_words: ',dictionary.num_pos
print 'INFO:n_topics: ',num_topics
print 'INFO:n_iter',chunksize
corpus_tfidf = models.TfidfModel(corpus)[corpus]
t_start = time.time()
lda = models.LdaModel(corpus_tfidf, num_topics=num_topics, id2word=dictionary,
alpha=alpha, eta=eta, minimum_probability=0.001,
update_every = 1, chunksize = chunksize, passes=5)
print 'INFO:LDA train:%.3fs' % (time.time() - t_start)
# 随机打印某10个文档的主题
num_show_topic = 10 # 每个文档显示前几个主题
print '10 topic:'
doc_topics = lda.get_document_topics(corpus_tfidf) # 所有文档的主题分布
idx = np.arange(M)
np.random.shuffle(idx)
idx = idx[:10]
for i in idx:
topic = np.array(doc_topics[i])
print 'topic:\n', topic
topic_distribute = np.array(topic[:, 1])
# print topic_distribute
topic_idx = topic_distribute.argsort()[:-num_show_topic-1:-1]
print 'doc %d top %d words:\n' % (i, num_show_topic), topic_idx
print topic_distribute[topic_idx]
num_show_term = 10 # 每个主题显示几个词
print('words of each topic:')
for topic_id in range(num_topics):
print 'Topic#%d:\t' % topic_id
term_distribute_all = lda.get_topic_terms(topicid=topic_id)
term_distribute = term_distribute_all[:num_show_term]
term_distribute = np.array(term_distribute)
term_id = term_distribute[:, 0].astype(np.int)
print 'words:\t ',
for t in term_id:
print dictionary.id2token[t] ,
print
# print '\n概率:\t', term_distribute[:, 1]
7.5 实验过程
7.5.1参数的输入
--a | 主题分布的Dirichlet参数(默认0.1) |
--b | 单词分布的Dirichlet参数(默认0.01) |
--n | 生成主题数量(默认10) |
--iter | 迭代次数(默认500) |
--file | 测试数据路径(默认当前目录的news.dat文件) |
7.5.2实验步骤
(1)通过pip安装jieba
pip install jieba
(2)通过pip安装lda
pip install lda
(3)通过pip安装gensim
pip install gensim
(4)验证是否安装成功
不提示错误则表示安装成功
(5)开始实验
python ./netease_news.py
改变参数:
python ./netease_news.py --n=4 --iter=600