Python实现的生成自我描述脚本分享(很有意思的程序)

 更新时间:2014年07月18日 11:05:34   作者:oldj  
这篇文章主要介绍了Python实现的生成自我描述脚本分享,很有意思的程序,绕的人有点头晕,需要的朋友参考下吧

自我描述的语句指这样一种语句:它的内容就是对它本身的描述。(废话……)比如下面这句句子:

复制代码 代码如下:

这是一段自我描述的语句,除了标点符号外,它共包含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 redis模块的使用教程指南

    Python redis模块的使用教程指南

    这篇文章主要为大家详细介绍了Python redis模块的使用教程指南的相关资料,文中的示例代码讲解详细,感兴趣的小伙伴快跟随小编一起学习一下吧
    2022-10-10
  • python生成器/yield协程/gevent写简单的图片下载器功能示例

    python生成器/yield协程/gevent写简单的图片下载器功能示例

    这篇文章主要介绍了python生成器/yield协程/gevent写简单的图片下载器功能,结合实例形式分析了python生成器、yield协程与gevent图片下载器相关功能定义与使用技巧,需要的朋友可以参考下
    2019-10-10
  • python套接字socket通信

    python套接字socket通信

    这篇文章主要介绍了python套接字socket通信,python标准库中内置了底层网络接口socket,以下代码均默认from socket import *,下文很多详细内容需要的小伙伴可以参考一下
    2022-04-04
  • 基于Python实现微信聊天界面生成器

    基于Python实现微信聊天界面生成器

    这篇文章主要为大家详细介绍了如何利用Python实现简单的微信聊天界面生成器,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2023-01-01
  • 在Python中使用CasperJS获取JS渲染生成的HTML内容的教程

    在Python中使用CasperJS获取JS渲染生成的HTML内容的教程

    这篇文章主要介绍了在Python中使用CasperJS获取JS渲染生成的HTML内容的教程,需要先用JavaScript创建一个接口文件,需要的朋友可以参考下
    2015-04-04
  • 分析Python中设计模式之Decorator装饰器模式的要点

    分析Python中设计模式之Decorator装饰器模式的要点

    这篇文章主要介绍了Python中设计模式之Decorator装饰器模式模式,文中详细地讲解了装饰对象的相关加锁问题,需要的朋友可以参考下
    2016-03-03
  • Python利用format函数实现对齐打印(左对齐、右对齐与居中对齐)

    Python利用format函数实现对齐打印(左对齐、右对齐与居中对齐)

    format是字符串内嵌的一个方法,用于格式化字符串,下面这篇文章主要给大家介绍了关于Python利用format函数实现对齐打印(左对齐、右对齐与居中对齐)的相关资料,需要的朋友可以参考下
    2022-04-04
  • python2.7安装opencv-python很慢且总是失败问题

    python2.7安装opencv-python很慢且总是失败问题

    这篇文章主要介绍了python2.7安装opencv-python很慢且总是失败问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 解决usageerror: line magic function "%%time" not found问题

    解决usageerror: line magic function "

    这篇文章主要介绍了解决usageerror: line magic function "%%time" not found问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 如何利用Python快速统计文本的行数

    如何利用Python快速统计文本的行数

    这篇文章主要介绍了如何利用Python快速统计文本的行数,要快速统计一个文本文件中的行数,其实就是要统计这个文本文件中换行符的个数,下面我们就一起进入文章看看具体的操作过程吧
    2021-12-12

最新评论