Python实现的生成自我描述脚本分享(很有意思的程序)


Posted in Python onJuly 18, 2014

自我描述的语句指这样一种语句:它的内容就是对它本身的描述。(废话……)比如下面这句句子:

这是一段自我描述的语句,除了标点符号外,它共包含125个字符,其中33个“个”,29个“2”,5个“3”,3个“符”,3个“5”,2个“一”,2个“它”,2个“包”,2个“的”,2个“标”,2个“了”,2个“我”,2个“外”,2个“含”,2个“中”,2个“是”,2个“1”,2个“段”,2个“点”,2个“描”,2个“9”,2个“字”,2个“这”,2个“句”,2个“除”,2个“自”,2个“语”,2个“共”,2个“述”,2个“号”,2个“其”。

这句话是我用一段 Python 脚本生成的,生成原理大致如下:

1、给出一个模板,让句子的各个内容知道自己该出现在哪个部位;
2、根据当前信息,生成句子;
3、将当前句子作为输入,再次执行第 2 步的操作;
4、直到句子各部分内容的信息都正确。

简单来说,就是一个不断迭代修正的过程。

其中需要注意的是,每次迭代时应该尽量只改动一个地方,以免两处同时变化相互影响,造成死循环;另外,如果句子中有多处地方需要修正,尽量随机选取一处进行修正,而不要按一定顺序进行修正,同样是为了减少陷入死循环的风险。

不过,即使如此,某些情况下还是有可能陷入死循环,比如如果某一步得到了下面这样的句子:

这句很 2 的话包含 3 个“2”。

上面这句话明显是错误的,因为其中只有两个“2”。那么,我们把那个“3”改为“2”,是不是就对了呢?很容易发现,如果我们做了这样的改动之后,句子将变成:

这句很 2 的话包含 2 个“2”。

这时,句子中又包含三个“2”了。像这样的句子就似乎无法简单地改为正确的自我描述语句,因为无论如何改都会陷入死循环。

最后,我用来生成最上面的那句自我描述语句的 Python 脚本如下:

# -*- coding: utf-8 -*-

import random

class SelfDesc(object):

  ignore_chars = u",。“”"

  def __init__(self, template):

    self.template = template
    self.length = 0
    self.detail = ""
    self.content = ""
    self.chars = ""
    self.char_count = {}
    self.makeContent()
    self.char_count = self.getCharCount()
    self.getCharCount()
    self.makeContent()


  def __str__(self):

    return self.content


  def makeContent(self):

    self.makeDetail()
    self.content = self.template.replace(u"{length}", u"%d" % self.length)
      .replace(u"{detail}", self.detail)
    self.getChars()


  def getChars(self):

    chars = self.content
    for c in self.ignore_chars:
      chars = chars.replace(c, "")

    self.chars = chars
    return chars


  def getLength(self):

    self.length = len(self.chars)


  def getCharCount(self):

    d = {}
    for c in self.chars:
      if c in self.ignore_chars:
        continue
      d.setdefault(c, 0)
      d[c] += 1

    return d


  def makeDetail(self):

    d = self.char_count
    items = d.items()
    items.sort(key=lambda x: -x[1])

    s = []
    for c, n in items:
      s.append(u"%d个“%s”" % (n, c))

    self.detail = u",".join(s)


  def correct(self):

    print "-" * 50

    char_count = self.getCharCount()
    items = char_count.items()
    random.shuffle(items)
    for c, n in items:
      if n <= 1 and c in self.char_count:
        del self.char_count[c]
        continue

      if self.char_count.get(c) == n:
        continue
      else:
        self.char_count[c] = n
        return True

    else:
      len = self.length
      self.getLength()

      if len != self.length:
        return True

    return False


  def generate(self):

    icount = 0
    while self.correct():
      icount += 1
      self.makeContent()
      print u"#%d %s" % (icount, self)


def main():

  template = u"这是一段自我描述的语句,除了标点符号外,它共包含{length}个字符,其中{detail}。"
  sd = SelfDesc(template)
  sd.generate()
  print u"%s" % sd


if __name__ == "__main__":
  main()
Python 相关文章推荐
Python 过滤字符串的技巧,map与itertools.imap
Sep 06 Python
Python利用pyHook实现监听用户鼠标与键盘事件
Aug 21 Python
详解python中requirements.txt的一切
Mar 03 Python
详解Golang 与python中的字符串反转
Jul 21 Python
python实现音乐下载器
Apr 15 Python
如何用Python合并lmdb文件
Jul 02 Python
Django教程笔记之中间件middleware详解
Aug 01 Python
Python实现的多进程拷贝文件并显示百分比功能示例
Apr 09 Python
python批量处理txt文件的实例代码
Jan 13 Python
vscode配置anaconda3的方法步骤
Aug 08 Python
Python数据可视化常用4大绘图库原理详解
Oct 23 Python
Python四款GUI图形界面库介绍
Jun 05 Python
Python中使用 Selenium 实现网页截图实例
Jul 18 #Python
Python中使用PyHook监听鼠标和键盘事件实例
Jul 18 #Python
python中使用pyhook实现键盘监控的例子
Jul 18 #Python
python使用pyhook监控键盘并实现切换歌曲的功能
Jul 18 #Python
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
Jul 18 #Python
python采集博客中上传的QQ截图文件
Jul 18 #Python
Python下singleton模式的实现方法
Jul 16 #Python
You might like
修改Zend引擎实现PHP源码加密的原理及实践
2008/04/14 PHP
在PHP中使用curl_init函数的说明
2010/11/02 PHP
ThinkPHP中的三大自动简介
2014/08/22 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
js 数组克隆方法 小结
2010/03/20 Javascript
angularjs客户端实现压缩图片文件并上传实例
2015/07/06 Javascript
Jquery $when done then的用法详解
2016/05/20 Javascript
JS基础随笔(菜鸟必看篇)
2016/07/13 Javascript
微信小程序 LOL 英雄介绍开发实例
2016/09/30 Javascript
vue.js从安装到搭建过程详解
2017/03/17 Javascript
js数字滑动时钟的简单实现(示例讲解)
2017/08/14 Javascript
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
使用Angular CLI生成路由的方法
2018/03/24 Javascript
JavaScript继承定义与用法实践分析
2018/05/28 Javascript
详解性能更优越的小程序图片懒加载方式
2018/07/18 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
使用express来代理服务的方法
2019/06/21 Javascript
pyramid配置session的方法教程
2013/11/27 Python
Python字符串处理函数简明总结
2015/04/13 Python
python距离测量的方法
2018/03/06 Python
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
css3中检验表单的required,focus,valid和invalid样式
2014/02/21 HTML / CSS
YBF Beauty官网:美丽挚友,美国知名彩妆品牌
2020/11/22 全球购物
教师个人的自我评价分享
2014/01/02 职场文书
高一物理教学反思
2014/01/24 职场文书
护理专业大学生自我推荐信
2014/01/25 职场文书
观看《永远的雷锋》心得体会
2014/03/12 职场文书
优秀少先队工作者事迹材料
2014/05/13 职场文书
2014年小学辅导员工作总结
2014/12/23 职场文书
2015年“7.11”世界人口日宣传活动方案
2015/05/06 职场文书
复兴之路观后感3000字
2015/06/02 职场文书
回复函范文
2015/07/14 职场文书
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python
Python中的datetime包与time包包和模块详情
2022/02/28 Python