机器学习(周志华西瓜书) 参考答案 总目录
机器学习(周志华) 参考答案 第十四章 概率图模型
拖了好几个月,现在越来越懒了,于是放弃了自己写个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 |
该话题中的主要词都是在丐帮,铁掌峰和湘西一行的人物名词。
到这里还是有些疑问的,感觉这样为每段归纳话题的意义并不大,因为仅仅是将每段关键词又重新拿了出来作为话题。如果分词后先将这些词归进行话题分类,再对文档进行话题归纳,这样做是不是更好呢?