[七]机器学习之LDA

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

文本格式:

[七]机器学习之LDA_第1张图片

对数据集一需要对原始数据进行处理,生成便于处理的文本文件。处理过程如下:

(1)数据清洗:

1.抽取语料文件中中的正文内容

2.提出空格、回车等空白字符

3.对正文文本进行分词

4.剔除标点、日期、数字等类型的词

5.根据停用词表剔除停用词

(2)生成训练数据:生成一个每行为一个新闻语料的分词文件news.dat

[七]机器学习之LDA_第2张图片

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)验证是否安装成功

[七]机器学习之LDA_第3张图片

不提示错误则表示安装成功

(5)开始实验

python ./netease_news.py

[七]机器学习之LDA_第4张图片

[七]机器学习之LDA_第5张图片

[七]机器学习之LDA_第6张图片

[七]机器学习之LDA_第7张图片

改变参数:

python ./netease_news.py --n=4 --iter=600

[七]机器学习之LDA_第8张图片

[七]机器学习之LDA_第9张图片

 

你可能感兴趣的:(机器学习,机器学习入门教程)