一个主要用于程序生成视觉诗歌的库
项目描述
一个主要用于程序生成视觉诗歌的库
致谢
由代码处理的概念写作是一个相当新的新兴领域,因此我要感谢并感谢以下同行:
感谢 Allison Parrish,我使用了他的发音包。Parrish 的诗意计算项目和诗歌,例如Articulations,也非常鼓舞人心。
Leonard Richardson 的olipy是另一个生成文本软件库,与我自己的(Oulipian)问题类似,它使用马尔可夫链、Queneau 汇编进行实验,并具有其他有趣的杂项功能,例如用损坏的 ASCII 版本交换文本中的字母。
Riley Wong 的诗歌 theremin将光传感器值转化为视觉诗歌,这些诗歌由伟大的现代主义者 Mina Loy 以及 Allen Ginsberg 和 William Carlos Williams 等人的诗歌中采样而成。
现在试试
Colab(推荐给大多数人)
您可以安装此软件并从以下链接启动交互式菜单以创建视觉诗歌,该链接指向托管在 Google Colab 上的 Jupyter 笔记本。
注意:由于屏幕尺寸问题,这只能在台式机和平板电脑上有效。保持本自述文件开放以供参考。
在你的电脑
或者,如果您将它安装在自己的机器上(见下文),您可以通过从终端/shell 运行以下命令来初始化交互式菜单: generation-poetry-cli
这是什么?
该软件库包含各种基于约束的程序,用于将具体诗歌(又名视觉诗歌)随机生成为 PDF 或终端。这些程序中的大多数都是交互式的,一旦您通过利用程序规则学会“玩游戏”,就可以使用和重复使用这些程序。毕竟,所有这些程序都依赖于共同的构建块。当您提供输入单词列表时,隐藏算法会查找与这些单词相关的单词:语音或通过含义或上下文(更多内容见下文)。然后根据程序将单词与各种连接器连接起来:随机连词和标点符号、相关单词(通常创建随机生成的双关语和韵律以及语法异常)、数学符号、统一空间、可变空间。
这产生的视觉诗歌之所以有趣,有两个原因。作为读者,我们受过水平阅读训练,有时甚至是垂直阅读,因此我们根据页面或屏幕上单词的空间接近度来绘制连接。我们还会在具有相似含义或相似声音的单词之间建立联系。当阅读许多这些程序生成的诗歌时,很容易暂停一个人的怀疑并为正在发生的事情创造一个上下文或阅读,或者试图在一个看似神秘或模棱两可的单词选择或措辞中找到意义或意图。代码,不是人类作者,没有归属意图。从这个意义上说,这些诗类似于将颜料扔到画布上的抽象绘画,或者类似于罗夏测验。在大多数情况下,它们是暗示性的视错觉,由偶然和选择的文字而不是油漆组成的调色板设计。尽管如此,韵律、双关语、意义、句法和所有这些元素在纯粹胡说八道中的破坏之间交织的方式创造了一种有趣且独特的 21 世纪声音,反映了互联网本身的混乱本质,是文学瑰宝和模板垃圾邮件的家园,以及许多人对最终出现一种能够思考和写作的有知觉的人工智能的怀疑信念,这种人工智能采用人类的关注点、风格和句法。
这个项目深受 Oulipo 的启发,Oulipo 是 1960 年成立的文学运动,是一个最好翻译为“潜在文学工作室”的短语,其中包括 Raymond Queneau、Italo Calvino 和 Georges Perec。根据 Marjorie Perloff 的说法,他在具体诗歌和复制 Unoriginal Genius 方面的工作也是该项目的一大灵感,“Oulipo 约束是一种生成设备:它创建了一个正式结构,其构图规则被内化,因此所讨论的约束是不仅是规则,而且是诗歌的主题属性。” 还必须对 Alastair Brotchie 的超现实主义游戏之书给予应有的尊重,这教会了我不断尝试和组合程序,就像超现实主义团体在实践中所做的那样。概念艺术家常常被刻板地认为过于拘泥于程序的纯粹产品,但我发现这种态度没有帮助;有时算法输出需要编辑、混音或其他人手触摸的媒体才能发光。
举例来说,这里有五首来自我使用相同程序数字拼贴在一起的相同配方的具体诗歌:偏执狂,腌制,歇斯底里,无线电,波浪和遐想。
这些艺术程序是什么,人们可以用它们做什么?
未来主义文学的技术实现
在 FT Marinetti 的 1912 年未来主义文学技术宣言中,他提议用数学运算符代替语言中的连词,并消除大部分语音部分,以创作一首关于变化速度的诗歌。在许多方面,这份宣言都预见了编程语言的语法。这种诗歌生成方法将随机的语音相关单词与数学运算符连接在一起。
然而,马里内蒂对自己太认真了。这个项目更符合超形上学的精神,阿尔弗雷德·贾里(Alfred Jarry)将其定义为“想象解决方案的科学,它象征性地将由虚拟性描述的对象的属性归因于它们的轮廓”(参见超形物理学家 Faustroll 博士的 Exploits and Opinions)。这个 1894 年的“虚拟性”最初的含义并没有带有计算的含义,而是带有他的教授亨利·柏格森的哲学的含义,他试图从“物质和记忆”的角度重新思考空间和时间的形而上学,例如我们感知的世界与我们不可避免地带入任何感知行为的内涵和意义关系的层次,我们是语言生物。尽管如此,今天虚拟性也包含了数字世界,贾里也写道:“'超形上学首先将是特殊的科学,尽管普遍认为唯一的科学是一般的科学。“超形上学将研究支配例外的规律,并将解释补充这一规律的宇宙。” 我向你保证,这个项目实现了异常处理。超形上学和计算。
下面是一个关于超现实主义和超现实主义的“未来主义诗歌”的例子。输入了以下词:逻辑、辩证法、批判、超现实和超形上学。
随机 Jolastic:通过 (Per)Mutation 生成马尔可夫
这是最复杂的生成方法——它采用用户提供的单词,并首先获取与这些单词语音相关的单词。然后它随机选择这些语音相关的单词之一,找到与该单词的所有语音相关的单词,并从那些两次删除的结果中选择一个来开始诗行。随着算法继续写行,他们将单词转换应用于诗行中的先前单词(例如,随机选择相似含义的单词、发音相似的单词、上下文相关的单词或经常跟随的单词——见下文),还有 25%将这些操作中的另一个应用于中间结果的机会。这意味着一首诗中的下一个单词通常会有数万个结果。诗歌生成器还强制行尾在对联中押韵。
随之而来的双关语和文字游戏的随机出现以及意义和废话之间的循环以及句法结构和无政府状态让我想起了詹姆斯乔伊斯的芬尼根守灵,但更多的是受到乔伊斯的出版商和辩护人尤金乔拉斯的另一个鲜为人知的宣言的启发,他的短篇和感人的 1929 年文字革命认为诗人“有权使用他自己塑造的词语,并无视现有的语法和句法规律。” 这个 Python 包使用的生成实现偶尔也会切换世界语言并进行文化暗示(通常由经常跟随的单词和上下文相关的单词功能触发),这让我想起了 Jolas 对跨大西洋多语言诗歌的渴望(有关更多信息,请查看Marjorie Perloff 的这件作品)。目前,这在某种程度上是偶然发生的——由于 Project Datamuse 的英语词汇中的错误——但在未来,随着 Project Datamuse 的合并,该软件包将包含更多的世界语言,从最近添加到 Project Datamuse 的西班牙语开始。
这首示例诗是由以下输入词产生的:anxious、spectacle、life、death、ascent、peace、traffic和love。
混乱的具体诗
这个更抽象但也更具体,我指的是具体诗歌,它更多地处理空间安排,通常缺乏句法。输入了以下单词:chaos、dissolve、fire、morph、devolve、shapeshifter、transient和cluster。
人物汤
但不像这种制作“人物汤”的方法那么混乱。(这种生成方法不接受输入词。)
停止词汤
最后一个做同样的事情,但使用来自 NLTK 的停用词以及“口头停用词”,如“um”和“ahem”。(这种生成方法不接受输入词。)
有用的子模块 #1:lexigen.py
子模块 lexigen 在此应用程序之外可能很有用,因为它控制押韵、发音相似的词、语音相关的词、意义相似的词、上下文相关的词和罕见的相关词的随机采样。
字采样
先导入相关子模块。
from generativepoetry.lexigen import *
押韵
rhymes('cool') # all words that rhyme with cool
rhymes('cool', sample_size=6) # 6 random words that rhyme with cool
rhyme('cool') # 1 at random
发音相似的词
发音相似的词是与一个词不押韵但听起来相似的词。
# To get all of the similar sounding words according to Project Datamuse:
similar_sounding_word('cool', sample_size=None, datamuse_api_max=None)
# To get the top 10 similar sounding words and then randomly select 5 from that:
similar_sounding_words('cool', sample_size=5, datamuse_api_max=10)
# When not provided, sample_size defaults to 6, and datamuse_api_max defaults to 20.
# The same arguments can be optionally supplied to similar_sounding_word, which draws one word at random:
similar_sounding_word('cool', sample_size=3, datamuse_api_max=15)
similar_sounding_word('cool')
相似的意思词
这些包括但不限于同义词;例如,抹刀算勺子。
# To get all of the similar sounding words according to Project Datamuse:
similar_meaning_words('vampire', sample_size=None, datamuse_api_max=None)
# To get the top 10 similar sounding words and then randomly select 5 from that:
similar_meaning_words('vampire', sample_size=5, datamuse_api_max=10)
# When not provided, sample_size defaults to 6, and datamuse_api_max defaults to 20.
# The same arguments can be optionally supplied to similar_meaning_word, which draws one word at random:
similar_meaning_word('vampire', sample_size=8, datamuse_api_max=12)
similar_meaning_word('vampire')
上下文相关的词
这些词通常与给定词在相同的文档中找到,但不一定具有相关的含义。比如变形记和卡夫卡。
# To get all of the contextually linked words according to Project Datamuse:
contextually_linked_words('metamorphosis', sample_size=None, datamuse_api_max=None)
# To get the top 10 contextually linked words and then randomly select 5 from that:
contextually_linked_words('metamorphosis', sample_size=5, datamuse_api_max=10)
# When not provided, sample_size defaults to 6, and datamuse_api_max defaults to 20.
# The same arguments can be optionally supplied to contextually_linked_word, which draws one word at random:
contextually_linked_word('metamorphosis', sample_size=8, datamuse_api_max=12)
contextually_linked_word('metamorphosis')
经常跟在后面的话
在 Datamuse 项目的语料库中,这些词经常跟在给定词之后。
# To get all of the frequently following words according to Project Datamuse:
frequently_following_words('metamorphosis', sample_size=None, datamuse_api_max=None)
# To get the top 10 frequently following words and then randomly select 5 from that:
frequently_following_words('metamorphosis', sample_size=5, datamuse_api_max=10)
# When not provided, sample_size defaults to 6, and datamuse_api_max defaults to 20.
# The same arguments can be optionally supplied to frequently_following_word, which draws one word at random:
frequently_following_word('metamorphosis', sample_size=8, datamuse_api_max=12)
frequently_following_word('metamorphosis')
有用的子模块 #2:decomposer.py
有很多写法。在Unoriginal Genius中,Marjorie Perloff 将“原始天才”的概念——古代神话作家从他们的智力孤独的深处实现作品——与“非原始天才”的反传统进行了对比,包括剽窃模仿行为(也称为偏离)和拼凑写作。根据肯尼斯·戈德史密斯的《非创意写作》,TS Eliot、詹姆斯·乔伊斯和托马斯·品钦都是这种风格的典范,他们用百科全书、杂志、剪报和世界文学的开放式写出了他们的开创性作品。
今天有无数种方法可以用软件转换文本:马尔可夫链、剪切、用词替换相关词、在书之间交换动词、GPT-2、BERT 等。今天的控制论作者可以利用这些作为分解代理,破坏原始文本创建凌乱的新混合,可以进一步编辑、扩展或合成为原创的、有意义的作品。
这个子模块这个项目详细阐述了这些想法,允许用户:
从Project Gutenberg和Archive.org上公开的文学作品或您提供的任何文本中随机抽取句子和段落。
在两个文本之间交换具有相同词性的单词——例如,将一个文本的所有形容词与另一个文本交换,将一个文本的名词与另一个文本交换,保留叙事或话语结构的结构,同时大幅改变内容。以查尔斯·狄更斯的《远大前程》中的这段话为例,当您将名词和形容词替换为 HP Lovecraft 的故事The Shunned House中的一段时,它就变成了超现实主义的恐怖:
“那时我开始明白,眼睛里的烟囱已经停止了,就像包裹和头部一样,人类真菌之前。我注意到郝薇香小姐把高度准确地放下了,正是她从高处开始的时间。艾丝黛拉处理溪流时,我再次瞥了一眼这具可恶的尸体,发现它上面的轮廓,曾经很少,现在病了,从来没有磨损过。我低头看了一眼轮廓是昆虫的景象,看到上面的半只长袜,曾经很少,现在病了,被踩得破烂了。没有这天地万物,没有这一切更可怕的怪物的静止不动,就连坍塌溶解上的枯萎磷光雾都不会看起来像恐怖的嘲讽,或者人类的狰狞恐怖。”
通过马尔可夫链运行单个文本或文本列表,根据 n-gram 大小(默认为 1,最混乱)以或多或少混乱的方式半智能地重新组合单词。
像这样的基于马尔可夫链的生成算法可以创建散文,其重复和排列赋予它一种奇怪的节奏,并且起初在句法和语义上看起来是有效的,但最终会变成废话。马尔可夫链公式化但又时髦又颠覆性的风格与格特鲁德·斯坦因在《美国人的形成》中的风格非常相似,她在文章作文作为解释中详细解释了这一点。
对由 William S. Burroughs 和 Brion Gysin 开创的分割方法进行虚拟模拟,方法是将文本分解为随机长度的组件(其中保留了单词的最小和最大长度),然后随机重新排列它们。
如何使用
首先,如果您不使用预构建的 Docker 映像,请填充 Project Gutenberg 缓存:
python3 populate_cache.py
接下来,导入库:
from prosedecomposer import *
要从 Project Gutenberg 或 Archive.org 中提取和清理文本:
# From an Archive.org URL:
calvino_text = get_internet_archive_document('https://archive.org/stream/CalvinoItaloCosmicomics/Calvino-Italo-Cosmicomics_djvu.txt')
# From a Project Gutenberg URL:
alice_in_wonderland = get_gutenberg_document('https://www.gutenberg.org/ebooks/11')
# Select a random document from Project Gutenberg
random_gutenberg_text = random_gutenberg_document
ParsedText 类提供了一些函数来随机采样一个或多个一定长度的句子或段落:
parsed_calvino = ParsedText(calvino_text)
parsed_calvino.random_sentence() # Returns a random sentence
parsed_calvino.random_sentence(minimum_tokens=25) # Returns a random sentence of a guaranteed length in tokens
parsed_calvino.random_sentences() # Returns 5 random sentences
parsed_calvino.random_sentences(num=7, minimum_tokens=25) # Returns 7 random sentences of a guaranteed length
parsed_calvino.random_paragraph() # Returns a random paragraph (of at least 3 sentence by default)
parsed_calvino.random_paragraph(minimum_sentences=5) # Returns a paragraph with at least 5 sentences
在文本之间交换具有相同词性的单词:
# Swap out adjectives and nouns between two random paragraphs of two random Gutenberg documents
doc1 = ParsedText(random_gutenberg_document())
doc2 = ParsedText(random_gutenberg_document())
swap_parts_of_speech(doc1.random_paragraph(), doc2.random_paragraph())
# Any of Spacy's part of speech tag values should work, though: https://spacy.io/api/annotation#pos-tagging
swap_parts_of_speech(doc1.random_paragraph(), doc2.random_paragraph(), parts_of_speech=["VERB", "CONJ"])
# Since NLG has not yet been implemented, expect syntax errors like subject-verb agreement.
要通过马尔可夫链文本处理算法运行文本,请参见下文。如果您正在处理大量文本,即一次或几本书籍/故事/等,您可能需要更大的 n-gram 大小(2 或 3)。
output = markov(text) # Just one text (defaults to n-gram size of 1 and 5 output sentences)
output = markov(text, ngram_size=3, num_output_sentence=7) # Bigger n-gram size, more output sentences
output = markov([text1, text2, text3]) # List of text (defaults to n-gram size of 1 and 5 output sentences)
output = markov([text1, text2, text3], ngram_size=3, num_output_sentences=7) # Bigger n-gram size, more outputs
要虚拟地剪切和重新排列文本:
# Cuts up a text into cutouts between 3 and 7 words and rearrange them randomly (returns a list of cutout strings)
cutouts = cutup(text)
# Cuts up a text into cutouts between 2 an 10 words and rearrange them randomly (returns a list of cutout strings)
安装
如果你只是想试试 notebook,我推荐使用 Google Colab。但是,如果您希望在实时 Python 控制台或您自己的项目中修改代码或使用上述某些功能,您可以按照下面列出的说明在本地计算机上安装该包。
视窗
因为这个库目前依赖python包hunspell,不支持windows,使用Docker启动一个基于linux的容器,然后使用pip安装,进入里面的python交互shell:
docker run -t -d python python3 -m pip install generativepoetry && python3
操作系统
OSX 用户必须预先安装 hunspell:
brew install hunspell
然后从http://wordlist.aspell.net/dicts/下载 en_US 字典并解压到 /Library/Spelling/ 并使用 pip 安装:
python3 -m pip install generativepoetry
您还需要 /Library/Fonts/ 中的 Microsoft 核心字体 TTF 文件。
Linux
Ubuntu/Debian 用户应预先安装 hunspell-en-us 和 libhunspell-dev,然后使用 pip 安装:
sudo apt-get install hunspell-en-us libhunspell-dev
python3 -m pip install generativepoetry
更多文档
在此处阅读库的类和函数的文档。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。