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在Windows8下获取本机ip地址的方法
Mar 14 Python
Python中py文件引用另一个py文件变量的方法
Apr 29 Python
python代码过长的换行方法
Jul 19 Python
Python实现基于POS算法的区块链
Aug 07 Python
Django添加KindEditor富文本编辑器的使用
Oct 24 Python
在PyCharm下打包*.py程序成.exe的方法
Nov 29 Python
Python控制Firefox方法总结
Jun 03 Python
python 函数中的内置函数及用法详解
Jul 02 Python
浅谈python3中input输入的使用
Aug 02 Python
python随机生成库faker库api实例详解
Nov 28 Python
基于python和flask实现http接口过程解析
Jun 15 Python
PYTHON 使用 Pandas 删除某列指定值所在的行
Apr 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
PHP可变函数的使用详解
2013/06/14 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
2014/11/04 PHP
Nigma vs Liquid BO3 第一场2.13
2021/03/10 DOTA
jQuery操作input type=radio的实现代码
2012/06/14 Javascript
javascript动态加载三
2012/08/22 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
解决bootstrap-select 动态加载数据不显示的问题
2018/08/10 Javascript
深入理解移动前端开发之viewport
2018/10/19 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
2019/09/12 Javascript
JavaScript实现省份城市的三级联动
2020/02/11 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
2020/02/12 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
Python获取当前时间的方法
2014/01/14 Python
python获取远程图片大小和尺寸的方法
2015/03/26 Python
python返回昨天日期的方法
2015/05/13 Python
flask-socketio实现WebSocket的方法
2018/07/31 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
Python增强赋值和共享引用注意事项小结
2019/05/28 Python
python自动化实现登录获取图片验证码功能
2019/11/20 Python
在django中自定义字段Field详解
2019/12/03 Python
彪马加拿大官网:PUMA加拿大
2018/10/04 全球购物
匡威荷兰官方网站:Converse荷兰
2018/10/24 全球购物
政法学院毕业生求职信
2014/02/28 职场文书
运动会标语
2014/06/21 职场文书
受伤赔偿协议书
2014/09/24 职场文书
2014年计生工作总结
2014/11/21 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书
乒乓球比赛通知
2015/04/27 职场文书
2015年教师教学工作总结
2015/04/28 职场文书
治理商业贿赂工作总结
2015/08/10 职场文书
重阳节主题班会
2015/08/17 职场文书
创业者如何撰写出一份打动投资人的商业计划书?
2019/07/02 职场文书
JavaScript流程控制(分支)
2021/12/06 Javascript