Gensim-LDA实践

本文利用gensim进行LDA主题模型实验,第一部分是基于前文的wiki语料,第二部分是基于Sogou新闻语料。

1. 基于wiki语料的LDA实验

上一文得到了wiki纯文本已分词语料 wiki.zh.seg.utf.txt,去停止词后可进行LDA实验。

import codecs
from gensim.models import LdaModel
from gensim.corpora import Dictionary

train = []
stopwords = codecs.open(‘stopwords.txt‘,‘r‘,encoding=‘utf8‘).readlines()stopwords = [ w.strip() for w in stopwords ]
fp = codecs.open(‘wiki.zh.seg.utf.txt‘,‘r‘,encoding=‘utf8‘)
for line in fp:
    line = line.split()
    train.append([ w for w in line if w not in stopwords ])

dictionary = corpora.Dictionary(train)
corpus = [ dictionary.doc2bow(text) for text in train ]
lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=100)

同时gensim也提供了对wiki压缩包直接进行抽取并保存为稀疏矩阵的脚本 make_wiki,可在bash运行下面命令查看用法。

python -m gensim.scripts.make_wiki
#USAGE: make_wiki.py WIKI_XML_DUMP OUTPUT_PREFIX [VOCABULARY_SIZE]
python -m gensim.scripts.make_wiki zhwiki-latest-pages-articles.xml.bz2 zhwiki

运行时间比较久,具体情况可以看gensim官网,结果如下,mm后缀表示Matrix Market格式保存的稀疏矩阵:

-rw-r--r-- 1 chenbingjin data 172M  7月  1 12:10 zhwiki_bow.mm
-rw-r--r-- 1 chenbingjin data 1.3M  7月  1 12:10 zhwiki_bow.mm.index
-rw-r--r-- 1 chenbingjin data 333M  7月  1 12:16 zhwiki_tfidf.mm
-rw-r--r-- 1 chenbingjin data 1.3M  7月  1 12:16 zhwiki_tfidf.mm.index
-rw-r--r-- 1 chenbingjin data 1.9M  7月  1 12:10 zhwiki_wordids.txt

利用 tfidf.mm 及wordids.txt 训练LDA模型

# -*- coding: utf-8 -*-
from gensim import corpora, models

# 语料导入
id2word = corpora.Dictionary.load_from_text(‘zhwiki_wordids.txt‘)
mm = corpora.MmCorpus(‘zhwiki_tfidf.mm‘)

# 模型训练,耗时28m
lda = models.ldamodel.LdaModel(corpus=mm, id2word=id2word, num_topics=100)

模型结果

训练过程指定参数 num_topics=100, 即训练100个主题,通过print_topics() 和print_topic() 可查看各个主题下的词分布,也可通过save/load 进行模型保存加载。

# 打印前20个topic的词分布
lda.print_topics(20)
# 打印id为20的topic的词分布
lda.print_topic(20)

#模型的保存/ 加载
lda.save(‘zhwiki_lda.model‘)
lda = models.ldamodel.LdaModel.load(‘zhwiki_lda.model‘)

对新文档,转换成bag-of-word后,可进行主题预测。

模型差别主要在于主题数的设置,以及语料本身,wiki语料是全领域语料,主题分布并不明显,而且这里使用的语料没有去停止词,得到的结果差强人意。

test_doc = list(jieba.cut(test_doc))    #新文档进行分词
doc_bow = id2word.doc2bow(test_doc)      #文档转换成bow
doc_lda = lda[doc_bow]                   #得到新文档的主题分布
#输出新文档的主题分布
print doc_lda
for topic in doc_lda:
    print "%s\t%f\n"%(lda.print_topic(topic[0]), topic[1])

2. 基于Sogou新闻语料的LDA实验

Sogou实验室提供了很多中文语料的下载, 全网新闻数据(SogouCA),来自若干新闻站点2012年6月—7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据,提供URL和正文信息。

这里使用的是2008精简版(一个月数据, 437MB)

数据转码处理,由于数据是Ascii文件,容易出现乱码情况,使用iconv命令转成utf8,由于XML文件处理时需要有顶级tag,这里使用sed 命令在文件的首行前插入<root>,在尾行后插入</root>

#!/bin/bash

#将文件夹下的Ascii文件转成utf8
#Usage: ./iconv_encode.sh indir outdir
#@chenbingjin 2016-07-01

function conv_encode() {
    all=`ls ${indir}`
    for ffile in ${all}
    do
        ifile="${indir}${ffile}"
        ofile="${outdir}${ffile}"
        echo "iconv $ifile to $ofile"
        iconv -c -f gb2312 -t utf8 "$ifile" > "$ofile"
        sed -i ‘1i <root>‘ "$ofile"
        sed -i ‘$a </root>‘ "$ofile"
    done
}

if [ $# -ne 2 ]; then
    echo "Usage: ./iconv_encode.sh indir outdir"
    exit 1
fi

indir=$1
outdir=$2

if [ ! -d $outdir ]; then
    echo "mkdir ${outdir}"
    mkdir $outdir
fi

time conv_encode

iconv_encode.sh

总共128个文件,存放在Sogou_data/ 文件夹下,使用iconv_encode.sh 进行处理,新文件保存在out文件夹,结果如下:

$ ./iconv_encode.sh Sogou_data/ out/

mkdir out/
iconv Sogou_data/news.allsites.010806.txt to out/news.allsites.010806.txt
iconv Sogou_data/news.allsites.020806.txt to out/news.allsites.020806.txt
iconv Sogou_data/news.allsites.030806.txt to out/news.allsites.030806.txt
iconv Sogou_data/news.allsites.040806.txt to out/news.allsites.040806.txt
......

real    0m27.255s
user    0m6.720s
sys    0m8.924s

接下来需要对xml格式的数据进行预处理,这里使用lxml.etree,lxm 是Python的一个html/xml解析并建立dom的库, 比python自带的XML解析快。

防止出现异常 XMLSyntaxError: internal error: Huge input lookup ,设置XMLParser参数 huge_tree=True,详细见代码:

# -*- coding: utf-8 -*-
import os
import codecs
import logging
from lxml import etree
logging.basicConfig(format=‘%(asctime)s : %(levelname)s : %(message)s‘, level=logging.INFO)

‘‘‘
Sogou新闻语料预处理
@chenbingjin 2016-07-01
‘‘‘

train = []
# huge_tree=True, 防止文件过大时出错 XMLSyntaxError: internal error: Huge input lookup
parser = etree.XMLParser(encoding=‘utf8‘,huge_tree=True)

def load_data(dirname):
    global train
    files = os.listdir(dirname)
    for fi in files:
        logging.info("deal with "+fi)
        text = codecs.open(dirname+fi, ‘r‘, encoding=‘utf8‘).read()
        # xml自身问题,存在&符号容易报错, 用&amp;代替
        text = text.replace(‘&‘, ‘&amp;‘)
        # 解析xml,提取新闻标题及内容
        root = etree.fromstring(text, parser=parser)
        docs = root.findall(‘doc‘)
        for doc in docs:
            tmp = ""
            for chi in doc.getchildren():
                if chi.tag == "contenttitle" or chi.tag == "content":
                    if chi.text != None and chi.text != "":
                        tmp += chi.text
            if tmp != "":
                train.append(tmp)

preprocess.py

得到train训练语料后,分词并去停止词后,便可以进行LDA实验

from gensim.corpora import Dictionary
from gensim.models import LdaModel

stopwords = codecs.open(‘stopwords.txt‘,‘r‘,encoding=‘utf8‘).readlines()stopwords = [ w.strip() for w in stopwords ]
train_set = []
for line in train:
    line = list(jieba.cut(line))    train_set.append([ w for w in line if w not in stopwords ])

# 构建训练语料
dictionary = Dictionary(train_set)
corpus = [ dictionary.doc2bow(text) for text in train_set]

# lda模型训练
lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=20)
lda.print_topics(20)

实验结果:训练时间久,可以使用 ldamulticore ,整体效果还不错,可以看出08年新闻主题主要是奥运,地震,经济等

得到的LDA模型可用于主题预测,给定新的文档预测文档主题分布,可用于分类。训练文档中每个词会分配一个主题,有paper就将这种主题信息做Topic Word Embedding,一定程度上解决一词多义问题。

参考

1. gensim:Experiments on the English Wikipedia

2. Sogou:全网新闻数据

时间: 2024-10-03 19:56:51

Gensim-LDA实践的相关文章

小象学院Python机器学习和算法高级版视频教程

下载地址:百度网盘下载 ├─00.课程介绍│      <机器学习·升级版II>常见问题FAQ - 小象问答-hadoop,spark,storm,R,hi.jpg│      <机器学习>升级版II,11月4日开课 - 小象学院 - 中国最专业的Hadoop,Spark大数据.jpg│      ├─01.机器学习的数学基础1 - 数学分析│  │  01 数学分析与概率论.mp4│  │  1.数学分析与概率论.pdf│  │  笔记.jpg│  │  │  └─参考文献资料│

LDA工程实践之算法篇之(一)算法实现正确性验证(转)

研究生二年级实习(2010年5月)开始,一直跟着王益(yiwang)和靳志辉(rickjin)学习LDA,包括对算法的理解.并行化和应用等等.毕业后进入了腾讯公司,也一直在从事相关工作,后边还在yiwang带领下,与孙振龙.严浩等一起实现了一套大规模并行的LDA训练系统——Peacock.受rick影响,决定把自己对LDA工程实践方面的一些理解整理出来,分享给大家,其中可能有一些疏漏和错误,还请批评指正. Rickjin在<LDA数学八卦>[1]一文中已经对LDA的数学模型以及基本算法介绍得比

动手实践用LDA模型计算两篇英文文档相似度

知道原理的同学这部分可以略过直接看实践部分 什么是TD-IDF? 构造文档模型 我们这里使用空间向量模型来数据化文档内容:向量空间模型中将文档表达为一个矢量. 用特征向量(T1,W1:T2,W2:T3, W3:…:Tn,Wn)表示文档. Ti是词条项,Wi是Ti在文档中的重要程度, 即将文档看作是由一组相互独立的词条组构成,把T1,T2 …,Tn看成一个n 维坐标系中的坐标轴,对于每一词条,根据其重要程度赋以一定的权值Wi,作为对应坐标轴的坐标值. 权重Wi用词频表示,词频分为绝对词频和相对词频

词向量实践(gensim)

词向量训练步骤: 分词并去停用词 词频过滤 训练 项目完整地址:https://github.com/cyandn/practice/tree/master/Word2Vec gensim中Word2Vec参数解释: 主要参数介绍如下: sentences:我们要分析的语料,可以是一个列表,或者从文件中遍历读出(word2vec.LineSentence(filename) ). size:词向量的维度,默认值是100.这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M

降维实践(PCA,LDA)

17 降维简介 当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的.常见的降维方法除了以上提到的基于L1惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型.PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性:而LDA是为了让映射后的样本有最好的分类性能.所

LDA

[python] LDA处理文档主题分布代码入门笔记 标签: LDApython主题分布入门介绍代码分析 2016-03-09 03:23 9905人阅读 评论(9) 收藏 举报  分类: 机器学习(20)  知识图谱(14)  版权声明:本文为博主原创文章,转载请注明CSDN博客源地址!共同学习,一起进步~ 目录(?)[+] 以前只知道LDA是个好东西,但自己并没有真正去使用过.同时,关于它的文章也非常之多,推荐大家阅读书籍<LDA漫游指南>,最近自己在学习文档主题分布和实体对齐中也尝试使用

使用gensim和sklearn搭建一个文本分类器(一):文档向量化

总的来讲,一个完整的文本分类器主要由两个阶段,或者说两个部分组成:一是将文本向量化,将一个字符串转化成向量形式:二是传统的分类器,包括线性分类器,SVM, 神经网络分类器等等. 之前看的THUCTC的技术栈是使用 tf-idf 来进行文本向量化,使用卡方校验(chi-square)来降低向量维度,使用liblinear(采用线性核的svm) 来进行分类.而这里所述的文本分类器,使用lsi (latent semantic analysis, 隐性语义分析) 来进行向量化, 不需要降维, 因为可以

Spark2.0机器学习系列之8: 聚类分析(K-Means,Bisecting K-Means,LDA,高斯混合模型)

在写这篇文章之前,先说一些题外话. 许多机器学习算法(如后面将要提到的LDA)涉及的数学知识太多,前前后后一大堆,理解起来不是那么容易. 面对复杂的机器学习模型,尤其是涉及大量数学知识的模型,我们往往要花费大量的时间和精力去推导数学算法(公式),如果过分沉湎于此会忽略了很多背后也许更重要的东西,正所谓只见树木,不见森林,而这是缺乏远见,是迷茫的. 我们需要深入理解模型背后的逻辑和所蕴含的或简或繁的思想.某些思想甚至可能是很美的思想,很伟大的思想.这些理解,使得面对复杂的问题时候,面对陌生问题时,

KNN PCA LDA

http://blog.csdn.net/scyscyao/article/details/5987581 这学期选了门模式识别的课.发现最常见的一种情况就是,书上写的老师ppt上写的都看不懂,然后绕了一大圈去自己查资料理解,回头看看发现,Ah-ha,原来本质的原理那么简单,自己一开始只不过被那些看似formidable的细节吓到了.所以在这里把自己所学的一些点记录下来,供备忘,也供参考. 1. K-Nearest Neighbor K-NN可以说是一种最直接的用来分类未知数据的方法.基本通过下

技术培训 | 大数据分析处理与用户画像实践

孔淼:大数据分析处理与用户画像实践 直播内容如下: 今天咱们就来闲聊下我过去接触过的数据分析领域,因为我是连续创业者,所以我更多的注意力还是聚焦在解决问题和业务场景上.如果把我在数据分析的经验进行划分的话,刚好就是我所经历的两次创业阶段,第一阶段是"第三方数据分析",第二阶段是"第一方数据分析".所以今天咱们就从这两点来谈谈数据分析. 第三方数据分析 先聊聊"第三方数据分析",这个主要结缘于我给开复做微博数据挖掘. 起因:给开复做"微博