如何将一组字符串拆分为 Python 中的子字符串,使更短的子字符串更有可能?

How to split a set of strings into substrings in Python, making shorter substrings more likely?

我有一组字符串,每个字符串都有数百万个字符。我想将它们拆分成随机长度的子字符串,我可以毫无问题地做到这一点。

但是,我的问题是:如何对子串长度选择应用某种权重?我的代码在 python3 中运行,所以我想找到一个 pythonic 解决方案。具体来说,我的目标是:

感谢您的帮助!

可能有很多方法可以做到这一点。我会这样做:

  1. [0,1]区间取一个随机数rand
    import random
    rand = random.random()
    
  2. 对该数字进行操作,使更小的数字更有可能,但保持在 [0,1] 的范围内。您使用什么操作取决于您希望似然分布的样子。一个简单的选择是正方形。
    rand = rand**2
    
  3. 将数字 space [0,1] 缩放到 [1e04, 8e06] 并四舍五入到下一个整数:
    subStringLen = round(rand*(8e06-1e04)+1e04)
    
  4. 从您的字符串中获取长度为 subStringLen 的子字符串并检查剩余的字符数。
    • 如果剩余的字符超过 8e06 个,请转到第 1 步。
    • 如果介于 1e048e06 之间,请将它们用作最后​​一个子字符串。
    • 如果少于 1e04,您需要决定是否要丢弃其余部分,或者在这种特殊情况下允许小于 1e04 的子字符串。

我确信在效率方面有很多改进的可能,这只是为了让您了解我的方法。

NumPy 提供大量 random samping functions. Have a look through the various distributions 可用。

如果您正在寻找权重偏低的东西,也许 exponential distribution 会起作用?

使用 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()