Разбор целых терминов в фильтре ненормативной лексики Python/json

У меня есть файл JSON, содержащий условия для проверки на ненормативную лексику.

["bad", "word", "plug"]

И я использую это (найденный в другой статье) для анализа 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')  

Проблема в том, что если я использую строку "сантехник", она не проходит проверку из-за слова "plug" в файле json. Потому что "плю" существо в обоих терминах. Есть ли способ заставить все слово в файле JSON использоваться вместо частичного? Вывод после запуска не является ошибочным:

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

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

1 ответ

Вы можете использовать string.split() как способ выделения целых слов из field_name. Когда вы разделяете, он возвращает список каждой части строки, разделенной указанным разделителем. Используя это, вы можете проверить, присутствует ли профанный термин в разделенном списке:

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(" "):

Удаление пунктуации немного сложнее, но это должно помочь вам реализовать это.

Вполне возможно, что вам придется рассмотреть еще несколько крайних случаев, так что просто подумайте о двух быстрых случаях, о которых я подумал.

Другие вопросы по тегам