LDA的使用记录---LDA库

来源:互联网 发布:软件的可维护性 编辑:程序博客网 时间:2024/05/17 18:17
LDA的原理,花了一周也总算理清一些条目了,然后下一步就是实现,对于LDA的使用,有几种常用的办法:  1,采用LDA库,pip install lda2,采用gensim中的模块3,采用scikit-learn中模块。在这里我们先采用LDA库来实现:其中采用了直接统计词频的方法,以及统计TF-IDF作为特征的二种不同的方法。
# -*- coding:utf-8 -*-import sysreload(sys)sys.setdefaultencoding('utf-8')import numpy as npimport matplotlib.pyplot as pltfrom nltk.tokenize import RegexpTokenizerfrom stop_words import get_stop_wordsfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.feature_extraction.text import CountVectorizer# import ldaimport lda.datasetsif __name__ == "__main__":     corpus = []   # 存储文档     tokens = []   # 存储文档中的单词     for line in open('b.txt','r').readlines():          if '\xef\xbb\xbf' in line:               line = line.replace('\xef\xbb\xbf', ' ')          corpus.append(line.strip())     # 下面采用的是直接统计词频,利用词频来作为特征     vectorizer = CountVectorizer()        X = vectorizer.fit_transform(corpus)     vocab = vectorizer.get_feature_names()         analyze = vectorizer.build_analyzer()     weight = X.toarray()  # 得到文档-单词的矩阵     # 采用TF-idf来作为特征,进行处理     # transformer = TfidfVectorizer(stop_words="english")     # X = transformer.fit_transform(corpus)     # vocab = transformer.get_feature_names()     # analyze = transformer.build_analyzer()     # weight = X.toarray()     # weight_array = np.asarray(weight)     model = lda.LDA(n_topics=3, n_iter=500, random_state=1)     model.fit((100*np.asarray(weight)).astype(int))  # lda迭代训练之后,得到主题-单词分布,以及文档-主题的分布     topic_words = model.topic_word_     # 主题-单词的分布情况     doc_topic = model.doc_topic_        # 文档-主题的分布情况     for i, topic_dist in enumerate(topic_words):          topic_word_pr = np.array(vocab)[np.argsort(topic_dist)][:-6:-1]          print ('TOPIC:{}\n{}'.format(i+1, ' '.join(topic_word_pr)))     label = []     for n in range(10):          topic_most_pr = doc_topic[n].argmax()          label.append(topic_most_pr)          print ("doc:{},topic:{}".format(n, topic_most_pr))  
在上述的代码中,因为我们采用的测试数据用了少量的推文数据。首先,需要明确的问题,对于LDA主题识别的判定标准是模糊,怎么说我们主题识别的好坏的问题第二,测试数据采用什么的效果比较好,需要调节的是哪些的参数的问题第三,应用场景是什么,需要不断的想清楚。利用的测试数据:
1,White House issues cryptic warning against Syrian "potential preparations" for another chemical attack. 2,White House warns Syria against chemical attack "preparations" 3,White House identifies "potential preparations" for another chemical weapons attack by Syrian President Assad4,US identifies #Syrian government potential preparations for chemical attack #SyriaCrisis 5,This serves that in eyes of US, Syed Salahuddin is not merely terrorist active against India,but globally-Jonah Bla6,US designates Salahuddin as global terrorist; India America #TISNews Click Link7,US declares Salahuddin global terrorist8,The sun raise and down,we need love our family member,and love life 

以上数据,采用了3个主题,第一个是叙利亚的化学攻击,第二个是一个人被列为了恐怖分子,第三个是普通的生活感悟。
利用直接的词频作为特征,测试结果如下:

TOPIC:1love and member down ourTOPIC:2salahuddin us terrorist global indiaTOPIC:3chemical preparations attack syrian fordoc:0,topic:2doc:1,topic:2doc:2,topic:2doc:3,topic:2doc:4,topic:1doc:5,topic:1doc:6,topic:1doc:7,topic:0

测试结果分析,结果简直让我惊喜加Superise呀,乌拉拉,突然,有一种谁无暴风劲雨时,守着云开见月明的感觉,对于主题来说,代表的前5个单词,其中存在一些无用的介词,应该作为截止词的,但因为没有对其进行处理。对于分类结果来说,居然正确,很surprise。
采用TF-IDF来进行测试,测试结果如下:

TOPIC:1syrian potential preparations chemical attackTOPIC:2global salahuddin terrorist declares clickTOPIC:3warns syria white house servesdoc:0,topic:0doc:1,topic:2doc:2,topic:0doc:3,topic:0doc:4,topic:2doc:5,topic:1doc:6,topic:1doc:7,topic:0

测试结果分析:TF-IDF的结果并不是特别好,但从主题来说是,其单词是有效的,因为,均是有意义的单词啊,摊手中,稍有点无语,,没关系,,科研的道路总是曲曲折折,作为一个内心戏丰富的猪精女孩,还在科研的边边上,就深谙科研之路,,有没有,,,内心戏丰富,,哈哈,我们重新来分析问题,为啥呢。我猜测,最大的可能性在于因为是短文本,而且数据量极少,所以,主题识别总是失败呀,没关系,再接再励,,继续进行测试。然后分析,中间得到的一些细节的信息,看是否是其失败的根源。
在其中的细节问题:因为,在利用LDA拟合的时候,只能处理整形的矩阵,对于TF-IDF的文档-单词矩阵而言,是值处于0-1之间的小数,所以使用LDA时会报错,然后对其乘以100取整处理的,是否在这个地方会有影响呢~~呜呜,待我测试一番。将100替换为10.。。果然,,,出来效果了。

TOPIC:1love syriacrisis life member needTOPIC:2preparations chemical attack white syrianTOPIC:3terrorist global salahuddin declares indiadoc:0,topic:1doc:1,topic:1doc:2,topic:1doc:3,topic:1doc:4,topic:2doc:5,topic:2doc:6,topic:2doc:7,topic:0

等等,,科研嘛~~总是还是要尝试一下的,我把乘以的这个值换成1000,再让臣妾试一下呐,,希望出现我自己期待的结果。。

TOPIC:1love active syed jonah eyesTOPIC:2attack preparations chemical white houseTOPIC:3global salahuddin terrorist declares clickdoc:0,topic:1doc:1,topic:1doc:2,topic:1doc:3,topic:1doc:4,topic:0doc:5,topic:2doc:6,topic:2doc:7,topic:0

事实证明,LDA拟合的效果,与输入的矩阵的大小无关系,还是与数值之间的区分度有关系啊,,,不信,不信, 我再尝试一下。好吧,这个一定不是最优的值,最优的值还是10,,那我换回去吧。至于原因呢,待我慢慢研究一下,再来解决。
此时TF-IDF得到了好的解决。。。。
好的解决真的是好的嘛,我持怀疑态度,至于怎么证明自己,未知,菜鸡,我也原谅自己好不了~~做着开心就好,这是我的大原则。
下一步,是实现gensim版本的LDA了。

原创粉丝点击