2

(潜在的に大きな) ファイルを取り込む Python スクリプトを作成しています。入力ファイルをフォーマットする方法の例を次に示します。

class1 1:v1 2:v2 3:v3 4:v4 5:v5
class2 1:v6 4:v7 5:v8 6:v9
class1 3:v10 4:v11 5:v12 6:v13 8:v14
class2 1:v15 2:v16 3:v17 5:v18 7:v19

class1 と class2 は、1 と -1 などの数値です。(好奇心旺盛なユーザーは、これが LIBSVM 関連のファイルであることに気付くかもしれませんが、この場合、ソフトウェアを知る必要はありません。) 値 v1、v2、...、v19 は、任意の整数または浮動小数点値を表します。明らかに、私のファイルは、総行数と 1 行あたりの長さの点で、これよりもはるかに大きくなります。これが、ここで効率を懸念する理由です。

コロンの左側の最大値を確認しようとしています。LIBSVM では、これらは「機能」と呼ばれ、ここでは常に整数です。たとえば、上で概説した例では、1 行目に最大の特徴として 5 があります。ライン 2 は最大のフィーチャとして 6 を持ち、ライン 3 は最大のフィーチャとして 8 を持ち、最後にライン 4 は最大のフィーチャとして 7 を持ちます。8 はこれらの値の最大値であるため、これが私の目的の値です。1行に数千の機能があり、数十万行ファイルを見ています。

このファイルは、次のプロパティを満たしています。

  1. 機能は厳密に増加する必要があります。つまり、「3:v1 4:v2」は許可されますが、「3:v1 3:v2」は許可されません。
  2. 機能は必ずしも連続しているとは限らず、スキップできます。私が示した最初の例では、最初の行には連続した順序 (1、2、3、4、5) の機能があり、機能 6、7、および 8 はスキップされます。他の 3 つの行には、連続した順序で機能がありません。それらの機能が厳密に増加している限り、それは問題ありません。

今のところ、私のアプローチは、各行をチェックし、各行をスペースで分割し、最後の用語をコロンで分割してから、特徴量をチェックすることです。それに続いて、そのような最大の featureNum を確認する手順を実行します。

file1 = open(...)
max = 0
for line in file1:
    linesplit = line.rstrip('\n').split(' ')
    val = linesplit[len(linesplit) - 1]
    valsplit = val.split(':')
    featureNum = valsplit[0]
    if (featureNum > max):
        max = featureNum
 print max
 file1.close()

しかし、これを行うためのより良い、またはより効率的な方法があることを願っています。たとえば、改行文字の直前にある用語のみを取得してファイルを分析する方法です (おそらくすべての行を読み取らないようにするためですか?)。私は Python を初めて使用するので、明らかな何かを見逃しても驚かないでしょう。

可能な参照: http://docs.python.org/library/stdtypes.html

4

1 に答える 1

1

ライン内のすべての機能を気にするのではなく、最後の機能だけを気にするので、ライン全体を分割する必要はありません。これが実際に速いかどうかはわかりませんが、時間を計って確認する必要があります。行全体を分割するほどPythonicではありません。

def last_feature(line):
    start = line.rfind(' ') + 1
    end = line.rfind(':')
    return int(line[start:end])

with open(...) as file1:
    largest = max(last_feature(line) for line in file1)
于 2012-07-10T16:45:44.710 に答える