NLP之Bert多分类实现案例(数据获取与处理)

文章目录

  • 1. 代码解读
    • 1.1 代码展示
    • 1.2 流程介绍
    • 1.3 debug的方式逐行介绍
  • 3. 知识点

1. 代码解读

1.1 代码展示

import json
import numpy as np
from tqdm import tqdmbert_model = "bert-base-chinese"from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(bert_model)
# spo中所有p的关系标签 (text --> p label)
p_entitys = ['丈夫', '上映时间', '主持人', '主演', '主角', '作曲', '作者', '作词', '出品公司', '出生地', '出生日期', '创始人', '制片人', '号', '嘉宾', '国籍','妻子', '字', '导演', '所属专辑', '改编自', '朝代', '歌手', '母亲', '毕业院校', '民族', '父亲', '祖籍', '编剧', '董事长', '身高', '连载网站']max_length = 300
train_list = []
label_list = []
with open(file="../data/train_data.json", mode='r', encoding='UTF-8') as f:data = json.load(f)for line in tqdm(data):text = tokenizer.encode(line['text'])token = text[:max_length] + [0] * (max_length - len(text))train_list.append(token)# 获取当前文本的标准答案 (spo中的p)new_spo_list = line['new_spo_list']label = [0.] * len(p_entitys)  # 确定label的标签长度for spo in new_spo_list:p_entity = spo['p']['entity']label[p_entitys.index(p_entity)] = 1.0        label_list.append(label)
train_list = np.array(train_list)
label_list = np.array(label_list)
val_train_list = []
val_label_list = []
# 加载和预处理验证集
with open('../data/valid_data.json', 'r', encoding="UTF-8") as f:data = json.load(f)for line in tqdm(data):text = line["text"]new_spo_list = line["new_spo_list"]label = [0.] * len(p_entitys)for spo in new_spo_list:p_entity = spo["p"]["entity"]label[p_entitys.index(p_entity)] = 1.        token = tokenizer.encode(text)token = token[:max_length] + [0] * (max_length - len(token))val_train_list.append((token))val_label_list.append(label)
val_train_list = np.array(val_train_list)
val_label_list = np.array(val_label_list)

1.2 流程介绍

这段代码的整体流程和目的是为了对中文文本进行自然语言处理任务的准备工作,这里似乎是为了一个文本分类或关系提取任务。具体步骤如下:

  1. 导入必要的库:

    • json:用于处理JSON数据格式。
    • numpy:科学计算库,用于高效地处理数组操作。
    • tqdm:用于在循环操作中显示进度条。
  2. 指定BERT模型的类型(bert-base-chinese),用于中文文本。

  3. 使用transformers库中的AutoTokenizer来加载指定BERT模型的分词器。

  4. 定义一组中文实体关系标签(p_entitys),这些看起来是用于文本中特定实体之间关系的标签。

  5. 设置一个最大序列长度(max_length)为300,以限制处理文本的长度。

  6. 初始化两个空列表train_listlabel_list,用于存储训练数据的特征和标签。

  7. 加载并处理训练数据(train_data.json):

    • 使用json.load()读取文件内容。
    • 使用tokenizer.encode()将每行文本转换为BERT词汇表中的token IDs。
    • 如果文本长度短于max_length,则用0填充。
    • 解析每个文本的new_spo_list以构建标签向量,其中如果关系存在于文本中,则相应位置为1,否则为0。
  8. train_listlabel_list转换为NumPy数组,以便进一步处理。

  9. 对验证集进行与训练集相同的处理,并存储在val_train_listval_label_list

代码的目的是将中文文本及其对应的实体关系标签转换为机器学习模型可以接受的数值格式。这个过程通常是自然语言处理任务中文本预处理的一部分,特别是在使用BERT这类预训练语言模型的情况下。

你需要完成的工作可能包括:

  • 确保你有正确配置的环境和库来运行这段代码。
  • 如果这是第一次运行,确保你下载了bert-base-chinese模型和分词器。
  • 准备train_data.jsonvalid_data.json数据文件。
  • 运行代码并监视进度条以确保数据正在被正确处理。

1.3 debug的方式逐行介绍

下面逐行解释代码的功能:

import json
import numpy as np
from tqdm import tqdm

这三行代码是导入模块,json用于处理JSON格式的数据,numpy是一个广泛使用的科学计算库,tqdm是一个用于显示循环进度的库,可以在长循环中给用户反馈。

bert_model = "bert-base-chinese"

这行代码定义了变量bert_model,将其设置为"bert-base-chinese",指的是BERT模型的中文预训练版本。

from transformers import AutoTokenizer

transformers库导入AutoTokenizer,这是Hugging Face提供的一个用于自动获取和加载预训练分词器的类。

tokenizer = AutoTokenizer.from_pretrained(bert_model)

使用from_pretrained方法创建了一个tokenizer对象,这个分词器将根据bert_model变量指定的模型进行加载。

p_entitys = [...]

这里列出了所有可能的关系标签,用于将文本中的关系映射为一个固定长度的标签向量。

max_length = 300

定义了一个变量max_length,设置为300,用于后面文本序列的最大长度。

train_list = []
label_list = []

初始化两个列表train_listlabel_list,分别用于存储处理后的文本数据和对应的标签数据。

with open(file="../data/train_data.json", mode='r', encoding='UTF-8') as f:

打开训练数据文件train_data.json,以只读模式('r')和UTF-8编码。

    data = json.load(f)

加载整个JSON文件内容到变量data

    for line in tqdm(data):

data中的每一项进行迭代,tqdm将为这个循环显示一个进度条。

        text = tokenizer.encode(line['text'])

使用分词器将文本编码为BERT的输入ID。

        token = text[:max_length] + [0] * (max_length - len(text))

这行代码截取或填充编码后的文本至max_length长度。

        train_list.append(token)

将处理后的文本添加到train_list列表中。

        new_spo_list = line['new_spo_list']

提取当前条目的关系列表。

        label = [0.] * len(p_entitys)

创建一个与关系标签数量相同长度的零向量。

        for spo in new_spo_list:

遍历当前条目的每一个关系。

            p_entity = spo['p']['entity']

从关系中提取实体。

            label[p_entitys.index(p_entity)] = 1.0

在标签向量中,将对应实体的索引位置设为1.0,表示该关系在文本中出现。

        label_list.append(label)

将构建好的标签向量添加到label_list

train_list = np.array(train_list)
label_list = np.array(label_list)

将列表转换为NumPy数组,便于后续处理。

接下来的代码块与之前的相似,只是针对验证数据集valid_data.json进行操作。

val_train_list = []
val_label_list = []

初始化用于验证集的两个列表。

with open('../data/valid_data.json', 'r', encoding="UTF-8") as f:

打开验证数据文件。

接下来的代码块与处理训练数据时相同,也是加载数据、对文本进行编码、生成标签向量、然后将它们添加到相应的验证集列表中。

val_train_list = np.array(val_train_list)
val_label_list = np.array(val_label_list)

最后,同样地,将验证集的列表转换为NumPy数组。

这段代码整体上是用来处理和准备数据,使其适合输入到一个神经网络模型中去。它不仅编码文本,还构造了与之相对应的标签,这在训练和验证机器学习模型时是必需的。

3. 知识点

在这里插入图片描述
三元组解释了两个实体或者实体和属性之间的关系。
O是S的什么P,例如鲁迅是《呐喊》的导演吴京是《战狼》的导演
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/132672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构--前缀树(Trie)

1. 简介 前缀树是一种数据结构&#xff0c;常用来字符搜索。 2. 实现 包含的操作主要是: 加入串搜索串 代码实现&#xff0c;直接用leetcode_208的题解咯。 代码 class Trie { public:Trie():isEnd(false){for ( int i 0; i < 26;i)child[i] nullptr;}~Trie() {fo…

Webpack 中 Plugin 的作用是什么?常用 plugin 有哪些?

说说webpack中常见的Plugin&#xff1f;解决了什么问题&#xff1f;- 题目详情 - 前端面试题宝典 1、plugin 的作用 Plugin 是一种计算机应用程序&#xff0c;它和主应用程序互相交互&#xff0c;以提供特定的功能。 是一种遵循一定规范的应用程序接口编写出来的程序&#…

CSDN每日一题学习训练——Java版(两数相加、二叉树的锯齿形层序遍历、解数独)

版本说明 当前版本号[20231106]。 版本修改说明20231106初版 目录 文章目录 版本说明目录两数相加题目解题思路代码思路补充说明参考代码 二叉树的锯齿形层序遍历题目解题思路代码思路参考代码 解数独题目解题思路代码思路补充说明参考代码 两数相加 题目 给你两个 非空 的…

动态IP和静态IP哪个安全,该怎么选择

随着互联网的普及&#xff0c;越来越多的人开始关注网络安全问题。其中&#xff0c;IP地址作为网络通信中的重要组成部分&#xff0c;也成为了人们关注的焦点。 在IP地址中&#xff0c;动态IP和静态IP是两种不同的分配方式&#xff0c;它们各自具有不同的特点&#xff0c;那么…

论文阅读—— CEASC(cvpr2023)

arxiv&#xff1a;https://arxiv.org/abs/2303.14488 github&#xff1a;https://github.com/Cuogeihong/CEASC 为了进一步减轻SC中的信息损失&#xff0c;使训练过程更加稳定&#xff0c;我们在训练过程中除了稀疏卷积之外&#xff0c;还保持了正常的密集卷积&#xff0c;生成…

基于SSM的社区智慧养老监护管理平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Android---彻底掌握 Handler

Handler 现在几乎是 Android 面试的必问知识点&#xff0c;大多数 Adnroid 工程师都在项目中使用过 Handler。主要场景是子线程完成耗时操作的过程中&#xff0c;通过 Handler 向主线程发送消息 Message&#xff0c;用来刷新 UI 界面。 下面我们来了解 Handler 的发送消息和处…

吃透BGP,永远绕不开这些基础概述,看完再也不怕BGP了!

你们好&#xff0c;我的网工朋友。 总有人在私信里抱怨&#xff0c;BGP实在是太难了&#xff01; 一是这玩意儿本来就很复杂&#xff0c;需要处理大量的路由信息和复杂的算法&#xff1b;再一个是需要你有一定的实战经验才能深入理解运作。 虽然BGP确实有一定难度&#xff0c…

【漏洞复现】Metinfo6.0.0任意文件读取漏洞复现

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现代码审计漏洞点 1.5、深度利用EXP编写 1.6、漏洞挖掘1.7修复建议 1.1、漏洞描述 漏洞名称&#xff1a;MetInfo任意文件…

Node.js |(五)包管理工具 | 尚硅谷2023版Node.js零基础视频教程

学习视频&#xff1a;尚硅谷2023版Node.js零基础视频教程&#xff0c;nodejs新手到高手 文章目录 &#x1f4da;概念介绍&#x1f4da;npm&#x1f407;安装npm&#x1f407;基本使用&#x1f407;生产依赖与开发依赖&#x1f407;npm全局安装&#x1f407;npm安装指定包和删除…

【Spring Boot 源码学习】JedisConnectionConfiguration 详解

Spring Boot 源码学习系列 JedisConnectionConfiguration 详解 引言往期内容主要内容1. RedisConnectionFactory1.1 单机连接1.2 集群连接1.3 哨兵连接 2. JedisConnectionConfiguration2.1 RedisConnectionConfiguration2.2 导入自动配置2.3 相关注解介绍2.4 redisConnectionF…

链表面试OJ题(1)

今天讲解两道链表OJ题目。 1.链表的中间节点 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个…

Chromebook文件夹应用新功能

种种迹象表明 Google 旗下的 Chromebooks 近期要有大动作了。根据 Google 团队成员透露&#xff0c;公司计划在 Chrome OS 的资源管理器中新增“Recents”&#xff08;最近使用&#xff09;文件&#xff0c;以便于用户更快找到所需要的文件。 种种迹象表明 Google 旗下的 Chro…

【数据结构】排序算法复杂度 及 稳定性分析 【图文详解】

排序算法总结 前言[ 一 ] 小数据基本排序算法&#xff08;1&#xff09;冒泡排序&#xff08;2&#xff09;直接插入排序 [ 二 ] &#xff08;由基本排序衍生的用作&#xff09;处理大数据处理排序&#xff08;1&#xff09;堆排序&#xff08;2&#xff09;希尔排序 [ 三 ] 大…

unity中移动方案--物理渲染分层

一、三种基本移动方案 unity中的移动分为Transform和Rigidbody以及CharacterController&#xff0c;其中CharacterController功能完善&#xff0c;已经可以避免了穿墙&#xff0c;并实现了贴墙走等情况&#xff0c;需要结合性能考虑选择不同的方式。 1.使用transform,直接修改…

鳄鱼指标的3颜色线都代表什么?澳福官网一段话明白了

投资者一直在使用鳄鱼指标进行交易&#xff0c;但是对指标上面的3种颜色的K线都代表什么不明白&#xff1f;直到看到澳福官网一段话才明白&#xff0c;原来这么简单&#xff01; 鳄鱼指标&#xff0c;这一工具是由三条移动平均线组合而成。具体来说&#xff0c;蓝线&#xff0…

Spring Boot 3系列之-启动类详解

Spring Boot是一个功能强大、灵活且易于使用的框架&#xff0c;它极大地简化了Spring应用程序的开发和部署流程&#xff0c;使得开发人员能够更专注于业务逻辑的实现。在我们的Spring Boot 3系列之一&#xff08;初始化项目&#xff09;文章中&#xff0c;我们使用了Spring官方…

桶装水订水系统水厂送水小程序开发;

桶装水小程序正式上线&#xff0c;支持多种商品展示形式&#xff0c;会员卡、积分、分销等功能&#xff1b; 开发订水送水小程序系统&#xff0c;基于用户、员工、商品、订单、配送站和售后管理模块&#xff0c;对每个模块进行统计分析&#xff0c;简化了分配过程&#xff0c;提…

【教3妹学编程-算法题】最大单词长度乘积

3妹&#xff1a;哇&#xff0c;今天好冷啊&#xff0c; 不想上班。 2哥&#xff1a;今天气温比昨天低8度&#xff0c;3妹要空厚一点啊。 3妹 : 嗯&#xff0c; 赶紧把我的羽绒服找出来穿上&#xff01; 2哥&#xff1a;哈哈&#xff0c;那倒还不至于&#xff0c; 不过气温骤降&…

【简朴PlainApp】通过浏览器就能管理手机文件的开源利器

简朴PlainApp 简朴是一个开源应用&#xff0c;允许您通过网络浏览器管理您的手机。您可以通过安全、易于使用的网络界面从桌面访问文件、视频、音乐、联系人、短信、通话记录等等&#xff01; 这对于手机上文件较多的朋友来说&#xff0c;从任意电脑上管理手机文件的需求还是挺…