NER标注----使用BILSTM模型训练招投标实体标注模型

2023-11-11


)

前言

上文中讲到如何使用spaCy来做词性标注,这个功能非常强大。现在来介绍另一个有 趣的组件:NER标注。并使用BILSTM模型来训练一个招投标实体标注模型。


`提示:以下是本篇文章正文内容

一、NER标注简介

NER标注的中文名为命名实体识别,与词性标注一样是自然语言处理的技术基础之一。

NER标注的作用:
1)显而易见最主要的是通过模型可以识别出文本中需要的实体。
2)可以推导出实体之间的关系;例如,Rome is the capital of Italy,可以根据实体识别可以判断出Rome是意大利的城市而不是R&B艺术家,这项工作叫实体消岐(NED);
NED的使用场景可以在医学研究中消除词语歧义鉴定基因和基因产物,写作风格分析等。

尽管spaCy预训练好的模型进行实体标注较容易,但基于应用场景的不同可以训练一个更符合应用的
NER标注器。

二、从头开始训练一个NER标注器

在数据准备阶段需要采用合适的方法对数据进行标注,标注的方法为IBO表示法和扩展BILOU系统。
在这里插入图片描述
在本次的项目中,我们采用的是和词性标注相同的模型
采用bilstm+CRF;

二、使用步骤

1.引入库

代码如下(示例):

import pandas as pd
import numpy as np
import keras 
import re
import warnings
from keras.utils import to_categorical    #转换为one_hot编码
from sklearn.model_selection import train_test_split
from keras.layers import Dense, Embedding, LSTM, TimeDistributed, Input, Bidirectional, Dropout
from keras.models import Model
warnings.filterwarnings('ignore')

2.数据处理

要将数据变成这种形式
在这里插入图片描述

代码如下:

doc = []  #单个汉字
f = open ('home_work.txt','r',encoding='utf8') 
for line in f.readlines():
    doc.append([text for text in line])
pos  = []   #标签
for i in range(len(doc)):
    pos.append(['O']*len(doc[i]))   

train_label = pd.read_csv('label.txt',error_bad_lines=True, sep=' ',names=["中标", "招标"])
train_label.head(10)


train_data = pd.read_csv('home_work.txt',error_bad_lines=True,names=["文本"])
train_data.head()
train_data = np.array(train_data).tolist()  #pd转list

TRAIN_DATA = []
test = []
test1 = []
for i in range(len(train_label)):
    for j in range(len(train_data)):
        if i==j:
            out = re.finditer(str(train_label.iloc[j][0]),str(train_data[i])) #中标
            for k in out:
                shuzi = list(k.span())
                pos[i][shuzi[0]-2] = 'B_bidder'
                pos [i][shuzi[0]-1:shuzi[1]-2] = (shuzi[1]- 1 - (shuzi[0]+1))*['I_bidder']
                pos[i][shuzi[1]-3] = 'L_bidder'
                
            out1 = re.finditer(str(train_label.iloc[j][1]),str(train_data[i])) #招标
            for k1 in out1:
                shuzi = list(k1.span())
#                 print(data_2[i][shuzi[0]+1:shuzi[1]-1])
                pos[i][shuzi[0]-2] = 'B_buyyer'
                pos[i][shuzi[0]-1:shuzi[1]-2] = (shuzi[1]- 1 - (shuzi[0]+1))*['I_buyyer']
                pos[i][shuzi[1]-3] = 'L_buyyer

在这里插入图片描述

在这里插入图片描述
将数据先处理成这种形式。

data_clean = []
df = []
for z in range(len(doc)):
    for i in range(len(doc[z])):
        for j in range(len(pos[z])):
            if i==j:
                df.append(dict.fromkeys(doc[z][i],pos[z][j]))            
    data_clean.append(df)
    df = []

在这里插入图片描述
这种形式就可以了。

3.模型训练

#####建造词库和标签库相当于词列表和标签列表去重
def make_packages(ex_list , num):
    result = []
    for i in ex_list:
        result += i
    result = list(set(result))
    result_dict = {}
    for i in range(len(result)):
        result_dict[result[i]] = i + num
    return result_dict
tag = make_packages(pos , 0)  #词性标签
word_packages = make_packages(doc , 0)  #词的标签
def write_dict(ex_dict,path):
    vocab = open(path,"w",encoding="utf8")
    for part_index in ex_dict.keys():
        values = ex_dict[part_index]
        vocab.write(part_index + " : " +str(values)+"\n")
    vocab.close()


write_dict(tag,"./model/tag.txt")    #标签库
write_dict(word_packages,"./model/word_packages.txt")   #词库
def train_index(doc,word_packages): #数据转换,将文本数据转换成index
    doc_index = []
    for text in doc:
        text_index = []
        for word in text:
            text_index.append(word_packages[word])
        doc_index.append(text_index)
    return doc_index
doc_index = train_index(doc,word_packages)
pos_index = train_index(pos,tag)
max_len = max([len(i) for i in doc_index])#计算最长的,方便变为矩阵
print(max_len)
import keras 
import numpy as np
#使维度相等
input_array = np.array(doc_index)         ####不同纬度但是会进行转换
# pad_sequence()函数将序列转化为经过填充以后得到的一个长度相同新的序列。
X = keras.preprocessing.sequence.pad_sequences(input_array,maxlen=max_len,padding='post')  ###paddle 
output_array = np.array(pos_index)
y = keras.preprocessing.sequence.pad_sequences(output_array,maxlen=max_len,padding='post')
#########y标签向量化 
from keras.utils import to_categorical    #转换为one_hot编码
y_onehot = to_categorical(y) 
#划分训练集测试集
from sklearn.model_selection import train_test_split
X_train,X_test, y_train, y_test  =  train_test_split(X,y_onehot,test_size=0.2, random_state=0)

之后就是模型训练与保存了:

from keras.layers import Dense, Embedding, LSTM, TimeDistributed, Input, Bidirectional, Dropout
from keras.models import Model

def create_model(maxlen, chars, word_size, output_dim ,infer=False):
    sequence = Input(shape=(maxlen,), dtype='int32')
    embedded = Embedding(len(chars) + 1, word_size, input_length=maxlen, mask_zero=True)(sequence)
    """
    词嵌入层就是将文字转换为一串数字,可以理解为词在神经网络中的向量表示。
    Embedding:词嵌入层通常放在模型的第一层,主要的作用是将one-hot向量纬度缩减,便于模型纬度变小
    input_dim: 输入参数为词的索引
    output_dim: 输出词向量的维度
    input_length:序列长度
    """
    blstm = Bidirectional(LSTM(64, return_sequences=True), merge_mode='concat')(embedded)
    """
    merge_mode:向前向后的拼接方式,可选的参数有{‘sum’,‘mul’,‘concat’,‘ave’,None},默认concat
    """
    output = TimeDistributed(Dense(output_dim , activation='softmax'))(blstm)
    model = Model(inputs =sequence, outputs=output)
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model


def train_bilstm():
    """
    train bilistm
    :return:
    """
    print("start train bilstm")
    model = create_model(max_len, word_packages, 64, 7)
    model.summary()
    history = model.fit(X_train, y_train, batch_size=10,epochs=10, verbose=1)
    model.save('model/model.h5')
train_bilstm()

在这里插入图片描述
在这里插入图片描述
可见模型效果还是不错的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NER标注----使用BILSTM模型训练招投标实体标注模型 的相关文章

随机推荐

  • LeetCode: 高频树结构题目总结 - Python

    LeetCode 高频树结构题目总结 问题描述 LeetCode 98 验证二叉搜索树 根据中序遍历 判断大小 LeetCode 99 恢复二叉搜索树 搜索二叉树有两个节点搞错了 恢复好 LeetCode 100 相同的树 LeetCode
  • MyCobot六轴机械臂(六)--Myblockly模块简介

    1 Logic模块 如图3 11所示 表示if 条件 do 程序1 else 程序2 若满足条件则执行程 序1 否则执行程序2 所表示方法的详细讲解可查看图1 2下方的文字讲解 所表示的逻辑判断 返回值为true或者false 可以点击 中
  • spring源码研究之IoC容器在web容器中初始化过程

    前段时间在公司做了一个项目 项目用了spring框架实现 WEB容器是Tomct 5 虽然说把项目做完了 但是一直对spring的IoC容器在web容器如何启动和起作用的并不清楚 所以就抽时间看一下spring的源代码 借此了解它的原理 我
  • 经典SQL题目-求第N高的薪水的解法汇总及知识点复习

    这几天在看Leetcode的时候逐步开始留意SQL题目 不做不知道 一做才感觉自己的SQL太弱了 因此将一道经典题目 求第N高的薪水的解法进行汇总 MySQL 相关解法的原文链接已标注在文末 题目的链接为 第N高的薪水 一 题干 第N高的薪
  • [云原生专题-45]:Kubesphere云治理-基于Kubernetes 构建的企业级容器平台简介与总体架构

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122905834 目录 前言 第1章
  • pip换源+更改默认安装位置

    本文档创建于2023年3月9日 本文记录了pip换源和更改默认安装位置的操作 主要用于pip的一些配置 方便下载和文件管理 pip换源 使用pip安装库时 如果用默认的库经常会遇到连接不上或下载慢的问题 更换为国内的库下载会更快 临时换源
  • 使用TCP方式拉取Canal数据

    1 Canal对接Kafka联调 1 1 配置修改 canal properties 修改 zk canal zkServers 10 51 50 219 2181 instance properties 开启配置项 canal mq dy
  • 1056 组合数的和

    给定 N 个非 0 的个位数字 用其中任意 2 个数字都可以组合成 1 个 2 位的数字 要求所有可能组合出来的 2 位数字的和 例如给定 2 5 8 则可以组合出 25 28 52 58 82 85 它们的和为330 输入格式 输入在一行
  • Springboot3 + SpringSecurity + JWT + OpenApi3 实现认证授权

    Springboot3 SpringSecurity JWT OpenApi3 实现双token 目前全网最新的 Spring Security JWT 实现双 Token 的案例 收藏就对了 欢迎各位看友学习参考 此项目由作者个人创作 可
  • 即使失业,也要把第二个一万小时坚持下去

    这个月打的我有点懵逼 不知所措了 所以 在此写贴 即使失业 也要把第二个一万小时坚持下去 每天8小时学习 反正已经非工资收入九千了 基本上可以活下去了
  • Karma 自动化测试框架搭建文档

    一 前言 此文档为前端自动化单元测试框架 Karma 的搭建以及使用文档 二 准备环境 先列出我们此次搭建测试框架 Karma 必须的环境和包 1 node js node 引擎 2 npm node 包管理器 3 cnpm 可选 淘宝镜像
  • 数列分段(贪心入门)

    问题 对于给定的一个长度为 n 的正整数数列 ai 现要将其分成连续的若干段 并且每段和不超过 m 可以等于 m 问最少能将其分成多少段使得满足要求 算法复杂度为O n 思路 对于已给出数列 从前往后扫描一遍 在扫描过程中 不断记录当前最大
  • win10maven环境变量配置(简洁版):

    准备工作 下载了maven 可以官网下载 也可以通过其他途径获取 没安装之前 在命令行输入mvn v是这样的 解决方案 1 此电脑 属性 高级 环境变量 系统变量 2 新建变量 变量名 MAVEN HOME 值 本地maven的文件夹路径
  • 如何在Geany中添加python的中文注释

    在Geany中编译Python中直接添加中文注释会出现如下错误 只需要在程序的开始位置添加一句 coding utf 8
  • 全网最全Python兼职接单方式,赶快收藏!

    前言 近年来 Python凭借其简洁易入门的特点受到越来越多人群的青睐 当然这不仅仅是针对程序员来说 对于一些学生 职场人士也是如此 Python为什么会大受欢迎 1 Python还被大家称为 胶水语言 它适用于网站 桌面应用开发 自动化脚
  • Unity_DoTween_Path路径动画的使用

    using System Collections using System Collections Generic using System Linq using DG Tweening using UnityEngine public c
  • ResNet学习笔记

    目录 1 背景 2 BN Batch Normalization 层 3 residual结构 残差结构 1 背景 在 ResNet 之前 所有的神经网络都是通过卷积层和池化层的叠加组成的 人们认为卷积层和池化层的层数越多 获取到的图片特征
  • oracle 启动时出现ORA-01157: cannot identify/lock data和ORA-01110: data file 错误

    SQL gt shutdown ORA 01109 database not open Database dismounted ORACLE instance shut down SQL gt startup ORACLE instance
  • 微隔离(MSG)

    微隔离 MSG 参考文章 用 微隔离 实现零信任 什么是微隔离 当下哪家微隔离最靠谱 参考视频 不仅是防火墙 用微隔离实现零信任 定义 微隔离 Micro Segmentation 微隔离是一种网络安全技术 其核心的能力要求是聚焦在东西向流
  • NER标注----使用BILSTM模型训练招投标实体标注模型

    NER标注 BILSTM模型训练招投标实体标注模型 TOC NER标注 BILSTM模型训练招投标实体标注模型 前言 一 NER标注简介 二 从头开始训练一个NER标注器 二 使用步骤 1 引入库 2 数据处理 3 模型训练 前言 上文中讲