使用CNTKTextFormat阅读器时如何访问注释列?

时间:2017-01-12 22:49:02

标签: cntk

我无法弄清楚如何访问CNTKTextFormat中数据文件中的注释列。例如,在此tutorial中,您有以下内容:

19  |S0 178:1 |# BOS      |S1 14:1 |# flight  |S2 128:1 |# O
19  |S0 770:1 |# show                         |S2 128:1 |# O
19  |S0 429:1 |# flights                      |S2 128:1 |# O

如何访问评论数据?

1 个答案:

答案 0 :(得分:3)

如果您像这样实例化您的小批量来源:

data_source = (CTFDeserializer("mydata.ctf", ...), randomize=False, ...)

然后,您可以打开使用Python传递给CTFDeserializer的输入文件,并通过minibatch解析它。设置randomize=False 非常重要,否则读者和下面的手动解析将不会同步。例如,如果文件对象为stream且小批量大小为batch_size,则以下代码将打印每个序列的注释列作为将前一列名称(S0,S1或S0)映射到序列的字典在注释列中找到的字符串。

来自itertools import groupby      来自集合import 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']})

此示例适用于上述输入格式。如果您的实际格式不同,则必须根据您的目的进行调整。