如何使用Python构建一个毒性分类器

426 阅读6分钟

使用Python构建一个毒性分类器

本教程将使用detoxify的预训练模型来识别有毒的句子。我们将把这个模型整合到Gradio应用程序中,建立一个互动的应用程序,让用户输入一个句子。

该模型将给出一个输出,表明该句子是否有毒。

前提条件

要跟上这个教程,你需要。

  • 熟悉机器学习建模。
  • 使用谷歌Colab或Jupyter笔记本。
  • 熟悉Jigsaw多语言有毒评论分类数据集,因为该模型是在它上面训练的。

毒性分类器

毒性分类器可以对一个特定的文本或句子是否有毒进行分类。自从社交媒体时代兴起以来,网络欺凌一直是一个问题。许多人都以这样或那样的方式经历过网络欺凌。

在社交媒体网站上,人们有很多评论,其中大部分都有大量的消极性和毒性。主要的技术公司已经转向机器学习,帮助对有毒内容进行自动分类,以打击有毒内容和在线虐待。

事实上,今天已经部署了许多这样的自动化系统。例如,在Twitter上已经看到了这一点,该公司已经自动标记了超过一半的违反其规则的推文。

就在最近,2021年1月,唐纳德-特朗普的推特账户被永久停用,因为他的账户被认为会造成暴力煽动。这种自动化是由一个机器学习系统完成的。

谷歌研究团队建立的毒性分类器模型就是为此目的而建立的一个开源模型的例子。该模型可以检测句子是否包含有毒内容。这种毒性可能是以侮辱、威胁性语言、淫秽、基于身份的仇恨、基于性别的仇恨、或性爱语言的形式出现。

这个模型是建立在谷歌的通用句子编码器模型之上的,它提供了对单词、短语和句子的编码,甚至可能是更长的文本片段。该模型是在2015年至2017年间发表的用户生成的在线新闻评论的集合上训练的。

为了演示我们如何使用这个模型,我们将使用一个简单的Python例子来演示你如何在你的项目中实现这样一个模型。

安装detoxify模型并安装必要的依赖项

我们首先进行一个快速的pip 安装。

pip install detoxify

安装后,我们需要将其导入我们的Colab中。

from detoxify import Detoxify

使用该模型进行预测

在安装和导入模型后,我们需要将其加载到我们的笔记本中。我们通过使用我们在上面的步骤中导入的Detoxify 方法来做到这一点。加载模型后,我们将其保存在一个称为predictor 的变量中。

predictor = Detoxify('multilingual')

让我们尝试对一个简单的句子进行预测,以确定该句子是否有毒。

predictor.predict('Why are you so fat?')

在一些现代文化中,称某人为fat ,并不是什么大问题。但在其他文化中,他们可能会觉得这很冒犯。让我们看看这个模型是怎么想的。

输出。

{'identity_attack': 0.0020285994,
 'insult': 0.8864248,
 'obscene': 0.0039239605,
 'severe_toxicity': 9.833861e-05,
 'sexual_explicit': 0.0007071728,
 'threat': 0.00047757424,
 'toxicity': 0.9415722}

根据这个输出,我们可以解码出,模型认为这样的句子是一种侮辱和有毒的。

由于该模型是多语言的,我们可以尝试用法语进行预测。让我们对法语单词Je vous aime ,意思是I love you ,以确定它是否有毒。我们都知道它没有毒性,但让我们看看模型是否也是这样认为的。

predictor.predict('Je vous aime')

输出结果。

{'identity_attack': 0.0007130441,
 'insult': 0.005802411,
 'obscene': 0.012052586,
 'severe_toxicity': 0.0008066323,
 'sexual_explicit': 0.00037506246,
 'threat': 0.0006130718,
 'toxicity': 0.0023800838}

正如预期的那样,模型没有把这个句子归类为有毒。结果显示这样一个句子的毒性非常低。

请记住,这仅仅是针对一个单一的句子。如果我们想让模型对几个句子的毒性进行分类呢?我们可以创建一个我们希望模型分类的句子列表,然后运行一个循环让模型进行分类。

sentences = [
        'You suck!',
        'How much is this bag?',
        'Why do you always get to be an jerk?',
        'I bought this gift for my mother',
        'I will hurt you'
]

在上面的代码中,我们所做的就是创建一个名为sentences 的变量,该变量持有一个我们想要分类的所有句子的数组。我们现在需要对它们进行循环。

for sentence in sentences:
    results = predictor.predict(sentence)
    print (results)

输出结果。

{'toxicity': 0.99660456, 'severe_toxicity': 0.012938017, 'obscene': 0.575454, 'identity_attack': 0.0018781582, 'insult': 0.9799171, 'threat': 0.004116686, 'sexual_explicit': 0.080397494}
{'toxicity': 0.0016920721, 'severe_toxicity': 1.4579835e-05, 'obscene': 0.00018599258, 'identity_attack': 7.167015e-05, 'insult': 0.0005639612, 'threat': 3.5181794e-05, 'sexual_explicit': 2.9744933e-05}
{'toxicity': 0.99021566, 'severe_toxicity': 0.016646694, 'obscene': 0.8672117, 'identity_attack': 0.013259668, 'insult': 0.92916876, 'threat': 0.0023937696, 'sexual_explicit': 0.058671534}
{'toxicity': 0.00089999853, 'severe_toxicity': 1.5985268e-05, 'obscene': 0.000108549386, 'identity_attack': 0.00012365123, 'insult': 0.00023804733, 'threat': 3.0528885e-05, 'sexual_explicit': 2.781837e-05}
{'toxicity': 0.99378043, 'severe_toxicity': 0.046788186, 'obscene': 0.08628249, 'identity_attack': 0.02743811, 'insult': 0.07973734, 'threat': 0.912243, 'sexual_explicit': 0.098065615}

这些结果表明。

  • 第一个句子是有毒的和侮辱性的。
  • 第二句话没有毒性。
  • 第三句话是有毒的、淫秽的和侮辱性的。
  • 第四句话没有毒性。
  • 最后一句话是有毒和威胁性的。

我们可以将这个模型整合到gradio应用程序中,使其更方便用户使用。

使用Gradio将模型部署为一个应用程序

Gradio是一个Python库,允许我们为你的机器学习模型快速实现一个用户界面。在本教程中,我们将用它来创建一个用户界面,用户可以输入一个句子,而模型将输出一个句子,告诉用户这个句子是否有毒。

让我们首先把Gradio安装到我们的笔记本上。我们通过进行快速的pip 安装来做到这一点。

!pip install gradio

安装后,我们把它导入我们的模型,在我们的代码中使用gr 。这意味着我们将把gradio应用程序称为gr ,而不是在我们的代码中使用它的全名。这使我们的代码更加简洁。

import gradio as gr

我们现在要写一个Python函数classify ,我们希望我们的gradio应用能在这个函数上运行。

def classify(sentence):
    results = predictor.predict(sentence)
    print (results)

我们首先需要定义我们的输入。我们把它们保存在一个叫做toxicity_inputs 的变量中。

toxicity_inputs = gr.inputs.Textbox(lines=3, placeholder="Enter sentence to know its toxicity...")

使用Interface() 方法,我们需要传入几个参数以使Gradio应用程序工作。函数,fninputsoutputs ,和title 。我们将这些结果存储在一个称为interface 的变量中。

interface = gr.Interface(fn=classify, 
                        inputs=toxicity_inputs,
                        outputs='text',
                        title='Toxicity Classifier')

为了启动我们的Gradio应用程序,我们使用launch() 方法在终端上打开我们的应用程序。你可以使用生成的链接在浏览器上打开该应用程序。

interface.launch()

Gradio

我们已经成功地使用Gradio建立了一个多语言的毒性分类器。

收尾工作

正如我们所看到的,创建你的毒性分类器真的很简单。当然,这并不是说要用于生产规模的应用,但它给你提供了开源模型的基础知识,你可以用来建立你的模型。请随时在下面的参考资料部分进一步阅读文档。