6

驚いたことに、これを実際に行っている人を見つけることができませんでしたが、確かに誰かがそうしています。私は現在、約16,000語のスペルチェックを含むPythonプロジェクトに取り組んでいます。その単語数は残念ながら増えるだけです。現在、Mongoから単語を取得し、それらを繰り返し処理してから、pyenchantでスペルチェックを行っています。最初にすべてのアイテムをそこから取得することで、潜在的なボトルネックとしてのmongoを削除しました。そのため、16k語を処理するのに約20分かかります。これは、明らかに私が費やしたい時間よりも長くなります。これは私にいくつかのアイデア/質問を残します:

  1. 明らかに、スレッド化または何らかの形式の並列処理を活用できます。これを4つに切り刻んでも、最高のパフォーマンスを想定して約5分を見ています。

  2. Enchantがpyenchantの下で使用しているスペルライブラリを確認する方法はありますか?エンチャントのウェブサイトは、スペルチェック時に利用可能なすべてのスペルライブラリ/辞書を使用することを示唆しているようです。もしそうなら、私は潜在的に各単語を3〜4つのスペルの口述で実行しています。これはここでの私の問題かもしれませんが、それを証明するのに苦労しています。たとえそうだとしても、私のオプションは本当に他のライブラリをアンインストールするのですか?残念に聞こえます。

それで、これから少なくとももう少しパフォーマンスを引き出す方法についてのアイデアはありますか?これを並列タスクに分割することは問題ありませんが、それでも、実行する前に、コア部分を少し速くしたいと思います。

編集:申し訳ありませんが、朝のコーヒーの前に投稿しています...単語のスペルが間違っている場合、エンチャントは私に提案のリストを生成します。それは私がこの処理部分で私の時間のほとんどを費やす場所であるように思われます。

4

3 に答える 3

5

ここでのパフォーマンスのボトルネックはエンチャントであることに同意すると思います。このサイズのデータ​​セットの場合、ブール値を実行するのはほぼ瞬時isSpeltCorrectlyです。だから、なぜそうではありません:

  1. Enchantが実行する辞書を使用するか、独自の辞書(OpenOfficeなど)を取得して、正しくスペルト小麦の単語のメモリにセットを作成します。

    必要に応じて、ドキュメントの単語を一意化します。たとえば、単語を。に入れますset。これはおそらくあなたをあまり救わないでしょう。

  2. 各単語がセットに含まれているかどうかを確認します。これは単なるセットルックアップであるため、高速です。(おそらくO(log N)、Nは単語の数ですか?setハッシュによるバケットを想定し、バイナリ検索を実行します... Pythonの第一人者がここで私を修正できます。)

  3. そうでない場合は、エンチャントにその単語を推薦するように依頼しますこれは必然的に遅いです。

これは、ほとんどの単語のスペルが正しいことを前提としています。そうでない場合は、賢くする必要があります。

于 2010-08-10T14:52:44.067 に答える
2

PeterNorvigスタイルのスペルチェッカーを使用します。私はこれについて完全な投稿を書きました。

http://blog.mattalcock.com/2012/12/5/python-spell-checker/

これは、チェックする単語の可能な編集を調べるコードのスニペットです。

def edits1(word):
    s = [(word[:i], word[i:]) for i in range(len(word) + 1)]
    deletes    = [a + b[1:] for a, b in s if b]
    transposes = [a + b[1] + b[0] + b[2:] for a, b in s if len(b)>1]
    replaces   = [a + c + b[1:] for a, b in s for c in alphabet if b]
    inserts    = [a + c + b     for a, b in s for c in alphabet]
    return set(deletes + transposes + replaces + inserts)

増え続ける単語のデータファイルを繰り返し処理して、このコードで非常にすばやくチェックする必要があります。詳細については、投稿全体を参照してください。

http://blog.mattalcock.com/2012/12/5/python-spell-checker/

于 2013-01-26T17:56:35.307 に答える
1

おそらく、これを行うためのより良い方法は、ドキュメントを圧縮することです。これにより、単語の繰り返しインスタンスが削除されます。これにより、実際には1回だけスペルチェックを行う必要があります。独自の単語ファインダーを作成するよりもパフォーマンスが速い可能性があるため、これをお勧めします。

圧縮バージョンには、ファイル内のどこかに固有の単語への参照が含まれている必要があります。それらがどのように構造化されているかを調べる必要がある場合があります。

次に、すべての一意の単語のスペルチェックを行うことができます。個々のSQLクエリなどでそれらをチェックしていないことを願っています。ツリー形式の辞書をメモリにロードしてから、それに対して単語をチェックする必要があります。

これが完了したら、圧縮を解除するだけで、すべてのスペルチェックが行われます。これはかなり速い解決策になるはずです。

または、スペルチェックがコメントが示唆するほど高速である場合は、おそらく、圧縮プロセス全体を実行する必要はありません。これは、間違った実装を示します。

于 2010-08-10T14:53:19.137 に答える