Python实现的生成自我描述脚本分享(很有意思的程序)
作者:oldj 发布时间:2023-08-14 20:21:06
标签: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 提供了很多内置的工具函数(Built-in Functions),在最新的 Python 3 官方文档中,它列出了 69 个。
- 本文实例为大家分享了python模拟登录图书馆的具体代码,供大家参考,具体内容如下模拟表单提交的原理:我们都知道Http是无状态的,所以当我
- 一个网站信息结构需要表现给用户看,这样用户才能知道当前是在哪儿,才有可能去猜测某个内容可能会在哪儿。如何表现网站的信息结构给用户呢?用导航。
- 微信小程序中使用地图(map)组件,通过点击(tap)获取经纬度,按照官方的回应,暂时是没法做到的,从地图组件API多有残缺判断,怀疑是个实
- 前言学习一门新的语言肯定是要从他的基本语法开始,语法构成了整个程序设计的基础,从语法中我们也可以看到这门语言的一些特性,但是话说回来,语法这
- 本文实例为大家分享了Bootstrap导航栏和登陆框的具体代码,供大家参考,有不足的地方请大家谅解,大家共同学习进步。<!DOCTYP
- 1.ACCESS查询(query_info):select * from info where stu = name1 and age =
- 写在前面题目所说的并不是目的,主要是为了更详细的了解网站的反爬机制,如果真的想要提高博客的阅读量,优质的内容必不可少。了解网站的反爬机制一般
- 本文实例为大家分享了js实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下两个小时完成的,有点简陋。直接看效果。打开调试面板,在resour
- 本文实例讲述了java实现的连接oracle mysql数据库功能。分享给大家供大家参考,具体如下:package com.nuo.test
- 目录为什么要画局部放大图?程序逻辑程序实例总结这项功能的目的是为了方便使用opencv做图像标注工具。为什么要画局部放大图?在做图像数据标注
- 本文介绍以下内容:1. 使用transformers框架做预训练的bert-base模型;2. 开发平台使用Google的Colab平台,白
- 视图代码lis = []#设置一个空列表用来存放发送的验证码,用来验证def yzm1(): res1 = &qu
- 需求分析现在是 "图片为王"的时代,在浏览一些网站时,经常会看到类似于这种满屏都是图片。图片大小不一,却按空间排列,就这
- 本文实例讲述了python字典基本操作。分享给大家供大家参考。具体如下:d2 = {'spam': 2, 'ham&
- 一、启动/关闭MySQL (1)启动MySQL
- 1. 内连接内连接:合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行。说人话就是,查询结果只包含它们匹配的行,不匹
- 1、引言小 * 丝:鱼哥,鱼哥,help…小鱼:呼吸声越来越弱,你这是劳累过度??小 * 丝:拉倒吧,我这是激动的小鱼:什么大