非常に大きなテキスト ファイルを指定すると、ファイル内で 1 回だけ出現するすべての単語を削除したいと考えています。簡単で効率的な方法はありますか?
よろしくお願いします、
ファイルに対して 2 つのパスを実行する必要があります。
パス 1:
パス 2:
ランタイム:
O(n) の複雑さ
ファイルを 2 回通過する必要があります。ただし、まれな単語が本当にまれな場合は、2 番目のパスでファイルの大きなセクションのトークン化をスキップできます。最初に、ファイルを単語ごとにパススルーし、1 回出現した単語の検出位置、または 2 回出現した単語のプレースホルダー値を含む辞書を作成します。
MULTI_WORD = -1
word_locations = {}
for pos, word in tokenize(input_file):
if word not in word_locations:
word_locations[word] = pos
else:
word_locations[word] = MULTI_WORD
次に、編集が必要な位置を除外し、残りの部分を単純にコピーできます。
edit_points = [(pos, len(word)) for word, pos in word_locations.iteritems()
if pos != MULTI_WORD]
start_pos = 0
for end_pos, edit_length in edit_points:
input_file.seek(start_pos)
output_file.write(input_file.read(end_pos - start_pos))
start_pos = end_pos + edit_length
input_file.seek(start_pos)
output_file.write(input_file.read())
メモリのオーバーヘッドを節約するためのブロックごとのコピー手順や、エディット ポイントがない場合の特別なケースなど、さらにいくつかの最適化が必要になる場合があります。
参照する特定のコードがなければ知ることは困難ですが、開始するのに適した場所は Python 用の Natural Language Toolkit です。