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基于Tkinter实现的记事本实例
Jun 17 Python
PyQt 线程类 QThread使用详解
Jul 16 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
Mar 13 Python
Python基于xlrd模块操作Excel的方法示例
Jun 21 Python
python实现嵌套列表平铺的两种方法
Nov 08 Python
对python读写文件去重、RE、set的使用详解
Dec 11 Python
对python指数、幂数拟合curve_fit详解
Dec 29 Python
python批量修改ssh密码的实现
Aug 08 Python
Django框架 Pagination分页实现代码实例
Sep 04 Python
python爬虫爬取幽默笑话网站
Oct 24 Python
Python如何使用27行代码绘制星星图
Jul 20 Python
python定义具名元组实例操作
Feb 28 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
关于Intype一些小问题的解决办法
2008/03/28 PHP
php cli 方式 在crotab中运行解决
2010/02/08 PHP
thinkphp自定义权限管理之名称判断方法
2017/04/01 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
Tinymce+jQuery.Validation使用产生的BUG
2010/03/29 Javascript
javascript面向对象入门基础详细介绍
2012/09/05 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
javascript和jquery实现用户登录验证
2016/05/04 Javascript
浅谈js的异步执行
2016/10/18 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
Python单体模式的几种常见实现方法详解
2017/07/28 Python
浅谈python中的数字类型与处理工具
2017/08/02 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
解决python replace函数替换无效问题
2020/01/18 Python
Python log模块logging记录打印用法解析
2020/01/20 Python
Python如何使用vars返回对象的属性列表
2020/10/17 Python
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
2012/12/13 HTML / CSS
美国最大的骑马用品零售商:HorseLoverZ
2017/01/12 全球购物
Erwin Müller穆勒家居瑞士官网:您整个家庭的邮购公司
2019/12/28 全球购物
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
协议书与合同的区别
2014/04/18 职场文书
导师推荐信范文
2014/05/09 职场文书
大学生个人学习总结
2015/02/15 职场文书
2015年度学校卫生工作总结
2015/05/12 职场文书
感恩信:写给爸爸妈妈的一封感谢信
2019/09/12 职场文书
pandas中DataFrame重置索引的几种方法
2021/05/24 Python
python 实现图片特效处理
2022/04/03 Python