0

我有一个 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')  

问题是如果我使用字符串“plumber”,由于 json 文件中的“plug”一词,它会导致检查失败。因为“plu”在这两个方面都有。有没有办法强制使用 json 文件中的整个单词而不是部分单词?运行一次的输出没有错误:

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

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

1 回答 1

2

您可以使用 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)

如果有标点符号或类似的东西,这会变得很冒险。例如,句子:“太阳来了”。不会匹配坏词“sun”,也不会匹配“here”。要解决大写问题,您需要将整个输入更改为小写:

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

删除标点符号有点复杂,但这应该可以帮助您实现这一点。

您可能需要考虑更多的边缘情况,所以只提一下我想到的两个快速的情况。

于 2016-07-28T17:57:14.813 回答