大家好! 我们将开设一系列文章,致力于解决与自然语言处理(自然语言处理或简称 NLP)相关的实际问题以及使用开源库创建对话代理(聊天机器人)
NLP 任务包括确定文本的情感、解析命名实体、确定对话者想要从您的机器人那里得到什么:订购披萨或获取背景信息等等。 您可以阅读有关 NLP 任务和方法的更多信息
在本文中,我们将向您展示如何使用预先训练的 NLP 模型运行 REST 服务器,无需任何额外的配置或培训即可使用。
深巴甫洛夫的安装
此处和下文将给出针对 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 服务器:
- 我们将其配置中指定的模型依赖项安装到活动虚拟环境中:
python -m deeppavlov install ner_ontonotes_bert_mult
- 从 DeepPavlov 服务器下载序列化模型组件:
python -m deeppavlov download ner_ontonotes_bert_mult
序列化的组件将下载到 DeepPavlov 主目录,默认位于该目录
~/.deeppavlov
下载时,已下载组件的哈希值将与服务器上组件的哈希值进行检查。 如果存在匹配,则跳过下载并使用现有文件。 下载组件的大小平均为 0.5 到 8 Gb,在某些情况下解压缩后可达 20 Gb。
- 我们使用以下模型启动 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