基于hfl/rbt3模型的情感分析学习研究——文本挖掘

参考书籍《HuggingFace自然语言处理详解 》

什么是文本挖掘

  文本挖掘(Text mining)有时也被称为文字探勘、文本数据挖掘等,大致相当于文字分析,一般指文本处理过程中产生高质量的信息。高质量的信息通常通过分类和预测来产生,如模式识别。文本挖掘通常涉及输入文本的处理过程(通常进行分析,同时加上一些派生语言特征以及消除杂音,随后插入到数据库中) ,产生结构化数据,并最终评价和解释输出。典型的文本挖掘方法包括文本分类,文本聚类,概念/实体挖掘,生产精确分类,观点分析,文档摘要和实体关系模型 。^[1]^

自然语言处理的基本流程

准备数据集

  数据集是进行NLP研究的基础,包含了大量文本数据和标注信息。数据集的质量和多样性对NLP的模型性能有着重要影响。本次作业主要是对预训练的语言模型进行微调,准备训练数据集是为了让模型能够学习到文本数据的特征和规律以更好的理解和处理自然语言。

​  

图 1 基本开发流程

编码器

本次作业选择的模型是 hfl/rbt3,所以使用匹配的 rbt3编码工具。

编码器主要作用是将语料库中的文本数据转化为计算机可读的编码格式。编码器可对文本数据进行清洗、预处理、分词、标注等操作,提取文本中关键信息。

数据集

数据集经过不断试错,从 wikipedia, bookcorpus, billsum等等中,最终确定选择为chn_senti_corp。

数据集经过编码器处理后,转化成了计算机可处理的数据形式,此时可以对数据集进行后续的数据处理,如缩小训练数据的规模、处理超过512个词长度的数据等等。

定义模型

预训练模型选择 hfl/rbt3,此模型是 HFL 实验室分享至HG模型。

超参数是指模型训练过程中需要预先设定的参数,参数的设定需要一定的实验经验,本次超参数设置主要参考《HuggingFace自然语言处理详解》。

训练及评估

在模型训练过程中为了方便观察模型新能变化,需要定义一个评价函数。在情感分析任务中,正确率指标是重点。

微调hfl/rbt3模型的代码实现

# -*- coding:GB2312 -*-
# %%
from transformers import AutoTokenizer,TrainingArguments,Trainer,
from transformers.data.data_collator import DataCollatorWithPadding
from transformers import AutoModelForSequenceClassification
from datasets import load_from_disk, Dataset, load_metric
import numpy as np
import torch
​
# %%
tokenizer = AutoTokenizer.from_pretrained('hfl/rbt3')
​
tokenizer.batch_encode_plus(
['一曲青溪一曲山', '鸟飞鱼跃白云间'],
truncation=True,
)
​
# %%
# 加载数据集
dataset_train = Dataset.from_file('./data/chn_senti_corp/chn_senti_corp-train.arrow')
dataset_test = Dataset.from_file('./data/chn_senti_corp/chn_senti_corp-test.arrow')
dataset_valid = Dataset.from_file('./data/chn_senti_corp/chn_senti_corp-validation.arrow')
​
# %%
# 缩小数据规模,便于测试
dataset_train= dataset_train.shuffle().select(range(3000))
dataset_test= dataset_test.shuffle().select(range(200))
​
# %%
#编码
def f(data):
    return tokenizer.batch_encode_plus(data['text'],truncation=True)
​
dataset_train=dataset_train.map(f,
batched=True,
batch_size=100,
# num_proc=4,
remove_columns=['text'])
​
# %%
dataset_test=dataset_test.map(f,
batched=True,
batch_size=100,
remove_columns=['text'])
​
# %%
def filter_func(data):
    return [len(i)<=512 for i in data['input_ids']]
​
dataset_train=dataset_train.filter(filter_func, batched=True, batch_size=100)
dataset_test=dataset_test.filter(filter_func, batched=True, batch_size=100)
​
# %%
model=AutoModelForSequenceClassification.from_pretrained('hfl/rbt3',num_labels=2)
​
# %%
#加载评价指标
metric = load_metric('accuracy')
​
#定义评价函数
from transformers.trainer_utils import EvalPrediction
def compute_metrics(eval_pred):
    logits, labels = eval_pred
    logits = logits.argmax(axis=1)
    return metric.compute(predictions=logits, references=labels)
​
# %%
#定义训练参数
args = TrainingArguments(
    output_dir='./output_dir/third/',
    evaluation_strategy='steps',
    eval_steps=30,
    save_strategy='steps',
    save_steps=30,
    num_train_epochs=2,
    learning_rate=1e-4,#定义学习率
    weight_decay=1e-2,
    per_device_eval_batch_size=16,
    per_device_train_batch_size=16,
    no_cuda=False,
)
​
# %%
#定义训练器
trainer = Trainer(
model=model,
args=args,
train_dataset=dataset_train,
eval_dataset=dataset_test,
compute_metrics=compute_metrics,
data_collator=DataCollatorWithPadding(tokenizer),
)
​
#评价模型
trainer.evaluate()
trainer.train()
trainer.evaluate()

结果展示

从训练前后的评价函数结果可以明显的看到微调训练的结果,见下表。

表 1 训练前后评价结果

模型eval_losseval_accuracyeval_runtimeepoch
before0.6980.52222.22-
after0.2390.92351.682

训练过程中损失函数与正确率的变化可见下图。

​  

图 2 loss图 3 accuracy

结语

   学习初期走过不少弯路,有尝试自己挖掘文本和数据,计划整个大工程,实际操作时却遇到种种难题,网站防爬、检索数据不符合规范、不同网站私有定义太多等等。缺乏相关经验导致的结果是动手时在作业初期就遇到太多问题,作业进度缓慢,信心与耐心也逐渐下降。

在准备数据集时也走过一些误区。以下说几个遇到的问题:一是准备的数据集没有标注且与模型不匹配,导致模型训练时配置出错,无法执行训练。二是数据集过大,执行操作时对笔记本的负担很大,硬盘和存在在训练几小时后直接爆满导致训练失败。其他种种,所以准备一个合适的数据集是重中之重。

实际动手做一个新接触的作业,不能眼高手低或投机取巧让ChatGPT完成整个项目,还是需要找到一份合适的指导资料,静下心熟悉每一个操作。感谢老师及同学们的帮助,《HuggingFace自然语言处理详解》让我真正入门了NLP。

参考文献:

[1] 维基百科编者.文本挖掘[G/OL].维基百科,2019(2019-5-9) [2023-12-15]. https://zh.wikipedia.org/wiki/文本挖掘.

  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 基于BERT-BILSTM-CRF进行中文命名实体识别python源码+项目使用说明+数据+模型.zip 依赖 ```python scikit-learn==1.1.3 scipy==1.10.1 seqeval==1.2.2 transformers==4.27.4 pytorch-crf==0.7.2 ``` # 目录结构 ```python --checkpoint:模型和配置保存位置 --model_hub:预训练模型 ----chinese-bert-wwm-ext: --------vocab.txt --------pytorch_model.bin --------config.json --data:存放数据 ----dgre --------ori_data:原始的数据 --------ner_data:处理之后的数据 ------------labels.txt:标签 ------------train.txt:训练数据 ------------dev.txt:测试数据 --config.py:配置 --model.py:模型 --process.py:处理ori数据得到ner数据 --predict.py:加载训练好的模型进行预测 --main.py:训练和测试 ``` # 说明 这里以dgre数据为例,其余数据类似。 ```python 1、去https://huggingface.co/hfl/chinese-bert-wwm-ext/tree/main下载相关文件到chinese-bert-wwm-ext下。 2、在process.py里面定义将ori_data里面的数据处理得到ner_data下的数据,ner_data下数据样本是这样的: --labels.txt 故障设备 故障原因 --train.txt/dev.txt {"id": "AT0001", "text": ["6", "2", "号", "汽", "车", "故", "障", "报", "告", "综", "合", "情", "况", ":", "故", "障", "现", "象", ":", "加", "速", "后", ",", "丢", "开", "油", "门", ",", "发", "动", "机", "熄", "火", "。"], "labels": ["O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "B-故障设备", "I-故障设备", "I-故障设备", "B-故障原因", "I-故障原因", "O"]} 一行一条样本,格式为BIO。 3、在config.py里面定义一些参数,比如: --max_seq_len:句子最大长度,GPU显存不够则调小。 --epochs:训练的epoch数 --train_batch_size:训练的batchsize大小,GPU显存不够则调小。 --dev_batch_size:验证的batchsize大小,GPU显存不够则调小。 --save_step:多少step保存模型 其余的可保持不变。 4、在main.py里面修改data_name为数据集名称。需要注意的是名称和data下的数据集名称保持一致。最后运行:python main.py 5、在predict.py修改data_name并加入预测数据,最后运行:python predict.py ``` 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
【资源介绍】 基于pytorch框架+Bert的指代消解python源码(课程大作业)+训练好的模型+项目说明+数据.zip 提取span1及span2对应位置的向量后和[CLS]对应的向量进行拼接,然后在第0维进行求和之后,最终利用融合后的向量进行二分类。使用的预训练模型可以去hugging face上下载:hfl/chinese-roberta-wwm-ext。已经训练好的模型: 阿里云盘链接:https://www.aliyundrive.com/s/YhRYjA8zD16 目录结构 --checkpoints:模型保存位置 --logs:日志保存位置 --utils:辅助函数位置 --data:数据文件 --bertBaseModel.py:基本的Bert --config.py:配置 --CRModel.py:指代消解模型 --dataset.py:pytorch数据集 --main.py:主运行程序 --preprocess.py:数据预处理 运行指令 由于已经在config.py中修改了相关的参数,因此直接运行以下命令即可,如果需要修改相关参数,可以直接在config.py中进行修改,也在命令行中修改。 ```python python main.py ``` 运行指令 由于已经在config.py中修改了相关的参数,因此直接运行以下命令即可,如果需要修改相关参数,可以直接在config.py中进行修改,也在命令行中修改。 ```python python main.py ``` 训练及验证 ```python epoch:7/50 step:137/1000 loss:0.160401 2021-09-16 15:19:28,529 - INFO - main.py - train - 109 - [train] epoch:7/50 step:138/1000 loss:0.168107 2021-09-16 15:19:29,554 - INFO - main.py - train - 109 - [train] epoch:7/50 step:139/1000 loss:0.107534 2021-09-16 15:19:32,756 - INFO - main.py - train - 114 - [dev] loss:3.039502 accuracy:0.7632 precision:0.7632 recall:0.7632 f1:0.7632 ``` 测试 ```python 2021-09-16 15:19:36,391 - INFO - main.py - test - 175 - precision recall f1-score support 0 0.86 0.77 0.81 193 1 0.66 0.78 0.72 111 accuracy 0.78 304 macro avg 0.76 0.78 0.77 304 weighted avg 0.79 0.78 0.78 304 ``` 【备注】 该项目是个人毕设/课设/大作业项目,代码都经过本地调试测试,功能ok才上传,高分作品,可快速上手运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 欢迎下载使用,也欢迎交流学习

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值