用GraphQL建立一个脏话过滤的API

506 阅读6分钟

编者注:本文中的脏话例子用 "亵渎 "一词表示,以保持对所有受众的包容性和适当性。

检测和过滤脏话是你在构建用户发布(或与之互动)文本的应用程序时必然会遇到的一项任务。这可能是社交媒体应用程序、评论区或游戏聊天室,仅举几例。

如果你的应用程序需要,拥有检测脏话以将其过滤掉的能力是保持交流空间安全和适合年龄的解决方案。

本教程将指导你使用Python和Flask构建一个GraphQL API来检测和过滤亵渎。如果你只是对代码感兴趣,你可以访问这个GitHub repo获取演示应用程序的源代码。

前提条件

要遵循和理解本教程,你将需要以下条件。

  • 在你的机器上安装Python 3.7或更高版本
  • Flask的基本知识
  • GraphQL的基本知识
  • 一个文本编辑器

什么是脏话?

脏话(也被称为骂人的话或脏话)指的是冒犯性的、不礼貌的或粗鲁的用词和语言。脏话也有助于显示或表达对某事的强烈感受。脏话会使在线空间对用户产生敌意,这对一个为广大用户设计的应用程序来说是不可取的。

哪些词符合亵渎的条件,由你决定。本教程将解释如何单独过滤词语,因此你可以控制你的应用程序允许什么类型的语言。

什么是脏话过滤器?

脏话过滤器是一种软件或应用程序,它帮助检测、过滤或修改通信空间中被认为是亵渎的词语。

为什么我们要检测和过滤脏话?

  • 促进人与人之间的健康互动,特别是当涉及到儿童的时候
  • 通过为人们创造一个积极的交流环境来改善社会经验
  • 为用户社区增加一个额外的安全层
  • 自动阻止和过滤交流空间中不需要的内容
  • 减少在线社区中对用户人工审核的需求

检测脏话时面临的常见问题

  • 用户可能开始使用语言颠覆来绕过过滤器
  • 用户可能开始操纵语言,用数字和Unicode字符替换字母,或创造性地拼错单词,以绕过过滤器。
  • 脏话过滤器在过滤内容时可能没有考虑上下文。
  • 脏话过滤器在过滤时经常会产生误报,例如斯肯索普问题

用Python检测脏话

使用Python,让我们建立一个应用程序,告诉我们一个给定的字符串是否亵渎,然后继续过滤它。

创建一个基于词表的亵渎检测器

为了创建我们的亵渎过滤器,我们将创建一个不被接受的单词列表,然后检查一个给定的字符串是否包含其中任何一个。如果检测到亵渎,我们将用一个审查文本替换亵渎的单词。

创建一个名为filter.py 的文件,并在其中保存以下代码。

def filter_profanity(sentence):
    wordlist = ["profanity1", "profanity2", "profanity3", "profanity4", "profanity5", "profanity6", "profanity7", "profanity8"]

    sentence = sentence.lower()
    for word in sentence.split():
        if word in wordlist:
            sentence = sentence.replace(word, "****")

    return sentence

测试我们基于词表的过滤器

如果你将以下参数传递给上面的函数。

filter_profanity("profane insult")
filter_profanity("this is a profane word")
filter_profanity("Don't use profane language")

你会得到以下结果。

******* ******
this is a ******* word
Don't use ******* language

然而,这种方法有很多问题,从无法检测其单词列表之外的亵渎行为到容易被拼写错误或单词的间距所欺骗。它还要求我们定期维护我们的词表,这在我们已经存在的问题上又增加了许多问题。我们如何改进我们拥有的东西呢?

使用better-profanity Python库来改进我们的过滤器

Better-profanity是一个速度极快的Python库,用于检查(和清理)字符串中的亵渎行为。它支持自定义单词列表、安全列表、检测修改过的单词拼写中的脏话、Unicode字符(也叫leetspeak),甚至支持多语言脏话检测。

安装better-profanity库

要开始使用better-profanity,你必须首先通过pip 安装该库。

在终端中,输入。

pip install better-profanity

将better-profanity整合到我们的过滤器中

现在,用以下代码更新filter.py 文件。

from better_profanity import profanity

profanity.load_censor_words()


def filter_profanity(sentence):
    return profanity.censor(sentence)

测试基于better-profanity的过滤器

如果你再一次向上面的函数传递以下参数。

filter_profanity("profane word")
filter_profanity("you are a profane word")
filter_profanity("Don't be profane")

你会得到以下结果,正如预期的那样。

******* ****
you are a ******* ****
Don't be *******

就像我之前提到的,better-profanity支持对修改过的单词拼写进行亵渎性检测,所以下面的例子会被准确地审查出来。

filter_profanity("pr0f4ne 1n5ult") # ******* ******
filter_profanity("you are Pr0F4N3") # you are *******

better-profanity也有一些功能来判断一个字符串是否是亵渎性的。要做到这一点,请使用。

profanity.contains_profanity("Pr0f4ni7y") # True
profanity.contains_profanity("hello world") # False

Better-profanity还允许我们提供一个字符来审查亵渎行为。要做到这一点,请使用。

profanity.censor("profanity", "@") # @@@@
profanity.censor("you smell like profanity", "&") # you smell like &&&&

为我们的过滤器建立一个GraphQL API

我们已经创建了一个Python脚本来检测和过滤亵渎,但它在现实世界中是非常无用的,因为没有其他平台可以使用我们的服务。我们需要用Flask为我们的脏话过滤器建立一个GraphQL API,这样我们就可以把它称为一个实际的应用程序,在Python环境之外的地方使用它。

安装应用程序的要求

为了开始工作,你必须首先通过pip 安装几个库。

在终端中,输入。

pip install Flask Flask_GraphQL graphene

编写应用程序的GraphQL模式

接下来,让我们为API编写我们的GraphQL模式。创建一个名为schema.py 的文件,并在其中保存以下代码。

import graphene
from better_profanity import profanity


class Result(graphene.ObjectType):
    sentence = graphene.String()
    is_profane = graphene.Boolean()
    censored_sentence = graphene.String()


class Query(graphene.ObjectType):
    detect_profanity = graphene.Field(Result, sentence=graphene.String(
        required=True), character=graphene.String(default_value="*"))

    def resolve_detect_profanity(self, info, sentence, character):
        is_profane = profanity.contains_profanity(sentence)
        censored_sentence = profanity.censor(sentence, character)
        return Result(
            sentence=sentence,
            is_profane=is_profane,
            censored_sentence=censored_sentence
        )


profanity.load_censor_words()
schema = graphene.Schema(query=Query)

为GraphQL配置我们的应用服务器

之后,创建另一个名为server.py 的文件,并在其中保存以下代码。

from flask import Flask
from flask_graphql import GraphQLView
from schema import schema

app = Flask(__name__)
app.add_url_rule("/", view_func=GraphQLView.as_view("graphql",
                 schema=schema, graphiql=True))


if __name__ == "__main__":
    app.run(debug=True)

运行GraphQL服务器

要运行服务器,执行server.py 脚本。

在终端中,输入。

python server.py

你的终端应该看起来像下面这样。

Screenshot of terminal after installation of profanity filter

测试GraphQL API

在终端中运行server.py 文件后,前往你的浏览器并打开URLhttp://127.0.0.1:5000。你应该可以访问GraphiQL界面,并得到一个类似于下面图片的响应。

Screenshot of blank GraphiQL interface

我们可以通过在GraphiQL界面上运行下面这样的查询来测试API。

{
  detectProfanity(sentence: "profanity!") {
    sentence
    isProfane
    censoredSentence
  }
}

结果应该与下面的图片相似。

Screenshot of GraphiQL interface with "this is a profane word" string returning the boolean "true" and being censored to "this is a ******* word"

Same screenshot as before, except the profane word is censored with @ signs

Same screenshot as before, except instead of a profane word, the function reads "hello world" and the boolean for "is profanity" returns "false"

结论

这篇文章让我们了解了亵渎检测,它的重要性,以及它的实现。此外,我们看到用Python、Flask和GraphQL构建一个亵渎检测API是多么容易。

GraphQL API的源代码可以在GitHub上找到。你可以从其官方文档中了解更多关于better-profanity Python库的信息。