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 AutoTokenizer

tokenizer = 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 np

labels = np.array(labels)
train_list = np.array(train_list)

# 已经把数据转化成了词向量 (Bert不需要词嵌入)  RNN --> LSTM
from transformers import TFBertForSequenceClassification

model = 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 np

labels = 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()会显示模型的结构和参数信息。


result = model.fit(x=train_list, y=labels, batch_size=128, epochs=10)
print(result.history)

模型训练过程。使用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有一个初步的了解!

你可能感兴趣的:(#,1.,自然语言处理&知识图谱,自然语言处理,bert,分类)