面向开发人员的 DeepPavlov:#1 NLP 工具和聊天机器人创建

大家好! 我们将开设一系列文章,致力于解决与自然语言处理(自然语言处理或简称 NLP)相关的实际问题以及使用开源库创建对话代理(聊天机器人) 深帕夫洛夫,它是由我们 MIPT 神经系统和深度学习实验室的团队开发的。 该系列的主要目标是将 DeepPavlov 介绍给广泛的开发人员,并向您展示如何在没有机器学习和数学博士学位的深入知识的情况下解决应用 NLP 问题。

NLP 任务包括确定文本的情感、解析命名实体、确定对话者想要从您的机器人那里得到什么:订购披萨或获取背景信息等等。 您可以阅读有关 NLP 任务和方法的更多信息 这里.

在本文中,我们将向您展示如何使用预先训练的 NLP 模型运行 REST 服务器,无需任何额外的配置或培训即可使用。

面向开发人员的 DeepPavlov:#1 NLP 工具和聊天机器人创建

深巴甫洛夫的安装

此处和下文将给出针对 Linux 的说明。 对于 Windows,请参阅我们的 文件

  • 使用当前支持的 Python 版本创建并激活虚拟环境:
    virtualelnv env -p python3.7
    source env/bin/activate
  • 在虚拟环境中安装 DeepPavlov:
    pip install deeppavlov
    

使用 DeepPavlov 模型启动 REST 服务器

在我们首次使用 DeepPavlov 模型启动服务器之前,讨论该库架构的一些功能将很有用。

DP 中的任何模型都包含:

  • Python代码;
  • 可下载组件 - 针对特定数据(嵌入、神经网络权重等)的序列化训练结果;
  • 配置文件(以下简称config),包含模型使用的类、下载组件的URL、Python依赖等信息。

我们将在接下来的文章中向您详细介绍 DeepPavlov 的原理,目前我们知道这一点就足够了:

  • DeepPavlov 中的任何模型都通过其配置名称来标识;
  • 要运行该模型,您需要从 DeepPavlov 服务器下载其组件;
  • 此外,要运行模型,您需要安装它使用的 Python 库。

我们将推出的第一个模型将是多语言命名实体识别(NER)。 该模型根据文本单词所属的命名实体的类型(专有名称、地名、货币名称等)对文本单词进行分类。 当前最新版本 NER 的配置名称:

ner_ontonotes_bert_mult

我们使用以下模型启动 REST 服务器:

  1. 我们将其配置中指定的模型依赖项安装到活动虚拟环境中:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. 从 DeepPavlov 服务器下载序列化模型组件:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    序列化的组件将下载到 DeepPavlov 主目录,默认位于该目录

    ~/.deeppavlov

    下载时,已下载组件的哈希值将与服务器上组件的哈希值进行检查。 如果存在匹配,则跳过下载并使用现有文件。 下载组件的大小平均为 0.5 到 8 Gb,在某些情况下解压缩后可达 20 Gb。

  3. 我们使用以下模型启动 REST 服务器:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

执行此命令的结果是,将在主机的端口 5005 上启动具有模型的 REST 服务器(默认端口为 5000)。

初始化模型后,可以在 URL 找到带有 API 文档和测试能力的 Swagger http://127.0.0.1:5005。 让我们通过将模型发送到端点来测试模型 http://127.0.0.1:5005/model 具有以下 JSON 内容的 POST 请求:

{
  "x": [
    "В МФТИ можно добраться на электричке с Савёловского Вокзала.",
    "В юго-западной Руси стог жита оценен в 15 гривен"
  ]
}

作为响应,我们应该收到以下 JSON:

[
  [
    ["В", "МФТИ", "можно", "добраться", "на", "электричке", "с", "Савёловского", "Вокзала", "."],
    ["O", "B-FAC", "O", "O", "O", "O", "O", "B-FAC", "I-FAC", "O"]
  ],
  [
    ["В", "юго", "-", "западной", "Руси", "стог", "жита", "оценен", "в", "15", "гривен"],
    ["O", "B-LOC", "I-LOC", "I-LOC", "I-LOC", "O", "O", "O", "O", "B-MONEY", "I-MONEY"]
  ]
]

使用这些示例,我们将分析 DeepPavlov REST API。

API 深度巴甫洛夫

每个 DeepPavlov 模型至少有一个输入参数。 在 REST API 中,参数是命名的,它们的名称是传入字典的键。 在大多数情况下,参数是需要处理的文本。 有关模型返回的参数和值的更多信息可以在文档的 MODELS 部分找到 深帕夫洛夫

在示例中,两个字符串的列表被传递给参数 x,每个字符串都被赋予单独的标记。 在 DeepPavlov 中,所有模型都将独立处理的值列表(批次)作为输入。

术语“批次”指的是机器学习领域,指的是由算法或神经网络同时处理的一批独立输入值。 与单独传递给输入的相同值相比,这种方法可以减少(通常显着)模型处理批次中的一个元素的时间。 但只有在处理完所有元素后才会发出处理结果。 因此,在生成传入批次时,有必要考虑模型的速度及其每个单独元素所需的处理时间。

如果 DeepPavlov 模型有多个参数,每个参数都会收到自己的一批值,并且在输出时模型始终会生成一批答案。 传出批次的元素是处理具有相同索引的传入批次的元素的结果。

在上面的示例中,模型的结果是将每个字符串分解为标记(单词和标点符号),并相对于它所代表的命名实体(组织名称、货币)对标记进行分类。 目前型号 ner_ontonotes_bert_mult 能够识别18种命名实体,详细说明可见 这里.

DeepPavlov 的其他开箱即用模型

除了 NER 之外,在撰写本文时 DeepPavlov 中还提供以下开箱即用的模型:

文字问答

用该文本的片段回答该文本的问题。 型号配置: 小队_ru_bert_infer

请求示例:

{
  "context_raw": [
    "DeepPavlov разрабатывается лабораторией МФТИ.",
    "В юго-западной Руси стог жита оценен в 15 гривен."
  ],
  "question_raw": [
    "Кем разрабатывается DeepPavlov?",
    "Сколько стоил стог жита на Руси?"
  ]
}

结果:

[
  ["лабораторией МФТИ", 27, 31042.484375],
  ["15 гривен", 39, 1049.598876953125]
]

侮辱检测

检测是否存在对文本对象的侮辱行为(在撰写本文时 - 仅适用于英语)。 模型配置:insuls_kaggle_conv_bert

请求示例:


{
  "x": [
    "Money talks, bullshit walks.",
    "You are not the brightest one."
  ]
}

结果:

[
  ["Not Insult"],
  ["Insult"]
]

情感分析

文本情绪分类(积极、中性、消极)。 型号配置: rusentiment_elmo_twitter_cnn

请求示例:

{
  "x": [
    "Мне нравится библиотека DeepPavlov.",
    "Я слышал о библиотеке DeepPavlov.",
    "Меня бесят тролли и анонимусы."
  ]
}

结果:

[
  ["positive"],
  ["neutral"],
  ["negative"]
]

释义检测

判断两个不同的文本是否具有相同的含义。 型号配置: Stand_paraphraser_en

要求:

{
  "text_a": [
    "Город погружается в сон, просыпается Мафия.",
    "Президент США пригрозил расторжением договора с Германией."
  ],
  "text_b": [
    "Наступает ночь, все жители города пошли спать, а преступники проснулись.",
    "Германия не собирается поддаваться угрозам со стороны США."
  ]
}

结果:

[
  [1],
  [0]
]

始终可以找到所有开箱即用的 DeepPavlov 模型的当前列表 这里.

结论

在本文中,我们熟悉了 DeepPavlov API 以及该库开箱即用的一些文本处理功能。 应该记住,对于任何 NLP 任务,在与任务的主题领域(领域)相对应的数据集上训练模型时,将会获得最佳结果。 此外,原则上,更多的模型也不能针对所有情况进行训练。

在接下来的文章中,我们将了解该库的其他设置,从 Docker 启动 DeepPavlov,然后我们将继续训练模型。 并且不要忘记 DeepPavlov 有 форум – 询问有关库和模型的问题。 感谢您的关注!

来源: habr.com

添加评论