(9-3)预训练模型:BERT

请大家关注我,本文章粉丝可见,我会一直更新下去,完整代码进QQ群获取:323140750,大家一起进步、学习。

预训练模型(Pretrained Models)是通过在大规模文本数据上进行自监督学习训练的深度学习模型。这些模型通过学习通用的语言表示,可以在各种自然语言处理(NLP)任务中提供出色的性能。在市场中有很多和金融情绪预测相关的预训练模型,例如BERT和FinBERT等。

9.3.1  BERT模型介绍

BERT是一种预训练的Transformer模型,它通过在大规模文本数据上进行自监督学习来学习通用的语言表示。BERT可以理解文本中的上下文信息,并生成文本的上下文相关表示。在使用BERT进行情感分析任务时,通常会将其用作特征提取器,然后将提取的特征输入到分类器中进行情感分类。BERT需要进一步微调以适应特定的情感分析任务。使用BERT的基本流程如下所示:

(1)选择深度学习框架:首先,需要选择一个深度学习框架,例如TensorFlow或PyTorch,作为实际加载和使用BERT模型的工具。这些框架提供了用于加载和操作预训练模型的API。

2下载预训练模型权重:BERT的预训练权重通常可以从Hugging Face Transformers库(https://huggingface.co/models)或官方发布的源获取。你可以选择下载适合你任务的特定版本的BERT模型权重。

3加载模型权重:使用所选的深度学习框架,加载下载的BERT模型权重。在TensorFlow中,你可以使用TensorFlow Hub或TensorFlow的Keras模型加载BERT。在PyTorch中,你可以使用Hugging Face Transformers库加载BERT。

4使用模型:一旦加载了BERT模型权重,就可以使用它来进行文本编码、特征提取或执行各种NLP任务,例如情感分析、文本分类等。

请看下面的实例,功能是使用预训练的BERT模型对同花顺中的新闻快讯标题进行情感分析。在使用预训练的BERT模型之前,需要先登录器官方网站下载,本实例使用的是chinese_wwm_ext_pytorch简约版。下载成功后将其保存到“path”目录。

实例9-2:使用BERT获取同花顺新闻快讯的舆情信息(源码路径:daima/9/new02.py)

实例文件new02.py的具体实现代码如下所示

# 定义模型和tokenizer的文件路径
model_path = "path"  # 替换为你的模型路径
tokenizer_path = "path"  # 替换为你的tokenizer路径

# 加载BERT tokenizer和模型
tokenizer = BertTokenizer.from_pretrained(tokenizer_path)
model = BertForSequenceClassification.from_pretrained(model_path)

# 读取CSV文件
df = pd.read_csv("news_10jqka.csv")

# 取前10条数据
df = df.head(10)

# 遍历每条数据的"title"列进行情感分析
for index, row in df.iterrows():
    text = row["title"]

    # 使用tokenizer将文本编码成模型可接受的格式
    input_ids = tokenizer.encode(text, add_special_tokens=True, max_length=128, padding="max_length", truncation=True,
                                 return_tensors="pt")

    # 使用模型进行情感分析
    with torch.no_grad():
        outputs = model(input_ids)
        logits = outputs.logits

    # 获取情感分析的结果(这里假设你的模型是二分类,积极/消极)
    predicted_class = torch.argmax(logits, dim=1).item()
    sentiment = "积极" if predicted_class == 1 else "消极" if predicted_class == 0 else "中性"

    # 打印情感分析结果
    print(f"标题:{text}")
    print(f"情感:{sentiment}")

在上述代码中,首先读取CSV文件的内容,然后遍历里面前10条数据的标题。然后使用BERT模型进行情感分析,并将结果存储在sentiments列表中。最后,将情感分析结果添加到原始DataFrame中,并打印出来。执行后会输出

标题:百度申请灵境系列商标
情感:积极
标题:日本10年期国债收益率创九年来新高
情感:积极
标题:日本10年期国债收益率创九年来新高 
情感:积极
标题:光伏概念震荡走低 隆基股份跌超5%
情感:积极
标题:工信部副部长徐晓兰率团出席第29次APEC中小企业部长会议
情感:积极
标题:传媒板块异动拉升  中国科传涨停
情感:积极
标题:北京永辉超市被强执1028万
情感:积极
标题:沈阳铁西区房交会:契税可享补贴50%,团购5套以上再享9.5...
情感:积极
标题:国家统计局:2022年我国经济发展新动能指数比上年增长28.4%
情感:积极
标题:机构:上半年中国半导体产业投资金额同比下滑22.7%
情感:积极

9.3.2  情感关键字

在前面的实例9-2的输出结果中,所有的标题都被分类为"积极"情感,这可能是因为使用的预训练模型在情感分析任务上并没有很好地适应你的数据,或者你的数据集中的标题文本在情感上确实偏向积极。接下来需要改进,例如根据标题中包含的特定关键字来进行情感分类,将包含negative_keywords = ["利空", "下跌", "跌幅", "亏损", "超跌", "下滑", "强执","跌超"]的标题分类为消极情感,将包含positive_keywords = ["利好", "增长", "涨幅", "上涨", "涨停"]]的标题分类为积极情感,下面的实例演示了这一功能。

实例9-3:添加情感关键字(源码路径:daima/9/new03.py)

实例文件new03.py的具体实现代码如下所示

# 加载预训练的BERT模型和tokenizer
model_path = "path"  # 替换为你的预训练模型路径
tokenizer_path = "path"  # 替换为你的预训练tokenizer路径
tokenizer = BertTokenizer.from_pretrained(tokenizer_path)
model = BertForSequenceClassification.from_pretrained(model_path)

# 读取新闻数据
df = pd.read_csv("news_10jqka.csv")
titles = df["title"][:10]  # 选择前10条标题进行情感分析

# 定义情感关键字
positive_keywords = ["利好", "增长", "涨幅", "上涨", "涨停"]
negative_keywords = ["利空", "下跌", "跌幅", "亏损", "超跌", "下滑", "强执", "跌超"]

# 遍历标题并进行情感分析
for title in titles:
    # 使用tokenizer将文本编码成模型可接受的格式
    input_ids = tokenizer.encode(title, add_special_tokens=True, max_length=128, padding="max_length", truncation=True,
                                 return_tensors="pt")

    # 检查标题是否包含消极关键字,如果包含则将情感类别设置为消极
    contains_negative_keyword = any(keyword in title for keyword in negative_keywords)

    # 检查标题是否包含积极关键字,如果包含则将情感类别设置为积极
    contains_positive_keyword = any(keyword in title for keyword in positive_keywords)

    # 使用模型进行情感分析
    with torch.no_grad():
        outputs = model(input_ids)
        logits = outputs.logits

    # 获取情感分析的结果
    predicted_class = torch.argmax(logits, dim=1).item()

    if contains_negative_keyword:
        sentiment = "消极"
    elif contains_positive_keyword:
        sentiment = "积极"
    else:
        if predicted_class == 1:
            sentiment = "积极"
        elif predicted_class == 0:
            sentiment = "消极"
        else:
            sentiment = "中性"

    # 打印情感分析结果
    print(f"标题:{title}")
    print(f"情感:{sentiment}")
    print()

上述代码的实现流程如下:

(1)导入必要的库,包括PyTorch、Hugging Face Transformers库和Pandas。

2)定义预训练模型和tokenizer的文件路径,你需要将其替换为实际的路径。这些路径指向了已经下载的BERT模型和tokenizer。

3)加载BERT tokenizer和模型。从预训练文件夹中加载预训练的BERT模型和tokenizer。

4)定义情感关键字,包括negative_keywords和positive_keywords,用于后处理。

5)读取包含新闻标题的CSV文件(假设文件名为"news_10jqka.csv"),并将其存储在DataFrame中。

6)对前10条数据进行情感分析,遍历DataFrame的前10行数据。对每个新闻标题进行情感分析的主要步骤如下:

  1. 使用tokenizer将标题文本编码为模型可接受的格式。
  2. 使用模型进行情感分析,并获取模型的输出。
  3. 根据输出的结果,判断标题的情感是积极、消极还是中性。
  4. 通过检查标题中是否包含情感关键字,进行后处理以更改情感标签。

8)打印输出每个标题的情感分析结果,包括标题文本和情感标签。

执行后会输出:

标题:百度申请灵境系列商标
情感:积极

标题:日本10年期国债收益率创九年来新高
情感:积极

标题:日本10年期国债收益率创九年来新高 
情感:积极

标题:光伏概念震荡走低 隆基股份跌超5%
情感:消极

标题:工信部副部长徐晓兰率团出席第29次APEC中小企业部长会议
情感:积极

标题:传媒板块异动拉升  中国科传涨停
情感:积极

标题:北京永辉超市被强执1028万
情感:消极

标题:沈阳铁西区房交会:契税可享补贴50%,团购5套以上再享9.5...
情感:积极

标题:国家统计局:2022年我国经济发展新动能指数比上年增长28.4%
情感:积极

标题:机构:上半年中国半导体产业投资金额同比下滑22.7%
情感:消极

虽然上面代码的识别结果符合我们的预期,但是在上面的代码中添加的情感关键字negative_keywords和positive_keywords和大模型完全无关,也不是预训练模型的参数,它们只是在代码中定义的两个列表,用于指定哪些关键字应该被视为负面情感和正面情感的指示标志。

预训练模型(如BERT)本身并不包含关于具体情感词汇的信息,它是根据大规模文本数据进行预训练的,可以理解为它具备了一定的语言理解能力,但不具备特定情感的识别能力。因此,为了对特定情感进行分类,我们需要自行定义这些情感关键字,并根据它们在文本中的出现来进行分类。

在上述代码中,negative_keywords和positive_keywords用于识别标题中是否包含特定情感相关的关键字,以决定将标题分类为消极情感还是积极情感。这些关键字是你自己定义的,不是预训练模型的一部分。

9.3.3  模型微调

模型微调(Fine-tuning)是深度学习中一种常见的训练策略,它通常指的是在预训练模型的基础上,通过在特定任务的数据集上进行额外的训练来适应特定任务。微调的核心思想是利用已经在大规模数据上预训练好的模型的知识,然后通过在任务相关的数据上进行有监督的训练,进一步优化模型的性能。

例如在前面实例中,情感关键字negative_keywords和positive_keywords通常不会直接添加到预训练模型中,因为预训练模型的参数是通过大规模文本数据进行学习的,而不是通过手动添加特定的关键字。这些关键字可以在微调(fine-tuning)阶段或应用阶段的代码中使用,以帮助模型对特定情感或主题进行分类。

在情感分析任务中,通常的做法是将情感关键字用于后续的数据预处理或后处理步骤,例如:

  1. 数据预处理:在训练数据中,可以根据这些关键字标记文本样本的标签,使模型在训练过程中了解这些情感关键字与标签之间的关系。
  2. 后处理:在模型输出的预测结果中,你可以根据这些关键字对预测结果进行调整,以提高情感分析的准确性。例如,如果输出结果包含"利好"或"增长"等关键字,你可以将其分类为积极情感。

实例9-4:为预训练模型添加情感关键字(源码路径:daima/9/wei.py)

实例文件wei.py的具体实现代码如下所示

import torch
import torch.nn as nn
from transformers import BertTokenizer, BertForSequenceClassification
from torch.utils.data import DataLoader, TensorDataset
import pandas as pd

# 加载预训练的BERT模型和tokenizer
model_path = "path"  # 替换为你的预训练模型路径
tokenizer_path = "path"  # 替换为你的tokenizer路径
tokenizer = BertTokenizer.from_pretrained(tokenizer_path)
model = BertForSequenceClassification.from_pretrained(model_path, num_labels=3)  # 假设有3个情感类别

# 读取带有情感标签的CSV文件
df = pd.read_csv("news_with_sentiment.csv")
texts = df["title"]
label_mapping = {"消极": 0, "积极": 1, "中性": 2}  # 情感标签到数值的映射
label_values = df["qinggan"].map(label_mapping)  # 将字符串标签映射为数值标签

# 数据预处理
tokenized_texts = tokenizer(texts.tolist(), padding=True, truncation=True, return_tensors="pt")
input_ids = tokenized_texts["input_ids"]
attention_mask = tokenized_texts["attention_mask"]

# 创建数据加载器
dataset = TensorDataset(input_ids, attention_mask, torch.tensor(label_values))  # 修改此处为 torch.tensor(label_values)
batch_size = 2
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-5)

# 微调模型
num_epochs = 3
for epoch in range(num_epochs):
    for batch in dataloader:
        input_ids, attention_mask, labels = batch
        outputs = model(input_ids, attention_mask=attention_mask, labels=labels)
        loss = outputs.loss
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

# 保存微调后的模型
model.save_pretrained("fine_tuned_model")

上述代码的实现流程如下:

(1)加载预训练BERT模型和tokenizer:

  1. model_path 和 tokenizer_path 分别是预训练模型和tokenizer的路径。
  2. BertTokenizer.from_pretrained(tokenizer_path) 用于加载BERT模型的tokenizer。
  3. BertForSequenceClassification.from_pretrained(model_path, num_labels=3) 用于加载BERT模型,num_labels 设置为3表示假设有3个情感类别。

(2)读取带有情感标签的CSV文件:

  1. 使用 pd.read_csv("news_with_sentiment.csv") 读取包含标题和情感标签的CSV文件。
  2. 变量texts包含CSV文件中的标题数据。
  3. label_mapping 是从情感标签到数值的映射,例如,"消极" 映射为0,"积极" 映射为1,"中性" 映射为2。
  4. label_values 通过将字符串标签映射为数值标签创建了一个新的标签列。

(3)数据预处理

  1. 使用tokenizer将文本数据编码为模型可接受的格式,包括标记化(tokenization)、填充(padding)和截断(truncation)等操作。
  2. 创建了 input_ids 和 attention_mask 以准备输入到模型中。

(4)创建数据加载器

  1. TensorDataset 用于将输入数据、注意力掩码和标签封装成PyTorch数据集。
  2. batch_size 指定了每个训练批次的大小。
  3. DataLoader 用于生成批次数据以供模型训练。

(5)定义损失函数和优化器

  1. 使用 nn.CrossEntropyLoss() 定义了交叉熵损失函数,用于多类别分类任务。
  2. 使用 torch.optim.AdamW 定义了AdamW优化器。

(6)微调模型

  1. 使用嵌套的循环进行微调,外层循环控制训练的轮数,内层循环用于逐批次处理训练数据。
  2. 在每个批次中,将输入数据和标签传递给模型,并计算损失。
  3. 然后通过反向传播(backward())和优化器来更新模型的权重。
  4. 这个过程会在多个轮次中重复,以提高模型性能。

(7)保存微调后的模型使用 model.save_pretrained("fine_tuned_model") 保存微调后的模型,可以后续用于推断任务。

  • 19
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值