1. 程式人生 > >[七]機器學習之LDA

[七]機器學習之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

文字格式:

對資料集一需要對原始資料進行處理,生成便於處理的文字檔案。處理過程如下:

(1)資料清洗:

1.抽取語料檔案中<content>中的正文內容

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