0

回答された別の質問のフォローアップとして、次の形式のデータがあります。

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0

次の出力を実現する python 関数 (おそらく for ループ) を探しています。

34:1
27:1 33:1 36:1
20:1 32:1

最初の桁が、長さ 40 の長いビット パターンで使用されていた場所であることに注意してください。2 桁目 (コロンの後ろ) は、元の数字 '1' です。

私はPythonを初めて使用し、ここに質問を投稿して、Pythonの学習に大いに役立ちました. というわけで、どうすればいいのかわかる方がいらっしゃいましたら、ご回答よろしくお願いいたします。繰り返しますが、これは宿題ではありません。感情分析プログラムを作成しようとしています。SVM にはこのデータ形式が必要です。もう 1 つの形式は TiMBL 用に作成されています。

編集

一部の行には 0 しか含まれていません。以下の素晴らしい:)回答の出力では、出力テキストファイルに空の行が生成されます。これを防ぐ機能を追加するにはどうすればよいですか? または、ファイルを読み取り、改行を削除する新しい関数を作成しますか? それらをすべて削除してしまう気がするので、問題が発生する可能性があります。

4

3 に答える 3

0

別の方法として、問題を逆さまにして、入力データをセレクターとして提供し、1 から始まる一連の整数に対してitertools.compress関数に渡します。

import StringIO
from itertools import count, compress, imap
import contextlib
s = '''\
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0
0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0
'''
with contextlib.closing(StringIO.StringIO(s)) as f:
    for line in f:
            selectors = line.strip().split()
            selectors = imap(int, selectors)
            data = compress(count(1), selectors)
            print " ".join("{}:{}".format(x, 1) for x in data)

34:1
27:1 33:1 36:1
20:1 32:1
于 2013-06-03T18:50:42.933 に答える