在之前的实验中,我们利用LDA库来实现了lda, 并且采用二种特征表述方法,一种是直接统计词频的方法,一种是利用TF-IDF来作为特征,并且在有限的测试集上取得了较为理想的效果,当然,这个效果是否真的好,我们需要持怀疑态度哈,需要进一步的验证,这才是严谨的科研态度啊,不管不管,我现在就任性的默认为它能用~~
现在我们需要考虑利用gensim库中的LDA方法,当然,他们都说,学习最好的文档,应该是官方的API和文档,好吧,我承认,在我不懂别人代码的时候,我还是会去查一下的~~gensim中的LDA的实现也有上述二种特征的表述。在这里,我们也是采用二种方式来解决。
实验的代码如下:
# -*- coding:utf-8 -*-
from nltk.tokenize import RegexpTokenizer
from stop_words import get_stop_words
from nltk.stem.porter import PorterStemmer
from gensim import corpora, models
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
if __name__ == "__main__":
corpus = [] # 存储文档
tokens = [] # 存储文档中的单词
# 读取文档的操作
for line in open('a.txt','r').readlines():
if '\xef\xbb\xbf' in line:
line = line.replace('\xef\xbb\xbf', ' ')
corpus.append(line.strip())
print corpus
# 去标点符号,去截止词的操作
en_stop = get_stop_words('en') # 利用Pypi的stop_words包,需要去掉stop_words
# # 提取主干的词语的操作
# p_stemmer = PorterStemmer()
# 分词的操作
tokenizer = RegexpTokenizer(r'\w+')
for text in corpus:
raw = text.lower()
token = tokenizer.tokenize(raw)
stop_remove_token = [word for word in token if word not in en_stop]
# stem_token = [p_stemmer.stem(word) for word in stop_remove_token]
tokens.append(stop_remove_token)
# print tokens
# 得到文档-单词矩阵 (直接利用统计词频得到特征)
dictionary = corpora.Dictionary(tokens) # 得到单词的ID,统计单词出现的次数以及统计信息
# print dictionary.token2id # 可以得到单词的id信息 <dict>
# print type(dictionary) # 得到的是gensim.corpora.dictionary.Dictionary的class类型
texts = [dictionary.doc2bow(text) for text in tokens] # 将dictionary转化为一个词袋,得到文档-单词矩阵
# # 直接利用词频作为特征来进行处理
# lda_model = models.ldamodel.LdaModel(texts, num_topics=3, id2word=dictionary, passes=500)
# print lda_model.print_topics(num_topics=3,num_words=4)
# corpus_lda = lda_model[texts]
# for doc in corpus_lda:
# print doc
# 利用tf-idf来做为特征进行处理
texts_tf_idf = models.TfidfModel(texts)[texts] # 文档的tf-idf形式(训练加转换的模式)
# # for text in texts_tf_idf: # 逐行打印得到每篇文档的每个单词的TD-IDF的特征值
# # print text
# lda_tf_idf = models.LdaModel(texts_tf_idf, num_topics=3, id2word=dictionary, update_every=0, passes=200)
# print lda_tf_idf.print_topics(num_topics=3,num_words=4)
# # doc_topic = [a for a in l