使用 CNTKTextFormat reader 时如何访问评论栏?
How can I access the comment columns when using CNTKTextFormat reader?
我不知道如何访问 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
如何访问评论数据?
如果您像这样实例化您的小批量源:
data_source = (CTFDeserializer("mydata.ctf", ...), randomize=False, ...)
然后您可以使用 Python 打开您传递给 CTFDeserializer 的输入文件,并逐个小批量解析它。 非常重要设置randomize=False
否则reader和你下面的手动解析将不同步。例如,如果文件对象是 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']})
此示例适用于上述输入格式。如果您的实际格式不同,则必须根据您的目的进行调整。
我不知道如何访问 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
如何访问评论数据?
如果您像这样实例化您的小批量源:
data_source = (CTFDeserializer("mydata.ctf", ...), randomize=False, ...)
然后您可以使用 Python 打开您传递给 CTFDeserializer 的输入文件,并逐个小批量解析它。 非常重要设置randomize=False
否则reader和你下面的手动解析将不同步。例如,如果文件对象是 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']})
此示例适用于上述输入格式。如果您的实际格式不同,则必须根据您的目的进行调整。