5

驚くほど迅速な対応に感謝します。スタックオーバーフローはすごい!

単語 (または何千もの単語) がキーワードを含む辞書と一致しているかどうかを確認する必要があります。

たとえば、文字列があるとします。文字"The fluffy fox jumped the friggin fence." 列の各単語をキーワードの辞書と照合し、一致する場合はすべての値を返す必要があります。

私はdictを作成しましたfilters:(uniqueidつまり、「lk2m3lk4m2」、残りは「静的」です。)

filters:
        { "fox" : [
                    { 'subscription' : 'uniqueid', 'link' : 'uniqueid' },
                    { 'subscription' : 'uniqueid', 'link' : 'uniqueid' }
                  ]},

        { "fence" : [
                      { 'subscription' : 'uniqueid', 'link' : 'uniqueid' }
                    ]}

...そして、文字列内の各単語に対してフィルターを反復することを計画しています (そして、おそらく 5000 単語/秒でこれを行う必要があります。つまり、パフォーマンスがすべての問題です。

フィルタ キーワードの数は数千に達する可能性がありますが、文字列は通常の文の長さ (つまり、5 ~ 20 語) を超えることはありません。したがって、文字列内の各単語を繰り返し処理し、フィルター リストに含まれているかどうかを確認します。しかし、毎秒 500 文で、まだ多くの計算を見ています。

たとえば、リスト(つまり、リスト内のdictのキー)をソートして、パフォーマンスを大幅に改善することは可能ですか? そして、私が使用すべきC実装はありますか(cjsonを使用してパフォーマンスを大幅に向上させているように)?

やや流動的な質問で申し訳ありませんが、このタスクはどうすればよいですか?

編集:

予想される入力:
"The fluffy fox jumped the friggin fence."
予想される出力:
{ 'subscription' : 'flskdmfslk32232', 'link' : 'sfdksmfls22323' }, { 'subscription' : '3023940fsdf', 'link' : 'sdflsfm223' }
(つまり、一致する各キーワードの下にリストされたサブスクリプション。)

4

2 に答える 2

4

filter.has_key(word) を実行するか、次のように実行するだけで、単語がフィルターのキーであるかどうかを判断できます。

subscriptions = filters.get(word)
if subscriptions is not None:
    pass # TODO do something with subscriptions

また:

try:
    subscriptions = filters[word]
    # TODO do something with subscriptions
except:
    pass # probably don't need to do anything if not present

フィルターの各エントリを反復処理する必要はありません。むしろ、入力文字列を分割し、各単語をセットに追加して (重複を排除するため)、セットを反復処理してフィルター辞書で各単語を検索する必要があります。

于 2012-11-12T20:46:40.567 に答える
2

Pythonでそれを行う最も速い方法は、辞書を使用して文の各単語を検索し、値を累積して関連付けることです。主なデータ構造はおそらく次のようになります。

filters = {
    "fox" : (
              ('uniqueid1', 'uniqueid2'),
              ('uniqueid3', 'uniqueid4'),
            ),
    "fence" : (
                ('uniqueid5', 'uniqueid6'),
              ),
          }

この方法を使用する(8ビット文字で):

from string import punctuation

sentence = 'The fluffy fox jumped the friggin fence.'
sentence = sentence.translate(None, punctuation)  # remove punctuation chars

print [filters.get(word) for word in sentence.split() if word in filters]

または、次のように高速である可能性があります(見つけるのに時間がかかります)。これにより、辞書の二重検索が回避されます。

from string import punctuation

def map_words(sentence):
    for word in sentence.translate(None, punctuation).split():
        try:
            yield filters[word]
        except KeyError:
            pass

sentence = 'The fluffy fox jumped the friggin fence.'
print [v for v in map_words(sentence)]

いずれにせよ、これは出力です。

[(('uniqueid1', 'uniqueid2'), ('uniqueid3', 'uniqueid4')), (('uniqueid5', 'uniqueid6'),)]
于 2012-11-12T20:44:00.090 に答える