Если экземпляр ваш источник minibatch так:
data_source = (CTFDeserializer("mydata.ctf", ...), randomize=False, ...)
вы можете открыть входной файл, который вы передаёте CTFDeserializer с Python и разобрать его minibatch по minibatch. Это очень важно, чтобы установить randomize=False
, иначе читатель и ваш синтаксический разбор вручную не будут синхронизированы. Например, если объект файла имеет значение stream
, а размер мини-бара - batch_size
, следующий код будет печатать столбцы с комментариями каждой последовательности в качестве словаря, сопоставляющего имя предыдущего столбца (S0, S1 или S0) с последовательностью строк, найденных в столбцах комментариев.
из itertools импорта GroupBy из коллекций импорта defaultdict
stream = open("mydata.ctf")
lines = [stream.readline() for i in range(batch_size)]
for seqid, sequence in groupby(lines, lambda s:s.split()[0]):
mapping = defaultdict(list)
for sample in sequence:
parts = sample.split('|')
unused = [mapping[parts[i-1].split(' ')[0].strip()].append(p.strip()) for i, p in enumerate(parts) if p.startswith('#')]
print(seqid, mapping)
Для приведенного выше примера ввода он производит:
19 defaultdict(<class 'list'>, {'S0': ['# BOS', '# show', '# flights'], 'S2': ['# O', '# O', '# O'], 'S1': ['# flight']})
Этот пример будет работать для вышеприведенного формата входного сигнала. Если ваш фактический формат отличается, вам придется адаптировать его для своих целей.