如何使用doccano+flask+花生壳+服务器实现命名实体识别ner自动标注

doccano安装与配置

首先,本地安装教程有太多了,我就不详细写了。而且我本地也没成功run起来,但是想到标数据这种活怎么能一个人干呢?所以还是部署在服务器上比较好,添加几个用户之后访问服务器搭建的网站大家就可以一起愉(痛)快(苦)的标数据了,还可以比比谁标得快!

正式开始:

我们首先进入doccano的github仓库,然后开始读README.的docker部分

Docker

As a one-time setup, create a Docker container as follows(直接在服务器的终端依次运行下面的代码):

下面前面的端口号的8000指的是服务器的端口,也就是我们到时候访问的网址端口;相应修改管理员邮箱、密码

docker pull doccano/doccano
docker container create --name doccano \
  -e "ADMIN_USERNAME=admin" \
  -e "ADMIN_EMAIL=admin@example.com" \
  -e "ADMIN_PASSWORD=password" \
  -v doccano-db:/data \
  -p 8000:8000 doccano/doccano

Next, start doccano by running the container(docker容器创建完成就可以run起来了):

docker container start doccano

Go to http://127.0.0.1:8000/.

这时候在任意一台电脑输入服务器ip:端口8000就可以访问doccano网站了,一个共享标注网站就搭建好了,也就是说把127.0.0.1换成服务器的公网IP地址就能访问了

To stop the container, run docker container stop doccano -t 5. All data created in the container will persist across restarts.

If you want to use the latest features, please specify nightly tag:

docker pull doccano/doccano:nightly

本地配置自动标注模型flask

原理是本地运行成品深度学习模型,配制成api供远程调用。首先这一步是把深度学习模型配制好。借用百度飞桨提供的通用标注模型,我们可以做到零知识启动,但是实体类别过于小众(本质上就是理解你说的实体名称是什么意思)效果可不能保证,识别人名和城市还是没有问题的。

你需要修改的是schema里面的实体类别,另外就是把paddlepaddlenlp两个库pip安装一下,不然跑不起来。

from flask import Flask, request, jsonify
from paddlenlp import Taskflow


app = Flask(__name__)

# 在这里定义你想要识别的实体类型
# UIE具有zero-shot能力,所以类型可以随便定义,但是识别的好坏不一定
schema = ['政策', '政府机构', '省份', '城市','人','人的称号']

# 第一运行时,联网状态下会自动下载模型
# device_id为gpu id,如果写-1则使用cpu
ie = Taskflow('information_extraction', schema=schema, device_id=-1)


def convert(result):
    result = result[0]
    formatted_result = []
    for label, ents in result.items():
        for ent in ents:
            formatted_result.append(
                {
                    "label": label,
                    "start_offset": ent['start'],
                    "end_offset": ent['end']
                })

    return formatted_result


@app.route('/', methods=['POST'])
def get_result():
    text = request.json['text']
    print(text)
    result = ie(text)
    formatted_result = convert(result)

    return jsonify(formatted_result)


if __name__ == '__main__':
	# 这里写端口的时候一定要注意不要与已有的端口冲突
	# 这里的host并不是说访问的时候一定要写0.0.0.0,但是这里代码要写0.0.0.0,代表可以被本网络中所有的看到
	# 如果是其他机器访问你创建的服务,访问的时候要写你的ip
    app.run(host='0.0.0.0', port=88)

代码运行起来后(终端python xxx.py或者就在pycharm中run)只能本地访问这个接口,至于调试还是看下面两篇教程,也不重复写了。

post请求run代码之后给出的网址,内容写在body

(1条消息) NLP工具——doccano标注系统自动标注功能使用_常鸿宇的博客-CSDN博客

本地使用花生壳内网穿透

服务器一般内存不超过2GB所以上面的自动标注模型是跑不起来的,那么我们要放弃自动标注吗?我想到的解决办法就是用自己的本地电脑内网穿透供服务器搭建的doccano调用自动标注api.

内网穿透花生壳勉强够用,关键免费稳定。安装之后我们开始把模型flask部署到公网。

开启部署内网穿透。

配置doccano自动标注

接下来我就不解释了,看这两个教程。主要看第一个csdn的就够了。

(1条消息) NLP工具——doccano标注系统自动标注功能使用_常鸿宇的博客-CSDN博客

ps:上面这个教程Set parameters设置参数里面说这里的value中,text和括号之间有两个空格,其实是前后各一个

doccano数据标注工具 -自动标注功能实现 - 知乎 (zhihu.com)

Set mapping template, 后面不断确认就可以了

[
    {% for entity in input %}
        {
            "start_offset": {{ entity.start_offset }},
            "end_offset": {{ entity.end_offset}},
            "label": "{{ entity.label }}"
        }{% if not loop.last %},{% endif %}
    {% endfor %}
]

教程结束,如有问题可以留言评论。

posted @ 2023-04-19 16:11  孤飞  阅读(503)  评论(0编辑  收藏  举报