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实现类似ftp传输文件的网络程序示例
Apr 08 Python
Python中用format函数格式化字符串的用法
Apr 08 Python
Python中利用sqrt()方法进行平方根计算的教程
May 15 Python
Python的Django框架中消息通知的计数器实现教程
Jun 13 Python
利用python实现命令行有道词典的方法示例
Jan 31 Python
Python用threading实现多线程详解
Feb 03 Python
Python简单计算给定某一年的某一天是星期几示例
Jun 27 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
Jun 27 Python
python判断自身是否正在运行的方法
Aug 08 Python
Python环境Pillow( PIL )图像处理工具使用解析
Sep 12 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
Apr 03 Python
Selenium元素定位的30种方式(史上最全)
May 11 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
js下函数般调用正则的方法附代码
2008/06/22 PHP
PHP 变量定义和变量替换的方法
2009/07/30 PHP
从php核心代码分析require和include的区别
2011/01/02 PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
2015/03/04 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
原生javascript实现图片按钮切换
2015/01/12 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
nodejs如何获取时间戳与时间差
2016/08/03 NodeJs
javascript中this用法实例详解
2017/04/06 Javascript
微信小程序 侧滑删除(左滑删除)
2017/05/23 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
2017/08/24 Javascript
jQuery Migrate 插件用法实例详解
2019/05/22 jQuery
jquery实现直播弹幕效果
2019/11/28 jQuery
js实现轮播图效果 z-index实现轮播图
2020/01/17 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
Python学习笔记(二)基础语法
2014/06/06 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
浅谈pycharm下找不到sqlalchemy的问题
2018/12/03 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
Python实现字典按key或者value进行排序操作示例【sorted】
2019/05/03 Python
Python OpenCV视频截取并保存实现代码
2019/11/30 Python
python如何爬取网页中的文字
2020/07/28 Python
python中使用.py配置文件的方法详解
2020/11/23 Python
CSS实现雨滴动画效果的实例代码
2019/10/08 HTML / CSS
凯撒娱乐:Caesars Entertainment
2018/02/23 全球购物
为什么要使用servlet
2016/01/17 面试题
大学学习个人的自我评价
2014/02/18 职场文书
入党自传范文2015
2015/06/26 职场文书
欠条样本
2015/07/03 职场文书
董事长助理工作总结2015
2015/07/23 职场文书
实验心得体会范文
2016/01/25 职场文书
演讲稿:​快乐,从不抱怨开始!
2019/04/02 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书