是否有任何 python 库可以生成随机标题和随机描述。
随机标题:一个语法正确(但随机)的英文句子,少于 5 个单词。随机描述:一个语法正确(但随机)的英语句子,少于 20 个单词。
我正在测试具有标题和描述字段的产品。我想创建多个具有随机标题和随机描述的对象,而不是“标题 1”“描述 1”。
是否有任何 python 库可以生成随机标题和随机描述。
随机标题:一个语法正确(但随机)的英文句子,少于 5 个单词。随机描述:一个语法正确(但随机)的英语句子,少于 20 个单词。
我正在测试具有标题和描述字段的产品。我想创建多个具有随机标题和随机描述的对象,而不是“标题 1”“描述 1”。
对于一个相当简单的解决方案,只需[A-Z][a-z'\-]+[, ]([a-zA-Z'\-]+[;,]? ){15,25}[a-zA-Z'\-]+[.?!]
在一些大块中找到一个正则表达式的匹配项,例如(匹配一个大写的单词,后跟 15-25 个单词(可能是逗号或分号),然后是最后一个单词和一个结束标点符号)文本。要获得更短的、类似标题的短语,您可以匹配任何大约 5 个单词的序列(可能在它们之间没有标点符号):
([a-zA-Z'\-]+ ){4,6}
您可以使用马尔可夫链来实现这一点。为此,您需要执行以下步骤(来自我链接的页面):
- 有一个文本将作为我们从中选择下一个转换的语料库。
- 从文本中的两个连续单词开始。最后两个词构成了当前状态。
- 生成下一个单词是马尔可夫转换。要生成下一个单词,请查看语料库,并找出给定两个单词之后出现的单词。随机选择其中之一。
- 重复 2,直到生成所需大小的文本。
他们提供的代码来实现这一点:
import random
class Markov(object):
def __init__(self, open_file):
self.cache = {}
self.open_file = open_file
self.words = self.file_to_words()
self.word_size = len(self.words)
self.database()
def file_to_words(self):
self.open_file.seek(0)
data = self.open_file.read()
words = data.split()
return words
def triples(self):
""" Generates triples from the given data string. So if our string were
"What a lovely day", we'd generate (What, a, lovely) and then
(a, lovely, day).
"""
if len(self.words) < 3:
return
for i in range(len(self.words) - 2):
yield (self.words[i], self.words[i+1], self.words[i+2])
def database(self):
for w1, w2, w3 in self.triples():
key = (w1, w2)
if key in self.cache:
self.cache[key].append(w3)
else:
self.cache[key] = [w3]
def generate_markov_text(self, size=25):
seed = random.randint(0, self.word_size-3)
seed_word, next_word = self.words[seed], self.words[seed+1]
w1, w2 = seed_word, next_word
gen_words = []
for i in xrange(size):
gen_words.append(w1)
w1, w2 = w2, random.choice(self.cache[(w1, w2)])
gen_words.append(w2)
return ' '.join(gen_words)
使用此代码,您可以执行类似于以下示例的操作,将他们的 jeeves.txt 替换为您选择的一些种子文本(越长越好)。
In [1]: file_ = open('/home/shabda/jeeves.txt')
In [2]: import markovgen
In [3]: markov = markovgen.Markov(file_)
In [4]: markov.generate_markov_text()
Out[4]: 'Can you put a few years of your twin-brother Alfred,
who was apt to rally round a bit. I should strongly advocate
the blue with milk'
在 In[1] 到 In[3] 之后,您只需要markov.generate_markov_text()
使用适当的参数调用即可根据需要生成 5 和 20 个单词的序列。