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

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

  • http://blog.csdn.net/icefire_tyh/article/details/52064910

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

  • http://blog.csdn.net/icefire_tyh/article/details/53509879

    拖了好几个月,现在越来越懒了,于是放弃了自己写个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文件仲)

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
0.001 0.186 0.803 0.0004 0.0004 0.0007 0.0007 0.0004 0.0006 0.0006 0.0008 0.0007 0.0005 0.001 0.0008
0.001 0.160 0.002 0.0007 0.001 0.0003 0.001 0.0009 0.003 0.001 0.003 0.004 0.001 0.814 0.001
0.0009 0.124 0.002 0.0007 0.007 0.001 0.002 0.001 0.003 0.828 0.002 0.001 0.006 0.014 0.001
0.004 0.088 0.0007 0.005 0.001 0.877 0.003 0.003 0.0008 0.006 0.001 0.002 0.002 0.0005 0.001
0.002 0.156 0.0004 0.769 0.002 0.020 0.003 0.003 0.001 0.013 0.008 0.0007 0.002 0.01 0.002
0.001 0.128 0.0006 0.005 0.002 0.0009 0.002 0.002 0.001 0.001 0.844 0.001 0.002 0.0006 0.003
0.002 0.149 0.0009 0.007 0.780 0.006 0.001 0.001 0.002 0.003 0.035 0.002 0.003 0.001 0.0009
0.813 0.108 0.0009 0.006 0.024 0.021 0.002 0.001 0.001 0.001 0.013 0.0009 0.001 0.002 0.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.010701 0.010553 铜缸 0.010404 李萍 0.009662
金发 0.008920 0.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.003874 0.003429 韩宝驹 0.003280 0.003280
地下 0.003132 大哥 0.003132 0.003132 0.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.009043 0.009043 内功 0.007021 穆易 0.006482
通天 0.005673 众人 0.005269 0.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.003248 0.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.008157 0.007763 欧阳克 0.007237
朱聪 0.005661 江南 0.005398 0.005267 0.004610 功夫 0.003954
0.003691 梁子 0.003691 弟子 0.003297 柯镇 0.003165 0.003034
郭靖道 0.003034 桃花岛 0.002903 蓉儿 0.002903 晚辈 0.002771 右手 0.002640
0.002640 拳法 0.002509 老人家 0.002509 陆乘风 0.002377 0.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.005420 0.004683 桃花岛 0.003699 洪七公 0.003576
帮主 0.003576 郭靖道 0.003208 铁掌帮 0.002716 哥哥 0.002716 简长老 0.002593
段皇爷 0.002470 群丐 0.002347 功夫 0.002225 洪帮主 0.002102 0.001856
0.001733 彭长老 0.001733 娃娃 0.001610 大师 0.001610 欧阳锋 0.001610
真经 0.001487 0.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

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

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

你可能感兴趣的:(机器学习(周志华西瓜书),机器学习)