我有一个带有时间戳和标签的文本文件,如下所示:
0.000000 14.463912 tone
14.476425 16.891247 noise
16.891247 21.232923 not_music
21.232923 23.172289 not_music
23.172289 29.128018 not_music
如果我指定步长为 1 秒。
我希望这个列表分解为 1 秒长的时间范围
但仍带有最近的标签。如何将时间范围分解为较小的步骤但具有准确的标签?
例如,如果我的步数是 1 秒,那么
第一行将变成约 14 行,例如:
0.0 1.0 tone
1.0 2.0 tone
.
.
.
13.0 14.0 tone
[14.0 , 14.46] and [14.47, 15.0] #fall in a grey zone , don't know
what to do
15.0 16.0 noise
到目前为止,我已成功读取文本文件并将它们存储在如下列表中:
my_segments =[]
for line in open('./data/annotate.txt', 'rb').readlines():
start, end, label = line.split("\t")
start = float(start)
end = float(end)
label = label.strip()
my_segments.append((start, end, label))
# print my_segments
for i in range(len(my_segments)):
print my_segments[i]
我在看https://stackoverflow.com/a/18265979/4932791 https://stackoverflow.com/a/18265979/4932791作者:@Jared,详细介绍了如何使用 numpy 创建具有给定步长的两个数字之间的范围。像这样:
>>> numpy.arange(11, 17, 0.5)
array([ 11. , 11.5, 12. , 12.5, 13. , 13.5, 14. , 14.5, 15. ,
15.5, 16. , 16.5])
无法弄清楚如何在一系列范围内做类似的事情。
我想出的伪代码/算法是:
- 步骤 1 - 确定步长,
- 步骤2-将步长分配给与步长相对应的left_variable和right_variable
第 3 步 - 将这一步像窗口一样移动到每个范围并检查
如果步长是否在范围内,如果在则分配
它是相应的标签。
- 第 4 步 - 现在更新左侧和
右移 1 步。
- 步骤 5 - 重复步骤 3 直至文件末尾
到达了。
我认为要处理边缘情况,我应该将步长减小到 0.25 秒或类似的值,并设置一个条件,如果当前步骤至少有 40 或 50% 重叠,然后我相应地分配标签。
更新 :
我的无效解决方案:
sliding_window = 0
#st,en = [0.0,1.0]
jumbo= []
for i in range(len(hold_segments)):
if sliding_window > hold_segments[i][0] and sliding_window+1 < hold_segments[i][1]:
jumbo.append((sliding_window,sliding_window+1,hold_segments[i][2]))
sliding_window=sliding_window+1
print hold_segments[i][2]