[七]機器學習之LDA
阿新 • • 發佈:2018-11-11
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