当前位置: 首页 > news >正文

NLP之Bert实现文本分类

文章目录

  • 1. 代码展示
  • 2. 整体流程介绍
  • 3. 代码解读
  • 4. 报错解决
    • 4.1 解决思路
    • 4.2 解决方法
  • 5. Bert介绍
    • 5.1 什么是Bert
      • BERT简介:
      • BERT的核心思想:
      • BERT的预训练策略:
      • BERT的应用:
      • 为什么BERT如此受欢迎?
      • 总结:

1. 代码展示

from tqdm import tqdm  # 可以在循环中添加进度条x = [1, 2, 3]  # list
print(x[:10] + [0] * -7)from transformers import AutoTokenizertokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")labels = []
train_list = []
with open("../data/ChnSentiCorp.txt", mode='r', encoding='utf-8') as file:for line in tqdm(file.readlines()):line = line.strip().split(',')labels.append(int(line[0]))text = tokenizer.encode(line[1])token = text[:80] + [0] * (80 - len(text))train_list.append(token)
import numpy as nplabels = np.array(labels)
train_list = np.array(train_list)# 已经把数据转化成了词向量 (Bert不需要词嵌入)  RNN --> LSTM
from transformers import TFBertForSequenceClassificationmodel = TFBertForSequenceClassification.from_pretrained("bert-base-chinese", num_labels=2)model.compile(loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.summary()
result = model.fit(x=train_list, y=labels, batch_size=128, epochs=10)
print(result.history)

2. 整体流程介绍

首先,概述一下代码的主要目的和流程。

主要目的
此代码的主要目的是使用BERT模型进行序列分类。具体来说,它似乎是在处理某种情感分析任务,因为代码中读取了标签和文本,并试图用BERT模型来进行分类(假设为正面或负面情感,因为num_labels=2)。

整体流程

  1. 导入所需库

    • tqdm:用于显示循环的进度条。
    • transformers:提供预训练的模型和相关的工具。
  2. 数据预处理

    • 定义了两个空列表labelstrain_list,用于存储从文件中读取的标签和文本数据。
    • 打开一个名为ChnSentiCorp.txt的文件,并从中读取数据。假设每行的格式是“标签,文本”。
    • 使用BERT的tokenizer将每行文本转化为token。然后,确保每行文本的token长度为80,如果长度不足80,则用0填充。
  3. 转换数据格式

    • 将labels和train_list列表转换为numpy数组。
  4. 加载和初始化BERT模型

    • 使用TFBertForSequenceClassification.from_pretrained方法加载bert-base-chinese预训练模型,并指定类别数量为2。
    • 编译模型,设置损失函数和评估指标,并显示模型摘要。
  5. 模型训练

    • 使用处理后的train_list作为输入和labels作为目标进行模型训练。
    • 显示训练历史。

综上,代码的整体流程是:导入库→数据预处理→数据格式转换→加载和初始化BERT模型→模型训练。

3. 代码解读

像debug一样逐步解释您提供的代码。

from tqdm import tqdm  # 可以在循环中添加进度条

这一行导入了tqdm库,它是一个在循环中显示进度条的库。


x = [1, 2, 3]  # list
print(x[:10] + [0] * -7)

这里首先定义了一个列表x。接下来,x[:10]表示获取列表x的前10个元素,但因为x只有3个元素,所以它其实会返回整个x。[0] * -7将产生一个空列表,因为乘以一个负数的结果是空。所以print语句的输出将是[1, 2, 3]


from transformers import AutoTokenizer

这里从transformers库中导入了AutoTokenizertransformers库提供了很多预训练模型及其相关的工具,AutoTokenizer是其中的一个。


tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")

使用bert-base-chinese这个预训练模型的tokenizer。这个tokenizer是针对中文BERT模型的。


labels = []
train_list = []
with open("../data/ChnSentiCorp.txt", mode='r', encoding='utf-8') as file:for line in tqdm(file.readlines()):line = line.strip().split(',')labels.append(int(line[0]))text = tokenizer.encode(line[1])token = text[:80] + [0] * (80 - len(text))train_list.append(token)

这段代码读取文件ChnSentiCorp.txt并从中获取标签和文本数据。每一行都是由一个标签和文本组成的,两者之间用逗号分隔。文本数据被tokenized并被截断或填充至长度80。


import numpy as nplabels = np.array(labels)
train_list = np.array(train_list)

这里首先导入了numpy库,并将labels和train_list转换为numpy数组。


from transformers import TFBertForSequenceClassification

transformers库中导入了用于序列分类的TFBert模型。


model = TFBertForSequenceClassification.from_pretrained("bert-base-chinese", num_labels=2)

初始化一个预训练的BERT模型用于序列分类。这里指定了类别数量为2。


model.compile(loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.summary()

模型被编译,使用了sparse_categorical_crossentropy作为损失函数,并设置了accuracy作为评估指标。model.summary()会显示模型的结构和参数信息。

model.summary()会输出如下内容。

Model: "tf_bert_for_sequence_classification"
_________________________________________________________________Layer (type)                Output Shape              Param #   
=================================================================bert (TFBertMainLayer)      multiple                  102267648 dropout_37 (Dropout)        multiple                  0         classifier (Dense)          multiple                  1538      =================================================================
Total params: 102,269,186
Trainable params: 102,269,186
Non-trainable params: 0
_________________________________________________________________

result = model.fit(x=train_list, y=labels, batch_size=128, epochs=10)
Epoch 1/10
61/61 [==============================] - 2293s 36s/step - loss: 0.9221 - accuracy: 0.3204
Epoch 2/10
61/61 [==============================] - 2139s 35s/step - loss: 0.6931 - accuracy: 0.3147
Epoch 3/10
61/61 [==============================] - 2078s 34s/step - loss: 0.6931 - accuracy: 0.3147
Epoch 4/10
61/61 [==============================] - 1897s 31s/step - loss: 0.6931 - accuracy: 0.3147
Epoch 5/10
61/61 [==============================] - 1898s 31s/step - loss: 0.6931 - accuracy: 0.3147
Epoch 6/10
61/61 [==============================] - 1904s 31s/step - loss: 0.6931 - accuracy: 0.3147
Epoch 7/10
61/61 [==============================] - 1895s 31s/step - loss: 0.6931 - accuracy: 0.3147
Epoch 8/10
61/61 [==============================] - 1887s 31s/step - loss: 0.6931 - accuracy: 0.3147
Epoch 9/10
61/61 [==============================] - 1878s 31s/step - loss: 0.6931 - accuracy: 0.3147
Epoch 10/10
61/61 [==============================] - 1875s 31s/step - loss: 0.6931 - accuracy: 0.3147
print(result.history)
{'loss': [0.9221097230911255, 0.6931471228599548, 0.6931471228599548, 0.6931471228599548, 0.6931471228599548, 0.6931471228599548, 0.6931471228599548, 0.6931471228599548, 0.6931471228599548, 0.6931471228599548], 
'accuracy': [0.3204120993614197, 0.3147456645965576, 0.3147456645965576, 0.3147456645965576, 0.3147456645965576, 0.3147456645965576, 0.3147456645965576, 0.3147456645965576, 0.3147456645965576, 0.3147456645965576]
}

模型训练过程。使用train_list作为输入数据,labels作为标签。批大小设置为128,总共训练10轮。训练完毕后,会打印训练历史数据。

4. 报错解决

执行下面的代码的时候报错:

from transformers import TFBertForSequenceClassification
model = TFBertForSequenceClassification.from_pretrained("bert-base-chinese", num_labels=2)

报错信息如下:

requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='huggingface.co', port=443): Max retries exceeded with url: /bert-base-chinese/resolve/main/pytorch_model.bin (Caused by ConnectTimeoutError(<urllib3.connection.VerifiedHTTPSConnection object at 0x000001AAEB8F3700>, 'Connection to huggingface.co timed out. (connect timeout=10)'))

4.1 解决思路

您的报错信息提示了连接超时问题。当您尝试从huggingface的服务器加载预训练的模型时,出现了这个问题。

以下是可能的原因及其解决方案:

  1. 网络问题:您的机器可能无法访问huggingface的服务器。这可能是由于网络速度慢、防火墙设置、网络断开或其他网络相关问题。

    解决方案

    • 请确保您的网络连接正常。
    • 试试是否可以手动访问huggingface.co网站。
    • 检查您的防火墙或代理设置,确保它们没有阻止您访问huggingface的服务器。
  2. Huggingface服务器问题:有时,由于服务器的高负载或其他问题,huggingface的服务器可能会暂时不可用。

    解决方案

    • 稍后再试。
  3. 使用代理:如果您处于一个需要代理访问外部网站的网络环境中(如在某些公司或国家),那么可能需要配置代理。

    解决方案

    • 设置Python的代理,或使用VPN。
  4. 下载模型并本地加载:如果以上方法都不起作用,您可以手动下载模型,然后从本地加载。

    解决方案

    • 手动从huggingface的模型库中下载bert-base-chinese模型。
    • 将下载的模型存放在本地目录中,然后使用from_pretrained方法加载该目录。

例如:

model = TFBertForSequenceClassification.from_pretrained("/path_to_directory/bert-base-chinese", num_labels=2)

其中/path_to_directory/bert-base-chinese是您存放模型文件的本地目录。

4.2 解决方法

科学上网

5. Bert介绍

5.1 什么是Bert

当然可以!

BERT简介:

BERT(Bidirectional Encoder Representations from Transformers)是由Google在2018年提出的一个预训练的深度学习模型,用于自然语言处理(NLP)任务。BERT的突出特点是其双向性,即它可以同时考虑文本中的前后上下文,从而捕捉更丰富的语义信息。

BERT的核心思想:

  1. 双向性:传统的语言模型,如LSTM和GRU,是单向的,只能考虑前面的上下文或后面的上下文。BERT通过同时考虑前后上下文来捕捉更复杂的语义信息。
  2. 预训练和微调:BERT首先在大量无标签文本上进行预训练,然后可以用少量的标注数据进行微调,以适应特定的NLP任务。
  3. Transformer架构:BERT基于Transformer架构,它是一个高效的自注意力机制,可以捕捉文本中长距离的依赖关系。

BERT的预训练策略:

  1. Masked Language Model (MLM):随机遮蔽句子中的一些单词,并让模型预测这些遮蔽单词。这样,模型必须学习理解文本的上下文信息,以预测遮蔽的部分。
  2. Next Sentence Prediction (NSP):模型接收两个句子作为输入,并预测第二个句子是否是第一个句子的下一个句子。

BERT的应用:

经过预训练后的BERT模型可以被微调并应用于各种NLP任务,如文本分类、命名实体识别、问答系统等。由于BERT能够捕捉丰富的上下文信息,它在许多NLP任务中都取得了当时的最先进性能。

为什么BERT如此受欢迎?

  1. 强大的性能:BERT在多种NLP任务上都达到了当时的最先进的性能。
  2. 通用性:同一个预训练的BERT模型可以被微调并应用于多种NLP任务,无需从头开始训练。
  3. 可用性:由于Google和其他组织发布了预训练的BERT模型和相关工具,开发者可以轻松地使用BERT进行自己的NLP项目。

总结:

BERT是当前NLP领域的一个里程碑,它改变了我们如何处理和理解文本的方式。对于初学者,理解BERT及其工作原理是深入研究现代NLP的关键。希望这个简介能帮助您对BERT有一个初步的了解!

相关文章:

NLP之Bert实现文本分类

文章目录 1. 代码展示2. 整体流程介绍3. 代码解读4. 报错解决4.1 解决思路4.2 解决方法 5. Bert介绍5.1 什么是BertBERT简介&#xff1a;BERT的核心思想&#xff1a;BERT的预训练策略&#xff1a;BERT的应用&#xff1a;为什么BERT如此受欢迎&#xff1f;总结&#xff1a; 1. 代…...

Pytorch从零开始实战08

Pytorch从零开始实战——YOLOv5-C3模块实现 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——YOLOv5-C3模块实现环境准备数据集模型选择开始训练可视化模型预测总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c…...

docker部署Jenkins(Jenkins+Gitlab+Maven实现CI/CD)

GitLab介绍 GitLab是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务&#xff0c;可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能&#xff0c;能够浏览源代码&#xff0c;管理缺陷和注释。…...

mapbox使用marker创建html点位信息

mapbox使用marker创建html点位信息 codePen地址 mapboxgl.accessToken "pk.eyJ1IjoibGl1emhhbzI1ODAiLCJhIjoiY2xmcnV5c2NtMDd4eDNvbmxsbHEwYTMwbCJ9.T0QCxGEJsLWC9ncE1B1rRw"; const center [121.29786, 31.19365]; const map new mapboxgl.Map({container: &quo…...

项目构建工具maven的基本配置

&#x1f451; 博主简介&#xff1a;知名开发工程师 &#x1f463; 出没地点&#xff1a;北京 &#x1f48a; 2023年目标&#xff1a;成为一个大佬 ——————————————————————————————————————————— 版权声明&#xff1a;本文为原创文…...

超详细docker学习笔记

关于docker 一、基本概念什么是docker?docker组件&#xff1a;我们能用docker做什么Docker与配置管理&#xff1a;Docker的技术组件Docker资源Docker与虚拟机对比 二、安装docker三、镜像命令启动命令帮助命令列出本地主机上的镜像在远程仓库中搜索镜像查看占据的空间删除镜像…...

Adobe acrobat 11.0版本 pdf阅读器修改背景颜色方法

打开菜单栏&#xff0c;编辑&#xff0c;首选项&#xff0c;选择辅助工具项&#xff0c;页面中 勾选 替换文档颜色&#xff0c;页面背景自己选择一个颜色&#xff0c;然后确定&#xff0c;即可&#xff01;...

HCIA数据通信——路由协议

数据通信——网络层&#xff08;OSPF基础特性&#xff09;_咕噜跳的博客-CSDN博客 数据通信——网络层&#xff08;RIP与BGP&#xff09;_咕噜跳的博客-CSDN博客 上述是之前写的理论知识部分&#xff0c;懒得在实验中再次提及了。这次做RIP协议以及OSPF协议。不过RIP协议不常用…...

十种常见典型算法

什么是算法&#xff1f; 简而言之&#xff0c;任何定义明确的计算步骤都可称为算法&#xff0c;接受一个或一组值为输入&#xff0c;输出一个或一组值。&#xff08;来源&#xff1a;homas H. Cormen&#xff0c; Chales E. Leiserson 《算法导论第3版》&#xff09; 可以这样理…...

python-列表推导式、生成器表达式

一、列表推导式 列表推导式&#xff1a;用一句话来生成列表 语法&#xff1a;[结果 for循环 判断] 筛选模式&#xff1a; 二、生成器表达式...

NLP 模型中的偏差和公平性检测

一、说明 近年来&#xff0c;自然语言处理 &#xff08;NLP&#xff09; 模型广受欢迎&#xff0c;彻底改变了我们与文本数据交互和分析的方式。这些基于深度学习技术的模型在广泛的应用中表现出了卓越的能力&#xff0c;从聊天机器人和语言翻译到情感分析和文本生成。然而&…...

YUV图像格式详解

1.概述 YUV是一种图像颜色编码方式。 相对于常见且直观的RGB颜色编码&#xff0c;YUV的产生自有其意义&#xff0c;它基于人眼对亮度比色彩的敏感度更高的特点&#xff0c;使用Y、U、V三个分量来表示颜色&#xff0c;并通过降低U、V分量的采样率&#xff0c;尽可能保证图像质…...

软考高项-质量管理措施

质量规划 编制《项目质量规划书》、《项目验收规范》等质量文件&#xff0c;对文件进行评审&#xff0c;对项目成员进行质量管理培训&#xff1b; 质量保证 评审、过程分析、定期对项目进行检查并跟踪改进情况&#xff1b; 质量控制 测试、因果分析、变更、统计抽样等。 80/…...

Redis那些事儿(一)

说到redis大家都不陌生&#xff0c;其中包括&#xff1a;共有16个数据库&#xff0c;默认为第0个数据库&#xff1b;数据以key-value键值的形式存储&#xff1b;数据类型包括String、List、Hash、Set等&#xff0c;其中最常用的是字符串&#xff1b;是单线程的、基于内存的&…...

【多媒体文件格式】M3U8

M3U8 M3U8文件是指UTF-8编码格式的M3U文件(M3U使用Latin-1字符集编码)。M3U文件是一个记录索引的纯文本文件&#xff0c;打开它时播放软件并不是播放它&#xff0c;而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。 m3u8基本上可以认为就是.m3u格式文件&#x…...

linux中xargs的实用技巧

在Linux命令行中&#xff0c;有许多强大的工具可以帮助我们处理和操作文件、目录以及其他数据。其中之一就是xargs命令。xargs命令可以将标准输入数据转换成命令行参数&#xff0c;从而提高命令的效率和灵活性。本文将介绍xargs命令的基本用法&#xff0c;并通过生动的代码和输…...

【Jmeter】生成html格式接口自动化测试报告

jmeter自带执行结果查看的插件&#xff0c;但是需要在jmeter工具中才能查看&#xff0c;如果要向领导提交测试结果&#xff0c;不够方便直观。 笔者刚做了这方面的尝试&#xff0c;总结出来分享给大家。 这里需要用到ant来执行测试用例并生成HTML格式测试报告。 一、ant下载安…...

如何将极狐GitLab 漏洞报告导出为 HTML 或 PDF 格式或导出到 Jira

目录 导出为 HTML/PDF 将漏洞信息导出到 Jira 参考资料 极狐GitLab 的漏洞报告功能可以让开发人员在统一的平台上面管理代码&#xff0c;对其进行安全扫描、管理漏洞报告并修复漏洞。但有些团队更喜欢使用类似 Jira 的单独工具来管理他们的安全漏洞。他们也可能需要以易于理…...

uniapp原生插件之安卓文字转拼音原生插件

插件介绍 安卓文字转拼音插件&#xff0c;支持转换为声调模式和非声调模式&#xff0c;支持繁体和简体互相转换 插件地址 安卓文字转拼音原生插件 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 详细使用文档 uniapp 安卓文字转拼音原生插件 用法 在需要使用插…...

[架构之路-254/创业之路-85]:目标系统 - 横向管理 - 源头:信息系统战略规划的常用方法论,为软件工程的实施指明方向!!!

目录 总论&#xff1a; 一、数据处理阶段的方法论 1.1 企业信息系统规划法BSP 1.1.1 概述 1.1.2 原则 1.2 关键成功因素法CSF 1.2.1 概述 1.2.2 常见的企业成功的关键因素 1.3 战略集合转化法SST&#xff1a;把战略目标转化成信息的集合 二、管理信息系统阶段的方法论…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...