次のようにミニバッチ ソースをインスタンス化する場合:
data_source = (CTFDeserializer("mydata.ctf", ...), randomize=False, ...)
その後、CTFDeserializer に渡した入力ファイルを Python で開き、ミニバッチごとに解析できます。それ以外の場合は、リーダーと以下の手動解析が同期しないように設定することが非常に重要です。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']})
この例は、上記の入力形式で機能します。実際の形式が異なる場合は、目的に合わせてこれを調整する必要があります。