机器学习(周志华) 参考答案 第十四章 概率图模型 14.9

机器学习(周志华西瓜书) 参考答案 总目录

机器学习(周志华) 参考答案 第十四章 概率图模型


    拖了好几个月,现在越来越懒了,于是放弃了自己写个LDA的想法,使用现成的GibbsLDA++0.2

9.从网上下载或者自己实现 LDA ,分析《天龙八部》中每10回的话题演变情况。
由于对《天龙八部》并不怎么熟悉,所以选择了《射雕英雄传》,毕竟小说看了好几遍。
射雕英雄传共40章,按每5章作为一个文档,共8个文档。
全部输入输出文档
VS2015仲GibbsLDA++0.2工程压缩包

步骤一:分词
中文分词一直是个困难的任务,一本射雕好几十万字,如果手动去保留所有名词,那好几天就没了。而现成的中文分词软件并不能很好的划分词语,但也没得办法,分词分的怪怪的也只能用了。
这里选择的是评价较好的 BosonNLP 分词软件,官网是http://bosonnlp.com/dev/center
只需要注册下就能每天使用500次的关键词提取,同时获得该关键词的频率,具体操作方法请看使用手册。
(理论上用它的分词与词性提取效果更好,分词后仅保留名词即可,但是这样会有2万左右的词汇,一是词汇大量重复,和郭靖相关的就重复了300次[郭靖说,郭靖笑,郭靖冲,次日郭靖…],二是软件跑着就跪了,所以这里用关键词替代)

官网提供的py关键词提取代码,稍微修改下适应这道题需求:

from __future__ import print_function, unicode_literals
import json
import requests


KEYWORDS_URL = 'http://api.bosonnlp.com/keywords/analysis'

for i in range(1, 9):

    filename=(r'C:\Users\icefire\Desktop\txt5\0%02d.txt'%(i))
    print ('处理%s'%(filename))

    input_file = open(filename)
    text = input_file.read( )
    input_file.close()

    params = {'top_k': 300}
    data = json.dumps(text)
    headers = {'X-Token': '你的密钥,在控制台最下方'}
    resp = requests.post(KEYWORDS_URL, headers=headers, params=params, data=data.encode('utf-8'))

    filename=(r'C:\Users\icefire\Desktop\txt5\word_0%02d.txt'%(i))
    print ('输出%s\n'%(filename))

    output_file=open(filename,'w')   
    for weight, word in resp.json():
        output_file.write('%.0f %s\n'%(weight*weight*10000, word))
    output_file.close()

这里每个文档生成300个关键词(有点少,毕竟5章那么多字,但是由于分词的效果也一般般,就没设置太大的数目),由于所有关键词的频率的平方和为1,所以对词频做平方和操作,并乘上10000,作为该关键词的频数。

步骤二:生成用于 GibbsLDA++0.2 的文档:
这个步骤比较简单,由于LDA并不关心文档中每个词的顺序,所以仅需对每个关键词重复复制频数次就行。
最终输入的TEXT,第一行是文档的总数n,接下来的n行每行代表一个文档,文档中的每个词用空格隔开

filename1=(r'C:\Users\icefire\Desktop\txt5\text.txt')

output_file=open(filename1,'w')
output_file.write('8\n')
for i in range(1, 9):
    str=''
    filename=(r'C:\Users\icefire\Desktop\txt5\word_0%02d.txt'%(i))
    print ('处理%s'%(filename))

    input_file = open(filename)

    for line in input_file.readlines():  
        num,tstr=line.split();
        num=int(num)
        for j in range(1, num):
            str += (tstr+' ')
    input_file.close()
    output_file.write(str+'\n')

print ('输出%s\n'%(filename1))
output_file.close()

步骤三:运行 GibbsLDA++0.2
我这里用的是 VS2015 编译了 GibbsLDA++0.2 ,输入参数中, α,β 采用默认值,话题数为15,每个话题关键词为50,没迭代500次保存一次结果,最大迭代次数2000次,得到结果如下。

步骤四:结果分析
先放题目要求的结果,每个文档所对应的话题演变(保存在.theta文件仲)

01234567891011121314
0.0010.186 0.803 0.00040.00040.00070.00070.00040.00060.00060.00080.00070.00050.0010.0008
0.0010.1600.0020.00070.0010.00030.0010.00090.0030.0010.0030.0040.001 0.814 0.001
0.00090.1240.0020.00070.0070.0010.0020.0010.003 0.828 0.0020.0010.0060.0140.001
0.0040.0880.00070.0050.001 0.877 0.0030.0030.00080.0060.0010.0020.0020.00050.001
0.0020.1560.0004 0.769 0.0020.0200.0030.0030.0010.0130.0080.00070.0020.010.002
0.0010.1280.00060.0050.0020.00090.0020.0020.0010.001 0.844 0.0010.0020.00060.003
0.0020.1490.00090.007 0.780 0.0060.0010.0010.0020.0030.0350.0020.0030.0010.0009
0.813 0.1080.00090.0060.0240.0210.0020.0010.0010.0010.0130.00090.0010.0020.0005

横坐标表示15个话题,纵坐标表示8个文档

文档一:剧情从开头到郭靖降伏小红马为止,可以从表中看出该段最主要的话题是话题2。
话题2主要词:

概率概率概率概率概率
柯镇0.130330郭靖0.104801丘处机0.081499杨铁心0.053299韩小莹0.035488
朱聪0.033262蒙古0.028660铁木真0.028364段天德0.026286江南0.023169
贫道0.021833完颜洪烈0.018271道士0.015599喝道0.014115张阿生0.013818
郭啸天0.012482韩宝0.0107010.010553铜缸0.010404李萍0.009662
金发0.0089200.008475兄弟0.008178武官0.007584丘处机道0.006694
只见0.006694焦木0.006100陈玄风0.006100颜烈0.006100梅超风0.006100
完颜洪熙0.005210敌人0.004913官兵0.004913华筝0.004764王罕0.004764
马背0.004616军士0.004468临安0.004319拖雷0.004171孩子0.004171
0.003874桑昆0.0038740.003429韩宝驹0.0032800.003280
地下0.003132大哥0.0031320.0031320.003132铁木真道0.002983

柯镇恶在这里的概率是超过郭靖的,因为在前5章一大部分是在江南发生的事,后来七怪去了蒙古才找到郭靖,这里的词汇主要是江南和蒙古出现人物的人名。

文档二:剧情从七怪发现郭靖内功突增到王府梅超风被黄蓉胁迫帮助郭靖。该段最主要的话题是话题13。
话题2主要词:

概率概率概率概率概率
郭靖0.411307师父0.203639黄蓉0.043272梅超风0.024810师哥0.024136
公子0.021306王处一0.014972彭连虎0.010390柯镇0.009986完颜康0.009851
喝道0.009312功夫0.0090430.009043内功0.007021穆易0.006482
通天0.005673众人0.0052690.005000少年0.004730侯通海0.004730
梁子0.004595桃花岛0.004595铁木真0.004461小子0.004461王妃0.004191
小王0.004191朱聪0.004056说道0.003922贫道0.003922完颜洪烈0.003787
武功0.003652马钰0.003652比武0.003652弟子0.003517只见0.003383
蒙古0.003383杨铁心0.0032480.002843桑昆0.002843江南0.002439
左手0.002170少女0.002170师弟0.002035黄蓉道0.002035管家0.001900
手腕0.001765札木合0.001765女子0.001765华筝0.001496王爷0.001361

该话题依然包含了部分蒙古的词汇,但是大部分都排在了后面。武功,功力等词排在最常出现的几个人名之后。

文档三:剧情从王府梅超风帮助郭靖到宝应郭靖黄蓉救出程瑶迦。该段最主要的话题是话题9。
话题9主要词:

概率概率概率概率概率
郭靖0.231838黄蓉0.229868洪七公0.060563梅超风0.057411穆念慈0.043095
师父0.032981爹爹0.029960武功0.022473陆庄0.018927陆冠英0.016957
说道0.012491完颜康0.011703丘处机0.010652喝道0.010521彭连虎0.010258
药师0.009207裘千仞0.008551黄蓉道0.0081570.007763欧阳克0.007237
朱聪0.005661江南0.0053980.0052670.004610功夫0.003954
0.003691梁子0.003691弟子0.003297柯镇0.0031650.003034
郭靖道0.003034桃花岛0.002903蓉儿0.002903晚辈0.002771右手0.002640
0.002640拳法0.002509老人家0.002509陆乘风0.0023770.002377
小子0.002377左手0.002246归云庄0.002246老前辈0.001983亢龙有悔0.001852
杨铁心0.001721通天0.001721登时0.001721问道0.001458立时0.001458

该段主要剧情在于洪七公教郭靖掌法以及归云庄,到这里大概能归纳出该LDA算法将每个段落主要名词来划分话题。

最后再贴一段:
文档6:剧情从牛家村黄药师大战全真七子开始到瑛姑找一灯大师报仇结束。该段最主要的话题是话题10。
话题10主要词:

概率概率概率概率概率
黄蓉0.384576郭靖0.276421裘千仞0.058391药师0.028034杨康0.027174
丐帮0.019800师父0.018325书生0.016358黄蓉笑道0.009107黄蓉道0.008370
蓉儿0.007264爹爹0.006526瑛姑0.006157农夫0.005912弟子0.005789
0.005543老帮0.0054200.004683桃花岛0.003699洪七公0.003576
帮主0.003576郭靖道0.003208铁掌帮0.002716哥哥0.002716简长老0.002593
段皇爷0.002470群丐0.002347功夫0.002225洪帮主0.0021020.001856
0.001733彭长老0.001733娃娃0.001610大师0.001610欧阳锋0.001610
真经0.0014870.001364立时0.001364梅超风0.001364点头0.001364
兄弟0.001241姑娘0.001118裘千丈0.001118靖蓉二人0.000996渔樵耕读0.000996
双手0.000996软猬甲0.000996啊哟0.000873竹杖0.000873竹棒0.000873

该话题中的主要词都是在丐帮,铁掌峰和湘西一行的人物名词。

到这里还是有些疑问的,感觉这样为每段归纳话题的意义并不大,因为仅仅是将每段关键词又重新拿了出来作为话题。如果分词后先将这些词归进行话题分类,再对文档进行话题归纳,这样做是不是更好呢?

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值