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中处理XML的教程
Apr 29 Python
Python检测网站链接是否已存在
Apr 07 Python
Python爬取网易云音乐热门评论
Mar 31 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
Oct 13 Python
对numpy中array和asarray的区别详解
Apr 17 Python
python创建属于自己的单词词库 便于背单词
Jul 30 Python
python识别文字(基于tesseract)代码实例
Aug 24 Python
Python通过递归获取目录下指定文件代码实例
Nov 07 Python
pytorch使用tensorboardX进行loss可视化实例
Feb 24 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
Feb 26 Python
Pandas之read_csv()读取文件跳过报错行的解决
Apr 21 Python
python入门之算法学习
Apr 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
德劲1107的电路分析与打磨
2021/03/02 无线电
php函数指定默认值方法的小例子
2013/12/04 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
php之可变变量的实例详解
2017/09/12 PHP
用jscript实现新建和保存一个word文档
2007/06/15 Javascript
导航跟随滚动条置顶移动示例代码
2013/09/11 Javascript
Jquery实现的tab效果可以指定默认显示第几页
2013/10/16 Javascript
模拟一个类似百度google的模糊搜索下拉列表
2014/04/15 Javascript
jQuery中trigger()方法用法实例
2015/01/19 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
Element input树型下拉框的实现代码
2018/12/21 Javascript
javascript中join方法实例讲解
2019/02/21 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
2019/05/07 Javascript
JavaScript如何判断对象有某属性
2020/07/03 Javascript
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
Python BS4库的安装与使用详解
2018/08/08 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
2018/12/24 Python
使用python来调用CAN通讯的DLL实现方法
2019/07/03 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
Python+OpenCV图像处理——图像二值化的实现
2020/10/24 Python
html5服务器推送_动力节点Java学院整理
2017/07/12 HTML / CSS
YII2 全局异常处理深入讲解
2021/03/24 PHP
外语专业毕业生个人的自荐信
2013/11/19 职场文书
人力资源主管的岗位职责
2014/03/15 职场文书
2014教师研修学习体会
2014/07/08 职场文书
2014年接待工作总结
2014/11/26 职场文书
学校施工安全责任书
2015/01/29 职场文书
经营目标责任书
2015/05/08 职场文书
费城故事观后感
2015/06/10 职场文书
Python如何导出导入所有依赖包详解
2021/06/08 Python
python 进阶学习之python装饰器小结
2021/09/04 Python
html5+实现plus.io进行拍照和图片等获取
2022/06/01 HTML / CSS
Java结构型设计模式之组合模式详解
2022/09/23 Java/Android