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数据分析之如何利用pandas查询数据示例代码
Sep 01 Python
R vs. Python 数据分析中谁与争锋?
Oct 18 Python
python实现数独游戏 java简单实现数独游戏
Mar 30 Python
python实现微信自动回复功能
Apr 11 Python
python3+PyQt5实现自定义窗口部件Counters
Apr 20 Python
python实现txt文件格式转换为arff格式
May 31 Python
Python网络爬虫之爬取微博热搜
Apr 18 Python
200行python代码实现2048游戏
Jul 17 Python
python 中xpath爬虫实例详解
Aug 26 Python
解决Python 函数声明先后顺序出现的问题
Sep 02 Python
pytorch实现线性回归以及多元回归
Apr 11 Python
解决Pytorch中关于model.eval的问题
May 22 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 simple_html_dom.php+正则 采集文章代码
2009/12/24 PHP
PHP 手机归属地查询 api
2010/02/08 PHP
分享下php5类中三种数据类型的区别
2015/01/26 PHP
基于PHP制作验证码
2016/10/12 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
2017/08/01 PHP
php 读取文件夹下所有图片、文件的实例
2018/10/17 PHP
用javascript自动显示最后更新时间
2007/03/15 Javascript
用jquery实现输入框获取焦点消失文字
2013/04/27 Javascript
JS正则表达式大全(整理详细且实用)
2013/11/14 Javascript
javascript分页代码实例分享(js分页)
2013/12/13 Javascript
点击标签切换和自动切换DIV选项卡
2014/08/10 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
2017/01/22 Javascript
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
2017/09/27 Javascript
vue interceptor 使用教程实例详解
2018/09/13 Javascript
图文讲解vue的v-if使用方法
2019/02/11 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
Python实现的手机号归属地相关信息查询功能示例
2017/06/08 Python
python复制列表时[:]和[::]之间有什么区别
2018/10/16 Python
python远程调用rpc模块xmlrpclib的方法
2019/01/11 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
2019/07/11 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
Python with标签使用方法解析
2020/01/17 Python
英国电子专家:maplin
2019/09/04 全球购物
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
应聘面试自我评价
2014/01/24 职场文书
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
岗位廉洁从业承诺书
2014/03/28 职场文书
2014年教师党员公开承诺书
2014/05/28 职场文书
2014年前台接待工作总结
2014/12/05 职场文书
2015年艾滋病宣传活动总结
2015/03/27 职场文书
css3实现的加载动画效果
2021/04/07 HTML / CSS