Как разбить набор строк на подстроки в Python, чтобы сделать более короткие подстроки более вероятными? - PullRequest
1 голос
/ 26 апреля 2019

У меня есть набор строк по несколько миллионов символов в каждой. Я хочу разбить их на подстроки произвольной длины, и это я могу сделать без особых проблем.

Однако мой вопрос: как я могу применить какой-то вес к выбору длины подстроки? Мой код работает в python3, поэтому я хотел бы найти питоническое решение. Подробно моя цель:

  • разбить строки на подстроки длиной от 1 * e04 до 8 * e06 символов.
  • сделать так, чтобы скрипт чаще выбирал короткую длину (1 * e04) по длинной (8 * e06) для вновь сгенерированных подстрок, например градиент вероятности по убыванию длины.

Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

NumPy предоставляет множество случайных функций выборки.Просмотрите различные доступные распределения .

Если вы ищете что-то, что было взвешено в нижней части шкалы, возможно, экспоненциальное распределение будетРабота?

С помощью matplotlib вы можете построить гистограмму значений, чтобы вы могли получить лучшее представление, если распределение соответствует вашему желанию.

Итак, что-то вроде этого:

import numpy as np
import matplotlib.pyplot as plt

# desired range of values
mn = 1e04
mx = 8e06

# random values following exp distribution
values = np.random.exponential(scale=1, size=2000)

# scale the values to the desired range
values = ((mx-mn)*values/np.max(values)) + mn

# plot the distribution of values
plt.hist(values)
plt.grid()
plt.show()
plt.close()
1 голос
/ 26 апреля 2019

Вероятно, есть много способов сделать это. Я бы сделал это следующим образом:

  1. Взять случайное число rand в интервале [0,1]:
    import random
    rand = random.random()
  2. Используйте операцию с этим номером, чтобы сделать более мелкие числа более вероятными, но оставайтесь в диапазоне [0,1]. Какая операция вы используете, зависит от того, как вы хотите, чтобы ваше распределение вероятностей было похоже. Простым выбором будет квадрат.
    rand = rand**2
  3. Масштабирование числового пространства [0,1] до [1e04, 8e06] и округление до следующего целого числа:
    subStringLen = round(rand*(8e06-1e04)+1e04)
  4. Получите из строки подстроку длины subStringLen и проверьте, сколько осталось символов.
    • Если осталось более 8e06 символов, перейдите к шагу 1.
    • Если есть от 1e04 до 8e06, используйте их в качестве последней подстроки.
    • Если их меньше 1e04, вам нужно решить, хотите ли вы выбросить остальное или разрешить подстроки меньше 1e04 в этом случае.

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

...