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中处理unchecked未捕获异常实例
Jan 17 Python
Python socket编程实例详解
May 27 Python
Python使用turtule画五角星的方法
Jul 09 Python
Python探索之爬取电商售卖信息代码示例
Oct 27 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
Aug 03 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
Oct 15 Python
python 遍历列表提取下标和值的实例
Dec 25 Python
Django文件存储 自己定制存储系统解析
Aug 02 Python
Python大数据之从网页上爬取数据的方法详解
Nov 16 Python
Pytorch转tflite方式
May 25 Python
python怎么对数字进行过滤
Jul 05 Python
用于ETL的Python数据转换工具详解
Jul 21 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 中执行系统外部命令
2006/10/09 PHP
php笔记之:数据类型与常量的使用分析
2013/05/14 PHP
PHP 输出缓冲控制(Output Control)详解
2016/08/25 PHP
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
SelecT下拉框选中和取值的解决方法
2016/11/22 Javascript
过期软件破解办法实例详解
2017/01/04 Javascript
使用JavaScript根据图片获取条形码的方法
2017/07/04 Javascript
javaScript封装的各种写法
2017/08/14 Javascript
解决axios会发送两次请求,有个OPTIONS请求的问题
2018/10/25 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
微信小程序实现展示评分结果功能
2019/02/15 Javascript
微信小程序页面间跳转传参方式总结
2019/06/13 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
2020/07/15 Javascript
在实例中重学JavaScript事件循环
2020/12/03 Javascript
[01:44]《为梦想出发》—联想杯DOTA2完美世界全国高校联赛
2015/09/30 DOTA
解决uWSGI的编码问题详解
2017/03/24 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
浅谈python内置变量-reversed(seq)
2017/06/21 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
2017/12/18 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
Python join()函数原理及使用方法
2020/11/14 Python
python中@contextmanager实例用法
2021/02/07 Python
实列教程 一款基于jquery和css3的响应式二级导航菜单
2014/11/13 HTML / CSS
HTML5 placeholder(空白提示)属性介绍
2013/08/07 HTML / CSS
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
STAUD官方网站:洛杉矶独有的闲适风格
2019/04/11 全球购物
加拿大户外探险购物网站:SAIL
2020/06/27 全球购物
小学语文教学经验交流材料
2014/06/02 职场文书
党员先进事迹材料
2014/12/19 职场文书
贫困证明书范文
2015/06/16 职场文书
暑期家教宣传单
2015/07/14 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
Canvas跟随鼠标炫彩小球的实现
2021/04/11 Javascript
微信告警的zabbix监控系统 监控整个NGINX集群
2022/04/18 Servers
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers