【问题标题】:How to split a set of strings into substrings in Python, making shorter substrings more likely?如何在 Python 中将一组字符串拆分为子字符串,使更短的子字符串更有可能?
【发布时间】:2019-04-26 08:51:15
【问题描述】:
我有一组字符串,每个字符串都有数百万个字符。我想将它们分成随机长度的子字符串,这我可以毫无问题地做到。
但是,我的问题是:如何对子字符串长度选择应用某种权重?我的代码在python3 中运行,所以我想找到一个pythonic 解决方案。具体来说,我的目标是:
- 将字符串拆分为长度介于 1*e04 和 8*e06 字符之间的子字符串。
- 让脚本更频繁地为新生成的子字符串选择短长度 (1*e04) 而不是长长度 (8*e06),例如降序长度似然梯度。
感谢您的帮助!
【问题讨论】:
标签:
python
string
random
gradient
【解决方案1】:
NumPy 提供大量random 采样功能。查看各种可用的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()
【解决方案2】:
可能有很多方法可以做到这一点。我会这样做:
- 在区间
[0,1]中取一个随机数rand:
import random
rand = random.random()
- 对该数字进行操作以使较小的数字更有可能,但请保持在
[0,1] 的范围内。您使用什么操作取决于您希望似然分布的样子。一个简单的选择是正方形。
rand = rand**2
- 将数字空间
[0,1] 缩放到[1e04, 8e06] 并舍入到下一个整数:
subStringLen = round(rand*(8e06-1e04)+1e04)
- 从您的字符串中获取长度为
subStringLen 的子字符串并检查剩余的字符数。
- 如果剩余的字符数超过
8e06,请转到第 1 步。
- 如果
1e04 和8e06 之间存在,请将它们用作最后一个子字符串。
- 如果小于
1e04,您需要决定在这种特殊情况下是要丢弃其余的还是允许小于1e04 的子字符串。
我确信在效率方面有很多改进可能,这只是为了让您了解我的方法。