AI数据模型,数据建模与可视化
本文利用gensim进行LDA主题模型实验。第一部分基于上面提到的维基资料,第二部分基于搜狗新闻资料。
基于wiki数据的LDA实验
在上一篇文章中,我们得到了与wiki纯文本的单词分开编写的词汇wiki.zh.seg.utf.txt,可以用于停顿后的LDA实验。
importcodecsfromgensim . modelsimportldamodelfromgensim . corporaimportdictionary
火车=[]
stop words=codecs . open( stop words . txt , r ,encoding=utf8 )。阅读行) )
stop words=[w . strip(]for winstop words
FP=codecs . open(wiki . zh . seg . utf . txt 、r 、encoding= utf8 )for line infp:
line=line.split(
train . append([wforwinlineifwnotinstopwords]
字典=语料库.字典(训练)
corpus=[dictionary . doc 2 bow(text)for text intra in]
LDA=LDAmodel(Corpus=Corpus,id2word=dictionary,num_topics=100))))))))))).
Gensim还提供了脚本make_wiki,用于直接提取wiki压缩包,保存为稀疏矩阵。您可以在bash中运行以下命令来了解如何使用它:
python-mgen sim . scripts . make _ wiki
#用法:make _ wiki . py wiki _ XML _ dump output _ prefix[词汇_大小]
python-mgen sim . scripts . make _ wiki zhiki-最新-页面-文章。XML.bz2zh wiki
执行起来需要很长时间。详情请访问gensim官方网站。因此,mm后缀表示以矩阵市场格式保存的稀疏矩阵。
-rw-r-r-1陈静金发GJINData 172M七月一日12336010 zh Wiki _ bow . mm-RW-R-R-1陈静金发GJINData 1.37M七月一日12336010zhwh静金发GJINData 333M七月一日12 Wiki _ tfidf.mm-rw-r-r-1陈静金发gjindata 1.3m七月一日123333 m
用tfidf.mm和wordids.txt训练LDA模型
#-*-编码:utf-8-*-
来自gensim importcorpora,模型#词汇导入
id2 word=corpora . dictionary . load _ from _ text( zh wiki _ word ids . txt ))))))))))))))).
MM=corporate . MM Corpus(zh wiki _ tfi df . MM)模特培训,时间28m
LDA=模特。LDA模型。LDA模型(corpus=mm,id2word=id2word,num_topics=100)))).
模型结果
在训练过程中,您将指定参数num_topics=100,即训练100个主题。Print_topics(和print _ topics)允许您查看每个主题下的单词分布,以及在save/load中保存和加载模型。
#打印前20个主题的单词分布
LDA.print_topics(20) #打印id为20的主题的单词分布
LDA.print_topic(#保存/加载模型
LDA.save(zhwiki_LDA.model)).
LDA=模特。LDA模型。LDA model.load (zh wiki _ LDA.model))。
对于新文档,将其转换为词袋可以预测主题。
模式的差异主要在于话题数量的设置和词汇本身。Wiki的词汇是全局词汇,话题分布不明显,这里用的词汇不能停词,导致效果不好。
test _ doc=list(jieba . cut)test _ doc)#单独写一个新文档。
doc _ bow=id 2 word . doc 2 bow(test _ doc)#将文档转换为bow
doc_lda=lda[doc_
Bow] #获取新文档的主题分布#输出新文档的主题分布。
print doc _ LDA for topic indoc _ LDA:print % s t % f n %(LDA . print _ topic(topic[0]),topic[1])
2.基于搜狗新闻语料库的LDA实验
搜狗实验室提供2012年6-7月期间多个新闻网站的多种中文素材、全网新闻数据(SogouCA)、国内、国际、体育、社交、娱乐等18个频道的新闻数据下载,提供网址和文字信息。
对于数据转码,由于数据是Ascii文件,容易出现乱码。iconv命令用于将其转换为utf8。因为XML文件在处理时需要顶级标记,所以这里使用sed命令将其插入到文件的第一行之前和最后一行之后。
#!/沉默的金毛猎犬/巴什
#将文件夹中的Ascii文件转换为utf8
#用法:/iconv_encode.xdddtn outdir
# @陈无声金毛gjin2016-07-01
functionconv_encode() {
all=` ls $ { indir } ` for ffile in $ { all } doi file= $ { indir } $ { ffile } of file= $ { outdir } $ { ffile }
echo iconv $ifile到$ ofile iconv-c-f GB 2312-t utf8 $ ifile $ ofile
sed -i 1i $ofile
sed -i $a $ofile
done } if[$ #-ne 2];然后
“echo”的用法:/iconv _ encode . sh indir outdir exit 1
文件目录=$ 1输出目录=$2
如果[!-d $ outdir];然后
回显" mkdir ${outdir} "
mkdir$outdirfi
时间卷积神经编码
iconv_encode.sh
总共128个文件,存放在搜狗_数据/文件夹下,使用iconv_encode.sh进行处理,新文件保存在在外文件夹,结果如下:
$ ./iconv_encode.sh搜狗_data/out/
mkdir输出/iconv搜狗_data/news.allsites.010806.txt至out/news.allsites.010806.txt
编码转换搜狗_data/news.allsites.020806.txt至out/news.allsites.020806.txt
编码转换搜狗_data/news.allsites.030806.txt到out/news.allsites.030806.txt
编码转换搜狗_data/news.allsites.040806.txt到out/news.allsites.040806.txt
.
real 0m27.255s
用户0m6.720s
sys 0m8.924s
接下来需要对可扩展标记语言格式的数据进行预处理,这里使用lxml.etree,lxm是计算机编程语言的一个html/xml解析并建立数字正射影像图的库,比大蟒自带的可扩展置标语言解析快。
#-*-编码:utf-8 -*-
来自lxml导入树的importsimportcodecsimportlogging
伐木。基本配置(format= %(ASC time)s:%(级别名)s:%(消息)s ,级别=日志记录.信息)""搜狗新闻语料预处理
@陈默默的金毛gjin 2016-07-01 train=[]# huge _ tree=True,防止文件过大时出错XMLSyntaxError:内部错误:巨大的输入查找
parser=etree .XMLParser(encoding=utf8 ,huge _ tree=True)de load _ data(dirname):全局火车
文件=操作系统。文件的列表目录(目录名):
logging.info(处理fi)
text=codecs.open(dirname fi, r ,encoding=utf8 ).read()#xml自身问题,存在符号容易报错,用代替
text=text.replace( , )#解析xml,提取新闻标题及内容
root=etree.fromstring(text,parser=parser)
docs=root.findall(doc )用于文档文档:
tmp=
为了印度支那。get children():如果池。tag==内容标题或chi.tag==content:if chi.text!=无和chi.text!=:
tmp=chi.textif tmp!=:
训练.追加
预处理程序。巴拉圭
得到火车训练语料后,分词并去停止词后,便可以进行皱胃向左移实验
来自gensim . corpora importdictionary from
停止字=编解码器。开(停字。txt , r ,编码=utf8 ).读取行()
停止字=[w . strip()for w in stop words]
生产线内部的train _ set=[]:
line=list(jieba.cut(line))
火车_集合。追加([w for w in line if w not instop words])#构建训练语料
字典=字典(火车_集合)
语料库=【词典。doc 2 bow(text)for text intrain _ set]# LDA模型训练
lda=LdaModel(corpus=corpus,id2word=dictionary,num_topics=20)
lda.print_topics(20)
实验结果:训练时间久,可以使用ldamulticore,整体效果还不错,可以看出08年新闻主题主要是奥运,地震,经济等
得到的皱胃向左移模型可用于主题预测,给定新的文档预测文档主题分布,可用于分类。训练文档中每个词会分配一个主题,有纸就将这种主题信息做主题词嵌入,一定程度上解决一词多义问题。
参考
2.搜狗:全网新闻数据