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.hqwc.cn/news/161589.html

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

相关文章

基于变色龙算法的无人机航迹规划-附代码

基于变色龙算法的无人机航迹规划 文章目录 基于变色龙算法的无人机航迹规划1.变色龙搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用变色龙算法来优化无人机航迹规划。 1.变色龙…

系列十二、过滤器 vs 拦截器

一、过滤器 vs 拦截器 1.1、区别 (1)触发时机不一样,过滤器是在请求进入容器后Servlet之前进行预处理的,请求结束返回也是,是在Servlet处理完后,返回给前端之前; (2)过滤…

MySQL性能优化的最佳20条经验

概述 关于数据库的性能,这并不只是DBA才需要担心的事。当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能。下面讲下MySQL性能优化的一些点。 1. 为查询缓存优化你的查询 大多数的MySQL服务器…

企业财务数字化转型的机遇有哪些?_光点科技

随着数字技术的飞速发展,企业正面临着一个前所未有的转型机会。尤其在财务领域,数字化不仅仅是一种技术进步,更是一个全面提升企业竞争力的战略选择。那么,企业财务数字化转型所带来的机遇有哪些? 提高效率与生产力 数…

机器学习中的关键组件

机器学习中的关键组件 数据 每个数据集由一个个样本组成,大多时候,它们遵循独立同分布。样本有时也叫作数据点或数据实例,通常每个样本由一组称为特征或协变量的属性组成。机器学习会根据这些属性进行预测,预测得到的称为标签或…

鸿蒙LiteOs读源码教程+向LiteOS中添加一个简单的基于线程运行时的短作业优先调度策略

【⭐据说点赞收藏的都会收获好运哦👍】 一、鸿蒙Liteos读源码教程 鸿蒙的源码是放在openharmony文件夹下,openharmony下的kernel文件夹存放操作系统内核的相关代码和实现。 内核是操作系统的核心部分,所以像负责:资源管理、任…

使用JMeter进行接口压力测试

1.我首先创建一个线程组 2.创建好之后如图所示 3. 进行配置 4. 然后添加一个https请求 5.创建好之后设置请求方法和对应参数 6.设置表格监听器 7.创建好之后如图所示 8.保存jmx文件后点击运行进行测试,结果反馈如下图

从源码中看@Qualifier注解

theme: smartblue 摘要 Qualifier注解通常和Autowired注解一起使用,那么首先来看Autowire是怎么把Bean对象注入到Spring容器中的。 前置-Autowired注入原理 前置条件:需要读者了解Autowired是如何将类注入进来的。 深入解析 Spring Framework 中 Au…

【Vue基础-实践】数据可视化大屏设计(林月明螺蛳粉文化公司单量数据大屏)

目录 一、知识整理 1、页面自适应 2、下载插件px to rem & rpx 3、关于padding与margin 4、下载echarts 5、下载axios 6、experss官网接口创建 7、创建路由 8、api接口创建 9、设置基准路径 10、跨域设置 11、图表设置 12、地图数据引用 13、设置地图效果 二、…

uniapp写一个计算器用于记账(微信小程序,APP)

提要:自己用uniapp写了一个记账小程序(目前是小程序),写到计算器部分,在网上找了别人写的计算器,大多数逻辑都是最简单的,都不能满足一个记账计算器的基本逻辑。与其在网上找来找去,…

Leetcode—187.重复的DNA序列【中等】

2023每日刷题&#xff08;二十&#xff09; Leetcode—187.重复的DNA序列 实现代码 class Solution { public:const int L 10;vector<string> findRepeatedDnaSequences(string s) {unordered_map<string, int> str;vector<string> ans;int len s.size()…

vue+vant图片压缩后上传

vuevant图片压缩后上传 vue文件写入 <template><div class"home"><van-field input-align"left"><template #input><van-uploaderv-model"fileList.file":after-read"afterRead":max-count"5":…