1

音声学と正書法に従って英語の単語を探すのに役立つ語彙辞書を作成しています。この辞書は、私が子供たちに教える必要のある英語の単語の具体例を見つけるのに役立ちます。

このために、私は約200kの単語キーを使用して大きなPython辞書を作成しました。その値は、音声学です。

たとえば、最後の-aK * e書記素を持つ単語を検索するために、K *は任意の量の子音であり、正規表現を使用してすべてのキーを解析できます。

ただし、実際に単語をグリッドに記述されているかのようにマッピングする方が少し賢いと思いました。したがって、最後の文字が-eなどであるすべての単語を「ブックマーク」することができます。したがって、単語を検索するときは、それらのブックマークを呼び出すだけで、ヒットすることを確認し、上記の例のように複数の条件の検索を実行するたびに、解析する単語の量を減らすことができます。

私の戦略は本当に意味がありますか?それとも、正規表現を使用する方法ですか?

プログラムする時間がほとんどないので、タイピングに貴重な時間を費やす前に、専門家のアドバイスをお願いします。ありがとう。

4

1 に答える 1

2

triesこれらの質問に答えるのが非常に速く効率的になるのは事実です。常に単語の最後から検索するのか、最初から検索するのかは少しわかりませんが、両方の単語の少しになる場合は、両方の方向の試行を作成する必要があります。そして、もしあなたが真ん中でマッチを見つける必要があるなら、どちらのトライも助けにはならないでしょう。

リバースインデックス(検索エンジンを強化するものなど)は、単語を文字n-gramとして保存し、n-gram間の接続情報を保存して単語を作成することでこれを回避することがあります。たとえば、「オーバーフロー」は「ove」、「rfl」、「ow」に分割され、これら3つのn-gramを組み合わせた単語が存在することに注意してメタデータがどこかに存在します。各単語をさまざまな方法で分割すると、ワイルドカードクエリの先頭と末尾が有効になりますが、詳細についてはあいまいです:-/

または、このアプリケーションでパフォーマンスが本当に重要でない限り、正規表現の使用はこの種の辞書サイズに対しておそらく十分に高速であり(おそらくさらに最適化できる可能性があります)、非常に簡単であるという事実を考慮してください。80k語の辞書を使用した手っ取り早いテスト:

with open('dictionary.txt') as fin:
    words = fin.read().strip().split('\n')

import re
import time
expr = re.compile(r'a[^aeiouy]+e$', re.I)

# Of course, this extends easily to using a dictionary, too
def bench():
    start = -time.time()
    matches = [word for word in words if expr.search(word)]
    return start + time.time()

私のコンピューターでは約50ミリ秒かかります。正規表現を使用することの単純さと明快さ、そして限られた時間のために、それは価値があると思います。

于 2013-03-27T05:28:20.340 に答える