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小程序
Aug 15 Python
Python判断字符串与大小写转换
Jun 08 Python
详解Python之unittest单元测试代码
Jan 24 Python
简单实现Python爬取网络图片
Apr 01 Python
Python判断两个list是否是父子集关系的实例
May 04 Python
解决Python下imread,imwrite不支持中文的问题
Dec 05 Python
python判断文件是否存在,不存在就创建一个的实例
Feb 18 Python
python实现文件的备份流程详解
Jun 18 Python
django将数组传递给前台模板的方法
Aug 06 Python
使用matlab 判断两个矩阵是否相等的实例
May 11 Python
Python第三方包PrettyTable安装及用法解析
Jul 08 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
Dec 08 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实现使用优酷土豆视频地址获取swf播放器分享地址
2014/06/05 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
PHP实现RTX发送消息提醒的实例代码
2017/01/03 PHP
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
Javascript浅谈之this
2013/12/17 Javascript
js拖拽的原型声明和用法总结
2016/04/04 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
Three.js学习之网格
2016/08/10 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
使用nodejs爬取前程无忧前端技能排行
2017/05/06 NodeJs
详解Angular 4 表单快速入门
2017/06/05 Javascript
js实现本地图片文件拖拽效果
2017/07/18 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
vue+element tabs选项卡分页效果
2020/06/29 Javascript
如何在vue中使用jointjs过程解析
2020/05/29 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
2021/01/12 Vue.js
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
python动态监控日志内容的示例
2014/02/16 Python
Python http接口自动化测试框架实现方法示例
2018/12/06 Python
python爬虫之遍历单个域名
2019/11/20 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
美国儿童运动鞋和服装零售商:Kids Foot Locker
2017/08/05 全球购物
《手指教学》反思
2014/02/14 职场文书
应届大专毕业生自我鉴定
2014/04/08 职场文书
离职报告格式
2014/11/04 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
2015年电话客服工作总结
2015/05/18 职场文书
幼儿园开学报名通知
2015/07/16 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书
CSS3 天气图标动画效果
2021/04/06 HTML / CSS
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
2021/05/14 Python
SQL实现LeetCode(178.分数排行)
2021/08/04 MySQL
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android