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 文件读写操作实例详解
Mar 12 Python
Python实例一个类背后发生了什么
Feb 09 Python
Python遍历pandas数据方法总结
Feb 09 Python
python 移动图片到另外一个文件夹的实例
Jan 10 Python
Python3按一定数据位数格式处理bin文件的方法
Jan 24 Python
基于python生成器封装的协程类
Mar 20 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
Jun 18 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
Jan 08 Python
python数据类型强制转换实例详解
Jun 22 Python
python如何删除列为空的行
Jul 17 Python
Python selenium实现断言3种方法解析
Sep 08 Python
Python echarts实现数据可视化实例详解
Mar 03 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
支持php4、php5的mysql数据库操作类
2008/01/10 PHP
php ob_flush,flush在ie中缓冲无效的解决方法
2010/05/09 PHP
php实现多张图片上传加水印技巧
2013/04/18 PHP
codeigniter使用技巧批量插入数据实例方法分享
2013/12/31 PHP
php数组中包含中文的排序方法
2014/06/03 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
PHP编程计算日期间隔天数的方法
2017/04/26 PHP
PHP8.0新功能之Match表达式的使用
2020/07/19 PHP
jquery 插件学习(六)
2012/08/06 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
jquery通过ajax加载一段文本内容的方法
2015/01/15 Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
2015/01/23 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
JS无缝滚动效果实现方法分析
2016/12/21 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
javascript实现QQ空间相册展示源码
2017/12/12 Javascript
Vuejs开发环境搭建及热更新【推荐】
2018/09/07 Javascript
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
vue-socket.io跨域问题有效解决方法
2020/02/11 Javascript
bootstrap实现tab选项卡切换
2020/08/09 Javascript
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
python中pip的使用和修改下载源的方法
2019/07/08 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
查看keras的默认backend实现方式
2020/06/19 Python
python数据类型强制转换实例详解
2020/06/22 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
Python Opencv轮廓常用操作代码实例解析
2020/09/01 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
医院合作协议书
2014/08/19 职场文书
期中考试复习计划
2015/01/19 职场文书
Hive日期格式转换方法总结
2022/06/25 数据库
Win11 vmware不兼容怎么办?Win11与VMware虚拟机不兼容的解决方法
2023/01/09 数码科技