【问题标题】:How to make a random text python如何制作随机文本python
【发布时间】:2015-03-12 00:32:42
【问题描述】:

我需要帮助来输出随机文本。 我收到了一个包含 25k 个单词的文本,来自 text_file 我一直在计算单个字母的概率,以及单个单词以查看哪些字母/单词被使用最多。

现在我需要创建一个包含 500 个字母的其他文本,但是这个文本应该包含我计算出的概率,并且应该由我从第一个文本中“找到”的字母来写。

就像: Text1 -> 对使用过的字母进行概率处理,哪些字母代表最多。 制作 text2 -> 使用从 text1 中找到的概率。

希望你能帮助我,我是 Python 新手。

【问题讨论】:

  • 目前还不清楚预期的输出。生成的 500 个字符的文本应该具有相同的字母频率?还是单词和字母的频率?
  • 字母频率。对不起我的阴霾。
  • 尝试使用:pypi.python.org/pypi/fake-factory 相当不错。
  • Programming Pearls (by Jon Bentley) 有一个关于随机文本生成的非常好的部分。你可以在这里阅读netlib.bell-labs.com/cm/cs/pearls/sec153.html

标签: python string algorithm random letters


【解决方案1】:

最简单的方法是随机选择 25k 文件的字母。然后结果与原始的概率相同。

import random
print(''.join(random.choice(original_text) for _ in range(500)))

【讨论】:

  • 您在最后一行的末尾错过了 print 函数的右括号。
【解决方案2】:

你可以这样做:

import string
import random

def get_random_letter():
    # depends how you want to randomize getting your letter
    return random.choice(string.letters)

random_letters = []
for i in range(500):
    random_letter = get_random_letter()
    random_letters.append(random_letter)

with open("text.txt", 'w') as f:
    f.write("".join(random_letters))

您可以根据您的概率模型更改“get_random_letter”定义并返回该字符(在这种情况下,您不需要导入随机数或字符串,这些只是用作示例)。

编辑:要获得基于特定重量的字母,您可以使用:

import random

inputs = ['e', 'f', 'g', 'h']
weights = [10, 30, 50, 10]

def get_random_letter(inputs, weights):
    r = random.uniform(0, sum(weights))
    current_cutoff = 0
    for index in range(len(weights)):
        current_cutoff = current_cutoff + weights[index]
        if r < current_cutoff:
            return inputs[index]

print get_random_letter(inputs, weights)

来自这里的帖子:Returning a value at random based on a probability weights

【讨论】:

  • 这根本不能回答问题。基本上 py.codan 要求实现 get_random_letter() 方法。
  • 所以如果我想使用我的字母,我应该将 random_letter 更改为我的 letter_freqs?还是我错了?感谢您的快速答复。
  • 这种方法可能有问题。它将给出相同的字母出现概率,但频率会不同。考虑出现 200 次“a”和 800 次“b”的输入。如果要求意味着频率而不是概率(从预期的问题中不是 100% 清楚) - 结果应该是随机打乱的数组,恰好为 100 'a' 和 400 'b'。在您的示例中,它将平均有 100 个“a”和 400 个“b”。
  • 应该是来自概率,那是我的frequency_letter =[]
【解决方案3】:

我现在有这个:

def random_text():
   return(''.join(random.choice(text) for _ in range(500)))

random_letters = []

for i in range(1):
random_letter = random_text()
random_letters.append(random_letter)

print random_letters

现在它只运行一次。 但我不知道如何将输出文本编码为utf-8?

【讨论】:

  • random_text 创建 1000 个随机字母,而您的 for 循环创建其中的 500 个。因此它产生 1000*500 = 500.000 个字母。将 1000 更改为 500,并且只调用一次 random_text
  • 所以应该是: def random_text(): return(''.join(random.choice(text) for _ in range(500))) random_letters = [] for i in range(1 ): random_letter = random_text() random_letters.append(random_letter) print random_letters 这就是它的工作原理!谢谢老哥!!
  • 好吧,如果你只执行一次代码,你就不需要循环了。
猜你喜欢
  • 2018-02-14
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多