2016-07-28 6 views
0

Ich habe eine JSON-Datei mit Begriffen für einen Profanitätsfilter gegen zu überprüfen.Parsen ganze Begriffe in Python/Json Profanity-Filter

Und ich verwende dies (aus einem anderen Artikel gefunden), um den JSON zu analysieren und jedes Datenobjekt nach gesetzten Wörtern zu durchsuchen.

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') 

Das Problem ist, wenn ich die Zeichenfolge „Klempner“ verwenden, um die Kontrolle aufgrund des Wortes „Plug“ in der JSON-Datei fehlschlägt. Weil "plu" in beiden Begriffen ist. Gibt es eine Möglichkeit, das gesamte Wort in der JSON-Datei statt einer partiellen zu erzwingen? Ausgabe einmal lief fehlerhaft ist nicht:

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

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

Können Sie die 'field_names' Definition zu Ihrem Codesegment hinzufügen (oder eine Teilmenge davon, wenn es sehr groß ist). Auch Ihre Ausgabe, wenn Sie den Code –

+0

ausführen Ich glaube, ich fügte hinzu, was Sie gefragt haben. – draxous

+0

Ich denke, dass die Daten, die Sie herumreichen, nicht von dem Typ sind, von dem Sie denken, dass er es ist. Wenn Sie 'word_filter ('job_title')' dann innerhalb der 'word_filter'-Methode aufrufen, hat 'field_names' die Inhalte' (' job_title ',) ', d. H. Ein Tupel mit einer Zeichenkette darin. Ihr 'if term in field_name' Test ist dann äquivalent zu' 'plug' in 'test_title'', was im Grunde bedeutet, dass' Does 'plug' als Teilstring in der Zeichenkette 'test_title' existiert? ". Ich glaube nicht, dass du das versuchst ... oder liege ich falsch? –

Antwort

0

Sie verwenden string.split() als eine Möglichkeit, ganze Worte des field_name zu isolieren. Wenn Sie teilen, wird eine Liste aller Teile der Zeichenfolge zurückgegeben, die durch das angegebene Trennzeichen getrennt wurden. Mit dem können Sie überprüfen, ob der profane Begriff in der Liste geteilt wird:

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) 

Wo dies heikel wird, wenn es Zeichensetzung oder etwas Derartiges ist. Zum Beispiel der Satz: "Hier kommt die Sonne." wird nicht mit dem schlechten Wort "Sonne" übereinstimmen, noch wird es mit "hier" übereinstimmen. Um das Kapital Problem zu lösen, sollten Sie die gesamte Eingabe in Kleinbuchstabe ändern:

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

Entfernen Interpunktion ein bisschen mehr beteiligt ist, aber this sollen Ihnen helfen, das umzusetzen.

Es kann durchaus sein, dass Sie mehr Randfälle haben, die Sie in Betracht ziehen müssen, also denken Sie nur an zwei schnelle Köpfe, an die ich gedacht habe.

+0

Wenn ich diesen Vorschlag benutze, funktioniert es, wenn ich das einzelne Wort "Klempner" benutze, so dass es nicht mehr nur "plu" prüft, aber wenn ich ein direktes Wort wie "schlecht" oder "Wort" verwende, übergibt es ohne Fehler wo da sollte einer sein. PS. Dies könnte eine beliebige Art von Textfeld varchar, longtext usw. sein. Es könnte also Absätze von Wörtern geben, die überprüft werden sollen. Ich möchte nur, dass der Filter prüft, ob irgendwelche direkten Wörter in der Filterdatei verwendet werden. Keine Teiltöne. – draxous

Verwandte Themen