2015-01-13 3 views
1

Мне нужна помощь для вывода случайного текста. Я получил текст с 25k словами, из этого text_file Я вычислял вероятность для одиночных букв, и единственные слова, чтобы увидеть, какие буквы/слова использовались больше всего.Как сделать случайный текст python

Теперь мне нужно сделать другой текст с 500 буквами, но этот текст должен включать в себя вероятность того, что я рассчитал, и должен быть прокрашен буквами, которые я «нашел» из первого текста.

Это как: Текст1 -> есть вероятность по буквам, которые были представлены больше всего. Сделайте text2 -> используйте вероятность u, найденную из text1.

Упование u может помочь мне, Im новое в Python.

+0

Это не совсем понятно, что ожидается выход. Результат текста 500 символов должен иметь одинаковые частоты букв? Или как частоты слов, так и буквы? – Jarlax

+0

Письмо частот. Извините за мою дымку. –

+0

попробуйте использовать: https://pypi.python.org/pypi/fake-factory его довольно хорошо. –

ответ

4

Проще всего для случайного выбора букв 25k. Тогда результат имеет ту же вероятность, что и оригинал.

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

Я собираюсь попробовать, спасибо за ответ! :-) –

+0

Вы пропустили закрывающую скобку для функции 'print' в конце последней строки. –

0

Вы могли бы сделать что-то вроде этого:

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» определение в зависимости от модели вероятности и возвращает этот символ (в этом случае вам не нужно импортировать случайный или строку, они просто используются, например).

Edit: Для того, чтобы получить письмо, основываясь на определенном весе вы могли бы использовать это:

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

+0

Это вообще не отвечает на вопрос. В принципе py.codan запрашивает реализацию метода 'get_random_letter()'. – user38034

+0

Итак, если я хочу использовать мои письма, я должен изменить random_letter на мои письма_freqs? Или я ошибаюсь? Спасибо за быстрый ответ. –

+0

Может возникнуть проблема с этим подходом. Это даст одинаковые вероятности появления буквы, но частоты будут разными. Рассмотрим ввод с 200 вхождениями 'a' и 800 вхождений 'b'. Если требование означает частоты вместо вероятностей (это не на 100% ясно из вопроса, что ожидается) - результат должен быть случайным образом перетасованным массивом с точно 100 'a' и 400 'b'. В вашем примере это будет в среднем 100 'a' и 400 'b'. – Jarlax

0

Я теперь это:

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?

+0

random_text создает 1000 случайных букв, а ваш цикл for создает 500 из них. Поэтому он производит 1000 * 500 = 500 000 букв.Измените 1000 на 500 и только один раз вызовите «random_text». – user38034

+0

так должно быть: Защиту random_text(): возвращение (''. Присоединиться (random.choice (текст) для _ в диапазоне (500))) random_letters = [] для г в диапазоне (1) : random_letter = random_text() random_letters.append (random_letter) print random_letters Так оно и работает! Спасибо друг!! –

+0

Ну, вам не нужен цикл, если вы выполняете код только один раз. – user38034