bert-base-chinese中文文档分类

bert初学者笔记,有问题欢迎大佬指正!本文介绍了如果查看bert的结构,方便小白进行理解,在看了一些论文资料后,对bert有初步的了解,面对代码可能无从下手,但是在查看bert 的结构以后就清楚很多,对于bert 的输入、输出有具象化的了解。
本文代码参考:
基于BERT的新闻文本分类
BERT文本分类,代码超基础、超详细解析

一、数据准备

1.1 代码:

本文使用的excel存放数据:
在这里插入图片描述
label表示分类标签,label=0的text都是0类别。本文将类别名称一同放在text,0的第一个text=高等数学(高数)表示0类别的文档标题是高等数学(高数),以此类推。
本文的原始数据是一堆docx文件,将文件名称和内容提出,放入excel,打上标签。

import pandas as pd
from docx import Document
import os
import re

# 读取 .docx 文件内容并分句
def read_doc(file_path):
    try:
        doc = Document(file_path)
        text = []
        for paragraph in doc.paragraphs:
            text.append(paragraph.text)
        content = '\n'.join(text)
        # 去除 AAA 和 \n
        content = content.replace('AAA', '').replace('\n', ' ').replace('#', ' ').replace('*', ' ')
        # 按句号或感叹号分句
        sentences = re.split(r'[。!]', content)
        # 去除空字符串
        sentences = [s.strip() for s in sentences if s.strip()]
        return sentences
    except Exception as e:
        print(f"Error reading {
     file_path}: {
     e}")
        return []

# 从指定文件夹读取所有 .docx 文件并合并到一个 DataFrame 中
def load_data_from_folder(folder_path):
    data = {
   
        'label': [],
        'text': []
    }

    id_counter = 0
    for filename in os.listdir(folder_path):
        if filename.endswith('.docx'):
            file_path = os.path.join(folder_path, filename)
            sentences = read_doc(file_path)
            if sentences:
                # 去除文件名中的 .docx 后缀
                title = filename[:-5]
                # 添加标题
                data['label'].append(id_counter)
                data['text'].append(title)
                # 添加句子
                for sentence in sentences:
                    # 去除句子中的 AAA、*、- 和多余空格
                    cleaned_sentence = sentence.replace('AAA', '').replace('*', '').replace('-', ' ')
                    cleaned_sentence = re.sub(r'\s+', ' ', cleaned_sentence).strip()
                    data['label'].append(id_counter)
                    data['text'].append(cleaned_sentence)
                id_counter += 1

    return pd.DataFrame(data)

def main():
    folder_path = 'data'
    data = load_data_from_folder(folder_path)
    data.to_excel('bert.xlsx', index=False)
    print("Data has been written to bert.xlsx")

if __name__ == '__main__':
    main()

1.2 代码解释:

1.标签是从0开始标的,不是1,读者可以自行修改。
2.读取目录:
这个代码和我的docx文件的目录如下:
项目
——代码
——data文件夹
————docx文件
因此我的folder_path写的就是‘data’,读者自行修改,不知道怎么改的交给ai生成代码。
3.剔除了docx文件中的AAA,#,*,等符号,读者可以自行修改。

二、bert文本分类

2.1 代码

import torch  # PyTorch库
import pandas as pd  #
### 使用 `bert-base-chinese` 进行三分类情感分析 为了实现三分类的情感分析,可以采用类似于二分类的方法,但需要调整标签的数量和相应的损失函数。以下是具体方法: #### 数据准备 数据集应包含三个类别的标注,例如正面、负面和中立。对于微博评论这样的短文本,可以通过爬取公开的数据源并手动或半自动标注来构建。 ```python import pandas as pd # 假设有一个CSV文件 'data.csv' 包含两列:text 和 label (0, 1, 2 表示不同情绪类别) df = pd.read_csv('data.csv') texts = df['text'].tolist() labels = df['label'].tolist() # labels should be integers like 0, 1, or 2 for three classes. ``` #### 加载预训练模型与Tokenizer 加载 `bert-base-chinese` 预训练权重以及对应的分词器用于处理输入文本。 ```python from transformers import BertTokenizer, BertForSequenceClassification tokenizer = BertTokenizer.from_pretrained("bert-base-chinese") model = BertForSequenceClassification.from_pretrained( "bert-base-chinese", num_labels=3) # 设置num_labels参数为3表示有三种可能的情绪输出 ``` #### 文本编码 将原始文本转换成 BERT 所需的形式——token IDs 序列加上特殊标记 `[CLS]`, `[SEP]`. ```python inputs = tokenizer(texts[:5], padding=True, truncation=True, max_length=512, return_tensors="pt") print(inputs.input_ids.shape) # 输出形状(batch_size, sequence_length),这里batch_size等于5 ``` #### 训练设置 定义优化器和其他必要的组件来进行微调操作。 ```python from torch.optim import AdamW optimizer = AdamW(model.parameters(), lr=5e-5) for epoch in range(num_epochs): # 定义迭代次数 model.train() optimizer.zero_grad() outputs = model(**inputs, labels=torch.tensor(labels[:5])) loss = outputs.loss loss.backward() optimizer.step() ``` 上述代码片段展示了如何使用 PyTorch 的 `transformers` 库中的 `BertForSequenceClassification` 类型对象配合自定义好的数据集完成一次简单的前向传播计算,并通过反向传播更新网络参数[^1][^2]. 请注意,在实际应用过程中还需要考虑更多细节问题,比如批量大小的选择、学习率调度策略等超参调节工作;同时也建议参考官方文档获取最新版本API说明和支持特性.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值