3

CNTKTextFormat にあるデータ ファイルのコメント列にアクセスする方法がわかりません。たとえば、このチュートリアルでは、次のものがあります。

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

コメントされたデータにアクセスするにはどうすればよいですか?

4

1 に答える 1

3

次のようにミニバッチ ソースをインスタンス化する場合:

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']})

この例は、上記の入力形式で機能します。実際の形式が異なる場合は、目的に合わせてこれを調整する必要があります。

于 2017-01-12T22:53:52.527 に答える