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使用pyhook监控键盘并实现切换歌曲的功能
Jul 18 Python
Python3指定路径寻找符合匹配模式文件
May 22 Python
详解python的几种标准输出重定向方式
Aug 15 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
Dec 14 Python
Python版名片管理系统
Nov 30 Python
pyspark操作MongoDB的方法步骤
Jan 04 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
Feb 13 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
Jun 19 Python
Python Process多进程实现过程
Oct 22 Python
python help函数实例用法
Dec 06 Python
python 实现一个简单的线性回归案例
Dec 17 Python
浅谈Python数学建模之线性规划
Jun 23 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
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
js 目录列举函数
2008/11/06 Javascript
Javascript 文件夹选择框的两种解决方案
2009/07/01 Javascript
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
jquery 仿QQ校友的DIV模拟窗口效果源码
2010/03/24 Javascript
js单向链表的具体实现实例
2013/06/21 Javascript
原创jQuery弹出层插件分享
2015/04/02 Javascript
js实现文字在按钮上滚动的方法
2015/08/20 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
2016/05/20 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
使用ajaxfileupload.js实现上传文件功能
2016/08/13 Javascript
Node.js中如何合并两个复杂对象详解
2016/12/31 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
AngularJs中$cookies简单用法分析
2019/05/30 Javascript
基于vue--key值的特殊用处详解
2020/07/31 Javascript
[01:11:46]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第一场 2月23日
2021/03/11 DOTA
python创建进程fork用法
2015/06/04 Python
windows下python连接oracle数据库
2017/06/07 Python
Python设计模式之代理模式实例详解
2019/01/19 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
职工趣味运动会方案
2014/02/10 职场文书
事业单位竞聘上岗实施方案
2014/03/28 职场文书
主题教育活动总结
2014/05/05 职场文书
婚礼秀策划方案
2014/05/19 职场文书
党的群众路线领导班子整改方案
2014/09/27 职场文书
反对四风自我剖析材料
2014/10/07 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
初中班长竞选稿
2015/11/20 职场文书
MySQL 8.0 驱动与阿里druid版本兼容问题解决
2021/07/01 MySQL
对象析构函数__del__在Python中何时使用
2022/03/22 Python
服务器SVN搭建图文安装过程
2022/06/21 Servers
插件导致ECharts被全量引入的坑示例解析
2022/09/23 Javascript