私はPythonNLTKライブラリを使用して、大きなコーパスでステミングを実行しています。私は次のことをしています
text = [porter.stem(token) for token in text.split()]
text = ' '.join(text)
「テキスト」は私のファイルの1行を表しています。ファイルに何百万もの行があり、このプロセスには膨大な時間がかかります。この操作を行うためのより良い方法はありますか?
「何百万」とは何回、「膨大な時間」はどれくらいの時間ですか?ポーターステミングは複雑なアルゴリズムではなく、適度に高速である必要があります。何よりもI/Oが制限されているのではないかと思います。それでも...あなたが引き出すことができるいくつかの改善があるかもしれません。
順序が重要でなく、各語幹のすべてのコピーが必要ない場合は、辞書を使用したり、語幹を保存するように設定したりする方が簡単(かつメモリ効率が高い)になる場合があります。これにより、すでに見た単語を語幹にする必要がなくなり、パフォーマンスが向上し、各語幹を1回だけ保存できます。
例えば:
seenwords = set()
seenstems = set()
for line in input_file:
line = line.lower().split()
seenstems.union(porter.stem(token) for token in line if token not in seenwords)
seenwords.union(line)
これにより、単語が同じ行にある場合、単語を複数回ステミングできますが、後続の行では、それ以上語幹を作成する必要はありません。for
単語を1つずつ処理することもできます。これにより、同じ行で複数の単語をステミングすることを回避できますが、ループではなくジェネレータ式を使用する方が速度が向上します。