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 try异常处理机制
Jun 01 Python
python 2.7.14安装图文教程
Apr 08 Python
Python绘制3D图形
May 03 Python
python爬虫之模拟登陆csdn的实例代码
May 18 Python
python 多线程将大文件分开下载后在合并的实例
Nov 09 Python
对python mayavi三维绘图的实现详解
Jan 08 Python
python 判断三个数字中的最大值实例代码
Jul 24 Python
python线程中的同步问题及解决方法
Aug 29 Python
pytorch 限制GPU使用效率详解(计算效率)
Jun 27 Python
keras.utils.to_categorical和one hot格式解析
Jul 02 Python
Python同时处理多个异常的方法
Jul 28 Python
用Python爬虫破解滑动验证码的案例解析
May 06 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和ACCESS写聊天室(五)
2006/10/09 PHP
PHP 事件机制(2)
2011/03/23 PHP
php增删改查示例自己写的demo
2013/09/04 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
PHP8.0新功能之Match表达式的使用
2020/07/19 PHP
javascript dom代码应用 简单的相册[firefox only]
2010/06/12 Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
2010/09/12 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
JavaScript前端图片加载管理器imagepool使用详解
2014/12/29 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
bootstrap multiselect 多选功能实现方法
2017/06/05 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
vue中改变选中当前项的显示隐藏或者状态的实现方法
2018/02/08 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
2018/07/21 Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
2019/04/02 Javascript
微信小程序身份证验证方法实现详解
2019/06/28 Javascript
python解析json实例方法
2013/11/19 Python
使用Python从有道词典网页获取单词翻译
2016/07/03 Python
一些常用的Python爬虫技巧汇总
2016/09/28 Python
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
selenium+python实现自动登录脚本
2018/04/22 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
Python中print和return的作用及区别解析
2019/05/05 Python
python文件选择对话框的操作方法
2019/06/27 Python
python匿名函数的使用方法解析
2019/10/10 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
PyTorch-GPU加速实例
2020/06/23 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
Python matplotlib模块及柱状图用法解析
2020/08/10 Python
Python request中文乱码问题解决方案
2020/09/17 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
美赞臣新加坡官方旗舰店:Enfagrow新加坡
2019/05/15 全球购物
英国森林假期:Forest Holidays
2021/01/01 全球购物
毕业班班主任工作总结2015
2015/07/23 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书