Python 如何根据说话人姓名总结时间戳列表v.2
我在做一个项目 我从列表中提取了数据,现在有3个列表:Python 如何根据说话人姓名总结时间戳列表v.2,python,arrays,python-3.x,algorithm,datetime,Python,Arrays,Python 3.x,Algorithm,Datetime,我在做一个项目 我从列表中提取了数据,现在有3个列表: 列表1-演讲者姓名列表 ['<M1>', '<M1>', '<M1>', '<M1>', '<M1>', '<M2>', '<M2>', '<M2>', '<M1>', '<M1>', '<M2>', '<M1>', '<M2>', '<M2>', '<M2>'
列表1-演讲者姓名列表
['<M1>', '<M1>', '<M1>', '<M1>', '<M1>', '<M2>', '<M2>', '<M2>', '<M1>', '<M1>', '<M2>', '<M1>', '<M2>', '<M2>', '<M2>', '<M2>', '<M2>']
列表3-结束通话时间戳的列表
['[00:00:08.010]', '[00:00:16.290]', '[00:00:26.210]', '[00:00:39.980]', '[00:00:48.100]', '[00:00:56.770]', '[00:01:08.010]', '[00:01:20.250]', '[00:01:33.850]', '[00:01:47.150]', '[00:01:49.370]', '[00:01:50.140]', '[00:02:01.350]', '[00:02:16.010]', '[00:02:20.150]', '[00:02:27.610]', '[00:02:39.040]']
我需要做的是每当一个演讲者讲了很多次(例如列表的前5个元素)
我需要将第一个结束段[00:00:08.010]更改为[00:00:48.100],并删除中间的所有条目(将有一个说话者的5个条目改为1个条目)
然后对列表中的所有发言者再次执行此操作。
如果演讲者只说了一次,那么它需要保持不变
我还有一条我需要遵守的规则,我不知道如何执行,
如果有人直截了当地讲了5遍(如开头的例子),那么就有了
在第4句和第5句之间超过0.5秒
结果应该是两个输入
比如说
['<M1>', '<M1>']
但它不看时间,只看演讲者的第一次和最后一次讲话的时间,不分开,以防时间间隔相差0.5秒
<M1> [00:00:00.000] [00:00:39.980]
<M1> [00:00:40.600] [00:00:48.100]
[00:00:00.000][00:00:39.980]
[00:00:40.600] [00:00:48.100]
而不是
<M1> [00:00:00.000] [00:00:48.100]
[00:00:00.000][00:00:48.100]
给定这些容器和以下假设:
- 清单1总是有序的
- 列表1、2和3的长度始终相等
- 列表1、2和3是垂直相关的
from itertools import groupby
speaker_times = {}
for speaker, timestamps in groupby(enumerate(list_1), key=lambda x: x[1]):
start = timestamps[0][0] # start time recorded
end = timestamps[-1][0] # end time recorded
speaker_times[speaker] = [list_2[start], list_3[end]]
这将通过
将列表压缩到字典中,格式如下:
:[开始时间,结束时间]
问题的第二部分令人困惑,你能否编辑你的原始帖子,进一步澄清你所说的0.5秒间隔是什么意思?您显示
00.00.00-00.00.39
和00.00.39-00.00.48
,但这两个都不是00.00.05
间隙(假设格式为hh.mm.ss
)。要处理扬声器段中0.5秒的间隙,您需要将开始时间和结束时间转换为datetime
对象,并将当前start
值与以前的end
值进行比较,当扬声器发生变化或间隔大于等于0.5秒时,启动新的片段:
from datetime import datetime
import itertools
speakers = ['<M1>', '<M1>', '<M1>', '<M1>', '<M1>', '<M2>', '<M2>', '<M2>', '<M1>', '<M1>', '<M2>', '<M1>', '<M2>', '<M2>', '<M2>', '<M2>', '<M2>']
start = ['[00:00:00.000]', '[00:00:08.010]', '[00:00:16.890]', '[00:00:26.210]', '[00:00:39.980]', '[00:00:48.100]', '[00:00:56.770]', '[00:01:08.010]', '[00:01:21.120]', '[00:01:46.130]', '[00:01:47.180]', '[00:01:49.390]', '[00:01:50.670]', '[00:02:02.320]', '[00:02:16.010]', '[00:02:21.110]', '[00:02:27.610]']
end = ['[00:00:08.010]', '[00:00:16.290]', '[00:00:26.210]', '[00:00:39.980]', '[00:00:48.100]', '[00:00:56.770]', '[00:01:08.010]', '[00:01:20.250]', '[00:01:33.850]', '[00:01:47.150]', '[00:01:49.370]', '[00:01:50.140]', '[00:02:01.350]', '[00:02:16.010]', '[00:02:20.150]', '[00:02:27.610]', '[00:02:39.040]']
# convert times to datetime objects
startt = [datetime.strptime(t, '[%H:%M:%S.%f]') for t in start]
endt = [datetime.strptime(t, '[%H:%M:%S.%f]') for t in end]
newSpeakerOrder = []
newSpeakerBegin = []
newSpeakerEnd = []
currentspeaker = None
currentend = datetime.fromtimestamp(0)
for i in range(len(speakers)):
if currentspeaker != speakers[i] or (startt[i] - currentend).total_seconds() >= 0.5:
if currentspeaker != None and currentend != None:
newSpeakerEnd.append(end[i - 1])
newSpeakerOrder.append(speakers[i])
newSpeakerBegin.append(start[i])
currentspeaker = speakers[i]
currentend = endt[i]
newSpeakerEnd.append(end[-1])
print([(s, b, e) for s, b, e in zip(newSpeakerOrder, newSpeakerBegin, newSpeakerEnd)])
从日期时间导入日期时间
进口itertools
发言人=['','','','','','','','','','','','','','','','','','']
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,00:02:21.110],“[00:02:27.610]”
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,[00:02:39.040]]
#将时间转换为日期时间对象
startt=[datetime.STRTIME(t,[%H:%M:%S.%f]'),用于开始中的t]
endt=[datetime.strtime(t,[%H:%M:%S.%f]'),用于结尾中的t]
NewspeakErrorder=[]
newSpeakerBegin=[]
newSpeakerEnd=[]
currentspeaker=无
currentend=datetime.fromtimestamp(0)
对于范围内的i(len(扬声器)):
如果当前扬声器!=扬声器[i]或(开始[i]-currentend)。总秒数()>=0.5:
如果当前扬声器!=无和currentend!=无:
newSpeakerEnd.append(end[i-1])
newSpeakerOrder.append(发言者[i])
newSpeakerBegin.append(开始[i])
currentspeaker=扬声器[i]
currentend=endt[i]
newSpeakerEnd.append(结束[-1])
打印([(s,b,e)用于s,b,e的拉链(Newspeakorder,newSpeakerBegin,NewspeakerRend)])
输出:
[
('<M1>', '[00:00:00.000]', '[00:00:16.290]'),
('<M1>', '[00:00:16.890]', '[00:00:48.100]'),
('<M2>', '[00:00:48.100]', '[00:01:20.250]'),
('<M1>', '[00:01:21.120]', '[00:01:33.850]'),
('<M1>', '[00:01:46.130]', '[00:01:47.150]'),
('<M2>', '[00:01:47.180]', '[00:01:49.370]'),
('<M1>', '[00:01:49.390]', '[00:01:50.140]'),
('<M2>', '[00:01:50.670]', '[00:02:01.350]'),
('<M2>', '[00:02:02.320]', '[00:02:20.150]'),
('<M2>', '[00:02:21.110]', '[00:02:39.040]')
]
[
('', '[00:00:00.000]', '[00:00:16.290]'),
('', '[00:00:16.890]', '[00:00:48.100]'),
('', '[00:00:48.100]', '[00:01:20.250]'),
('', '[00:01:21.120]', '[00:01:33.850]'),
('', '[00:01:46.130]', '[00:01:47.150]'),
('', '[00:01:47.180]', '[00:01:49.370]'),
('', '[00:01:49.390]', '[00:01:50.140]'),
('', '[00:01:50.670]', '[00:02:01.350]'),
('', '[00:02:02.320]', '[00:02:20.150]'),
('', '[00:02:21.110]', '[00:02:39.040]')
]
为了澄清这一点,如果一个演讲者连续多次出现,你不想简单地总结他所有的演讲时间,如果两次出现之间有延迟,你也可以将其分成演讲时间块?如果同一演讲者的两次出现之间的延迟超过0.5秒,这些人没有这个差距,但我被告知,我将得到的未来名单将有这个差距,正因为如此,我需要为未来添加这个选项entries@MichaelBenHaym这仍然没有意义,因为您说过“……是一个超过0.5秒的空间……”,list_3
中的许多时间戳的间隔大于0.5秒。因此,我再次敦促你用一个例子来更新你的原始帖子。最初,我的脚本将其相加为1个M1条目,秒数为0.00.00-0.00.48,但我希望输出为两个M1条目,其中一个条目的起点,如果第一个的结束时间与第二个的开始时间相差0.5秒,则结束时间为00.00.00-00.00.39,第二个为00.00.39-00.00.48gap@MichaelBenHaym因此,
最多有2个条目?也就是说,如果一个演讲者多次出现,并且第二个到最后一个和最后一个结束时间戳之间的差值为0.5秒,那么结果应该是[(“”,开始到第二个到最后一个到结束时间),(“”,第二个到最后一个到结束时间)]
?你的问题令人困惑的原因是,你将00.00.00
设置为00.00.39
,间隔0.5秒;但是如果你只想要最多2个条目,那么这是可行的。我试着编辑并添加了一个例子,不应该有最多的条目,但以防万一
from datetime import datetime
import itertools
speakers = ['<M1>', '<M1>', '<M1>', '<M1>', '<M1>', '<M2>', '<M2>', '<M2>', '<M1>', '<M1>', '<M2>', '<M1>', '<M2>', '<M2>', '<M2>', '<M2>', '<M2>']
start = ['[00:00:00.000]', '[00:00:08.010]', '[00:00:16.890]', '[00:00:26.210]', '[00:00:39.980]', '[00:00:48.100]', '[00:00:56.770]', '[00:01:08.010]', '[00:01:21.120]', '[00:01:46.130]', '[00:01:47.180]', '[00:01:49.390]', '[00:01:50.670]', '[00:02:02.320]', '[00:02:16.010]', '[00:02:21.110]', '[00:02:27.610]']
end = ['[00:00:08.010]', '[00:00:16.290]', '[00:00:26.210]', '[00:00:39.980]', '[00:00:48.100]', '[00:00:56.770]', '[00:01:08.010]', '[00:01:20.250]', '[00:01:33.850]', '[00:01:47.150]', '[00:01:49.370]', '[00:01:50.140]', '[00:02:01.350]', '[00:02:16.010]', '[00:02:20.150]', '[00:02:27.610]', '[00:02:39.040]']
# convert times to datetime objects
startt = [datetime.strptime(t, '[%H:%M:%S.%f]') for t in start]
endt = [datetime.strptime(t, '[%H:%M:%S.%f]') for t in end]
newSpeakerOrder = []
newSpeakerBegin = []
newSpeakerEnd = []
currentspeaker = None
currentend = datetime.fromtimestamp(0)
for i in range(len(speakers)):
if currentspeaker != speakers[i] or (startt[i] - currentend).total_seconds() >= 0.5:
if currentspeaker != None and currentend != None:
newSpeakerEnd.append(end[i - 1])
newSpeakerOrder.append(speakers[i])
newSpeakerBegin.append(start[i])
currentspeaker = speakers[i]
currentend = endt[i]
newSpeakerEnd.append(end[-1])
print([(s, b, e) for s, b, e in zip(newSpeakerOrder, newSpeakerBegin, newSpeakerEnd)])
[
('<M1>', '[00:00:00.000]', '[00:00:16.290]'),
('<M1>', '[00:00:16.890]', '[00:00:48.100]'),
('<M2>', '[00:00:48.100]', '[00:01:20.250]'),
('<M1>', '[00:01:21.120]', '[00:01:33.850]'),
('<M1>', '[00:01:46.130]', '[00:01:47.150]'),
('<M2>', '[00:01:47.180]', '[00:01:49.370]'),
('<M1>', '[00:01:49.390]', '[00:01:50.140]'),
('<M2>', '[00:01:50.670]', '[00:02:01.350]'),
('<M2>', '[00:02:02.320]', '[00:02:20.150]'),
('<M2>', '[00:02:21.110]', '[00:02:39.040]')
]