0

次のようにストップワードを削除するnltkスタイルで、いくつかの単語を除外したいプログラムに取り組んでいます。

def phrasefilter(phrase):
    phrase = phrase.replace('hi', 'hello')
    phrase = phrase.replace('hey', 'hello')
    phrase = re.sub('[^A-Za-z0-9\s]+', '', phrase.lower())
    noise_words_set = ['of', 'the', 'at', 'for', 'in', 'and', 'is', 'from', 'are', 'our', 'it', 'its', 'was', 'when', 'how', 'what', 'like', 'whats', 'now', 'panic', 'very']
    return ' '.join(w for w in phrase.split() if w.lower() not in noise_words_set)

web2py DALでこれを行う方法はありますか?

db.define_table( words,
    Field(words1, REQUIRES  IS_NOT_NULL(), REQUIRES....

たとえば、REQUIRES IS_NOT_IN_NOISE_WORDS_SET() 制約に入れたいと思います。これは可能ですか?上記のスニペットを使用する代わりに、選択したストップワードを自動的に削除するユーザー入力(データベースに保存された文字列を使用)に取り組んでいます。

4

1 に答える 1

0

いくつかのオプションがあります。まず、単純にフィルターとして機能するカスタム バリデーターを作成できます。バリデーターは値を受け取り、(場合によっては変換された) 値とNone、エラー メッセージのいずれかを含むタプルを返します (この場合、None値を変換するだけでチェックは行わないことを考えると、タプルの 2 番目の要素として返す必要があります)。エラー)。

def filter_noise_words(input):
    filtered_input = [code to remove stop words]
    return (filtered_input, None)

db.define_table('words',
                Field('words1', requires=[filter_noise_words, IS_NOT_EMPTY()]))

IS_NOT_EMPTYフィルタリング後の入力が空でないことを確認するために、バリデータはフィルタリングの後に来ることに注意してください。

別のオプションは、フィールドのfilter_in属性を介してフィルタリングを行うことです。

def filter_noise_words(input):
    filtered_input = [code to remove stop words]
    return filtered_input

db.define_table('words',
                Field('words1', requires=IS_NOT_EMPTY(), filter_in=filter_noise_words))

使用の利点はfilter_in、すべての挿入と更新 (DAL 経由で行われる) に適用されることですが、バリデーターは SQLFORM を使用する場合 (または特別なメソッド.validate_and_insert.validate_and_updateメソッドを明示的に呼び出す場合) にのみ適用されます。の欠点filter_inは、フィルターがバリデーターの後にIS_NOT_EMPTY適用されるため、事前にフィルター処理された入力に対して実行されることです。

最後に、保存する前に入力をフィルタリングするのではなく、元の入力を保存してから、フィルタリングされた入力を別の計算フィールドに保存するか、仮想フィールドを使用することを検討してください。

于 2015-06-11T14:53:58.193 に答える