朴素贝叶斯写诗机器人

lishangyin.txt是诗词文件。诗分两种,一种是七言的,比如“相见时难别亦难,东风无力百花残”。一种是五言的,比如“八岁偷照镜,长眉已能画”。如下图

 LishangyinPre.py是数据预处理用的。由于笔者已经做了这一步,读者朋友们可以跳过。它的作用是生成两个文件words.txt和sample.txt。对于七言诗句,第一第二个字成一个词,第三第四个字成一个词,第五、第六、第七个字单独成词,所以七言诗句可以用5个词表示。对于五言诗句,每个字单独成词,所以五言诗句也是用5个词表示。比如“相见时难别亦难,东风无力百花残”可以切分为10个词“相见/时难/别/亦/难,东风/无力/百/花/残”,比如“八岁偷照镜,长眉已能画”可以切分为10个词“八/岁/偷/照/镜,长/眉/已/能/画”。然后给这些词赋予id。比如“相见”的id是1,“别难”的id是2。LishangyinPre.py的作用是遍历所有诗句,对每句诗切分出来的词赋予id,如果看到这个词已经被赋予过id,则跳过这个词(代码里用一个字典存储)。它将“id-词”对写进了文件words.txt里。LishangyinPre.py还做了一件事,它再次遍历所有诗句,将两句诗歌表示成了10个词的id序列,比如“相见时难别亦难,东风无力百花残”被换成了“1 2 3 4 5 6 7 8 9 10”,每个词用它的id换掉。将结果写进了文件sample.txt里(一行就表示了两句诗哦)。

 

 最后,最关键的就是写诗了!比如给定一个词,它的id=1,那么它的下一个词是什么呢?为了让读者更直观地理解,我写了一个sample2.txt和nbtest.py辅助讲解。sample2.txt里是这样的

 它有3行,也就是有6句诗(每行2句诗)。设每行的10个词的id分别是x1、x2、x3、x4、x5、x6、x7、x8、x9、x10。现在知道了x1,怎么预测它的下一个词x2?比如现在知道了x1=1,怎么根据这6句诗预测它的下一个词x2?朴素贝叶斯!

 如上图,其实x1等价于x6,x2等价于x7,都是1句诗里相同位置的词。那为什么这么麻烦,直接设5个变量就好了,为什么要设10个变量?是为了后面用x1预测x6,这样给一个开头词给机器人,机器人就能写很多诗句了。很多诗句的x1和x6是有关系的,比如“沧海月明珠有泪,蓝田日暖玉生烟。”中的“沧海”和“蓝田”都是地名。通过本诗句的开头词可以预测下一句诗句的开头词。
    所以上面一共有6个x1、6个x2。x1只能取1,4这2个值,x2只能取2,3,5这3个值。6句诗中有2句的x2=2,在这2句中有2句的x1=1。6句诗中有2句的x2=3,在这2句中有2句的x1=1。6句诗中有2句的x2=5,在这2句中有0句的x1=1。上面的公式都是后验概率的分子(含有拉普拉斯修正,关于拉普拉斯修正可以参考周志华的《机器学习》)。可以看到,x2最有可能取2或3,分子大小都是1/4。x2最不可能取5,分子大小是1/12。将这3个数归一化,就能得到后验概率:

       

nbtest.py、nb.py里计算后验概率的核心代码就是按照上面的思想写的。

 理解了nbtest.py就理解了nb.py。预测到x2之后,就用x2预测x3,再用x3预测x4,.......下面是笔者在nb.py中,让第一个词是“黄河”(id=2695),写的4句诗:

这样很容易写出藏头诗。当然,你也可以修改一下,用x5预测x4,接着用x4预测x3,......这样也可以实现写出藏尾诗。

完整项目:https://pan.baidu.com/s/1S_7_B0PrFx6KflJURjm9HA

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值