2016-07-28 9 views
0

私は、profanityフィルタをチェックするための用語を含むjsonファイルを持っています。Python/json profanity filterで用語全体を解析する

これを使用して(別の記事から検索)、jsonを解析し、設定された単語のデータオブジェクトを検索します。

def word_filter(self, *field_names): 

    import json 
    from pprint import pprint 

    with open('/var/www/groupclique/website/swearWords.json') as data_file:  
     data = json.load(data_file) 

    for field_name in field_names: 
     for term in data: 
      if term in field_name: 
       self.add_validation_error(
        field_name, 
        "%s has profanity" % field_name) 


class JobListing(BaseProtectedModel): 
    id = db.Column(db.Integer, primary_key=True) 
    category = db.Column(db.String(255)) 
    job_title = db.Column(db.String(255)) 

    @before_flush 
    def clean(self): 
     self.word_filter('job_title') 

"plumber"という文字列を使用すると、jsonファイルの "plug"という単語のチェックに失敗します。 "plu"は両方の用語にあるからです。 jsonファイル内の単語全体を部分的ではなく強制的に使用する方法はありますか?出力は、一度誤っイマイチ走っ:

({ "validation_errors": { "job_title": " job_title has profanity" } }) 

HTTP PAYLOAD: 
{ 
    "job_title":"plumber",  
} 
+0

あなたのコードセグメント(またはそれが非常に大きい場合はそのサブセット)に 'field_names'定義を追加できますか?またコードを実行するときの出力 –

+0

私はあなたが求めたものを追加したと信じています。 – draxous

+0

おそらくあなたが過ごしているデータは、あなたが思うタイプのものではないと思います。 'word_filter'(' job_title ') 'を' word_filter'メソッドの中で呼び出すと、 'field_names'は'(' job_title '、) 'という内容、つまりその中に1つの文字列を持つタプルを持ちます。 'if term in field_name'テストは' test_title 'の '' plug'に相当します。これは基本的に ''plug'が' test_title 'という文字列の部分文字列として存在するのでしょうか?私はそれがあなたがやろうとしていることではないと思います...または間違っていますか? –

答えて

0

あなたはFIELD_NAMEの単語全体を隔離するための方法としてのstring.Split()を使用することができます。分割すると、指定された区切り文字で分割された文字列の各部分のリストが返されます。不敬用語はスプリットリストにあるかどうかをチェックすることができ、という使い方:句読点や並べ替えのようなものがある場合、これはdicey取得

import json 

with open('terms.json') as data_file:  
    data = json.load(data_file) 

for field_name in field_names: 
    for term in data: 
     if term in field_name.split(" "): 
      self.add_validation_error(
       field_name, 
       "%s has profanity" % field_name) 

です。例えば、「ここは太陽が来る」という文章です。悪い言葉 "太陽"と一致しないし、 "ここ"と一致しません。

if term in field_name.lower().split(" "): 

削除句読点はもう少し複雑ですが、thisは、あなたがそれを実装するのに役立つはずです:資本の問題を解決するには、小文字に全体の入力を変更したいと思います。

あなたが考慮する必要があるエッジケースが多いかもしれませんので、私が考えた2つの素早いヘッドアップに頭を上げてください。

+0

私はこの提案を使用するとき、私は 'plumber'という単一の単語を使用してもはや 'plu'をチェックしないようにしますが、 'bad'や 'word'のような直接的な単語を使用すると、 1つあるはずです。 PS。これは、任意のタイプのテキストフィールドvarchar、longtextなどである可能性があります。したがって、チェックする単語の段落がある可能性があります。私は、フィルターがフィルターファイル内のどんな種類のダイレクトワードの使用をもチェックするようにしたいだけです。部分的ではありません。 – draxous

関連する問題