摘要:
合集:AI案例-传统机器学习-泛金融
赛题:CCF大数据与计算智能大赛-BDCI-2021-产品评论观点提取
AI问题:识别文本中的实体
数据集:知乎、理财贷款论坛、投资理财通、银行客服等公开真实金融产品评论数据集,包括7,530条训练数据和2,883条测试数据。
数据集发布方:中原银行
数据集价值:挖掘大量银行产品评论文本数据,采用合适的算法精准提取产品评论观点。
解决方案:基于模型chinese-bert-wwm-ext,使用simpletransformers开发框架进行命名实体识别(NER)和文本分类。
一、赛题描述
背景
随着互联网的不断深入普及,越来越多的用户在体验企业提供的产品和服务时,会将其感受和评论分享在互联网上。这些评价和反馈信息对企业针对性地改善产品和服务有极强的指导意义,但互联网的海量信息容量让人工查找并处理评价内容的方案代价高昂。本赛题提供了一个银行业产品评价的场景,探索利用自然语言处理技术来完成评论观点的自动化提取,为行业的进一步发展提高提供参考。
任务
观点提取旨在从非结构化的评论文本中提取标准化、结构化的信息,如产品名、评论维度、评论观点等。此处希望大家能够通过自然语言处理的语义情感分析技术判断出一段银行产品评论文本的情感倾向,并能进一步通过语义分析和实体识别,标识出评论所讨论的产品名,评价指标和评价关键词。
二、数据集描述
数据说明
来自知乎、理财贷款论坛、投资理财通、银行客服等公开真实金融产品评论数据集,包括7,530条训练数据和2,883条测试数据。
1、训练数据
训练数据文件 train_data.csv
字段名 | 字段说明 |
---|---|
text | 评论原始文本 |
BIO_anno | BIO格式的实体标注 |
class | 情感分类(1:正面,0:负面,2:中立) |
bank_topic | 评论来源与哪个银行板块 |
实体标注采用BIO格式,即Begin, In, Out格式。
说明:
- B-BANK 代表银行实体的开始
- I-BANK 代表银行实体的内部
- B-PRODUCT 代表产品实体的开始
- I-PRODUCT 代表产品实体的内部
- O 代表不属于标注的范围
- B-COMMENTS_N 代表用户评论(名词)
- I-COMMENTS_N 代表用户评论(名词)实体的内部
- B-COMMENTS_ADJ 代表用户评论(形容词)
- I-COMMENTS_ADJ 代表用户评论(形容词)实体的内部
数据样例:
id | text | BIO_anno | class |
---|---|---|---|
0 | 交行14年用过,半年准备提额,却直接被降到1K,半年期间只T过一次三千,其它全部真实消费,第六个月的时候为了增加评分提额,还特意分期两万,但降额后电话投诉,申请提… | B-BANK I-BANK O O O O O O O O O O B-COMMENTS_N I-COMMENTS_N O O O O O B-COMMENTS_ADJ I-COMMENTS_ADJ O O O O O O O O O O O O O O O O O O O O O B-COMMENTS_N I-COMMENTS_N O O O O O O O O O O B-COMMENTS_N I-COMMENTS_N O O B-COMMENTS_N I-COMMENTS_N O O O O B-PRODUCT I-PRODUCT O O O O B-COMMENTS_ADJ O O O O O O O O O O O O O | 0-负面 |
1 | 单标我有了,最近visa双标返现活动好 | B-PRODUCT I-PRODUCT O O O O O O B-PRODUCT I-PRODUCT I-PRODUCT I-PRODUCT B-PRODUCT I-PRODUCT B-COMMENTS_N I-COMMENTS_N I-COMMENTS_N I-COMMENTS_N B-COMMENTS_ADJ | 1-正面 |
2 | 建设银行提额很慢的…… | B-BANK I-BANK I-BANK I-BANK B-COMMENTS_N I-COMMENTS_N B-COMMENTS_ADJ I-COMMENTS_ADJ O O O | 0-负面 |
3 | 我的怎么显示0.25费率,而且不管分多少期都一样费率,可惜只有69k | O O O O O O O O O O B-COMMENTS_N I-COMMENTS_N O O O O O O B-COMMENTS_ADJ I-COMMENTS_ADJ O O O O B-COMMENTS_N I-COMMENTS_N O B-COMMENTS_ADJ I-COMMENTS_ADJ B-COMMENTS_ADJ I-COMMENTS_ADJ O O O | 2-中立 |
4 | 利率不错,可以撸 | B-COMMENTS_N I-COMMENTS_N B-COMMENTS_ADJ I-COMMENTS_ADJ O O O O | 1-正面 |
5 | 不能??好像房贷跟信用卡是分开审核的反正我的不得 | O O O O O O O O O O O O O O O B-COMMENTS_N I-COMMENTS_N O O O O O O O | 2-中立 |
6 | 我感觉这样才是合理的,花呗白条没要那么多信息,照样可以给额度。有征信威慑,没那么多人敢借了不还。与其眉毛胡子一把抓,还不如按额度区间对客户进行不同程度的调查,免… | O O O O O O O B-COMMENTS_ADJ I-COMMENTS_ADJ O O B-PRODUCT I-PRODUCT B-PRODUCT I-PRODUCT O O O O O O O O O O O O O B-COMMENTS_N I-COMMENTS_N O O B-PRODUCT I-PRODUCT B-COMMENTS_ADJ I-COMMENTS_ADJ 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-COMMENTS_N I-COMMENTS_N O O O O O O O O O O O O O O O O O O O | 2-中立 |
7 | 羡慕,可能上个月申请多了。上月连续下了浦发广发华夏交通。这个月申请建行,农业??邮储各种秒拒,买了点建行理财,3个月后在看… | O O O O O O O O O O O O O O O O O O O B-BANK I-BANK B-BANK I-BANK B-BANK I-BANK 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-PRODUCT I-PRODUCT O O O O O O O O O O | 0-负面 |
2、测试数据
测试数据:test_public.csv
id | text |
---|---|
0 | 共享一个额度,没啥必要,四个卡不要年费吗?你这种人头,银行最喜欢,广发是出了名的风控严,套现就给你封… |
1 | 炸了,就2000.浦发没那么好心,草 |
2 | 挂了电话自己打过去分期提额可以少分一点的 |
3 | 比如你首卡10k,二卡也10k,信报上显示邮政总共给你的授信额度是20k |
4 | 3000吗,浦发总是这样 |
3、提交数据
选手提交 submission.csv
字段名 | 字段说明 |
---|---|
id | 原始文本id |
BIO_anno | BIO格式的实体标注 |
class | 情感分类预测结果 |
数据样例:
id | BIO_anno | class |
---|---|---|
0 | 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 O O O O O O O | 2 |
1 | O O O O O O O O | 2 |
2 | O O O O O O O O O O O O | 2 |
附BIO格式简介
1. 什么是BIO格式?
BIO格式是一种用于序列标注任务的标注规范,尤其在命名实体识别(NER)中广泛应用。它将每个词(或字)标记为以下三种标签之一:
- B (Begin):表示当前词是实体的开始。例如:”北京”(地名)中的”北”标记为
B-LOC
(LOC表示地点)。 - I (Inside):表示当前词是实体的后续部分。例如:”京”标记为
I-LOC
。 - O (Outside):表示当前词不属于任何实体。例如:”的”(非实体词)标记为
O
。
2. 标签扩展(BIOES格式)
更复杂的变体如BIOES进一步细分:
- E (End):实体结束词(如”京”标记为
E-LOC
)。 - S (Single):单字实体(如”沪”标记为
S-LOC
)。
3. 用途
- 命名实体识别(NER):识别文本中的人名、地点、组织等。例句:”马云在阿里巴巴工作” 标注:
马/B-PER 云/I-PER 在/O 阿/B-ORG 里/I-ORG 巴/I-ORG 伯/I-ORG 工作/O
- 其他序列任务:如词性标注、分块分析(Chunking)等。
4. 为什么用BIO?
- 明确边界:区分实体的起始和中间部分,避免歧义。
- 模型友好:帮助模型学习实体结构和上下文。
5. 基于规则/词典的自动标注
原理:
- 预定义实体词典(如人名、地名列表)或规则(如正则表达式匹配日期、邮箱等)。
- 遍历文本,匹配到的词直接赋予BIO标签(例如词典中的词标记为
B-ENTITY
)。
优缺点:
- 优点:简单、快速,无需训练数据。
- 缺点:
- 无法识别未登录词(词典外的实体)。
- 歧义难以处理(如“苹果”可能是公司或水果)。
工具示例:
- spaCy的
EntityRuler
模块、Flair的字典匹配。
数据集版权许可协议
BY-NC-SA 4.0
https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-hans
发布方:中原银行
三、解决方案样例
工作原理介绍
命名实体识别(Named Entity Recognition,简称 NER)是自然语言处理(NLP)中的一项核心任务,旨在从非结构化的文本中自动识别并分类特定类型的实体。这些实体通常包括人名、地名、组织机构名、时间、日期、货币、百分比等具有明确语义意义的词汇或短语。
NER 的核心目标
- 识别实体:从文本中找到具有特定意义的词汇。例如:在句子“巴黎是法国的首都”中,识别出“巴黎”(地点)、“法国”(国家)。
- 分类实体类型:为每个识别出的实体标注其所属的类别。例如:“苹果”可能是水果(如果上下文是饮食)或公司(如果上下文是科技新闻)。
NER 的典型应用场景
- 信息提取:从新闻、论文、报告中提取关键信息(如人物、地点、事件)。示例:从“马斯克宣布特斯拉将在柏林建厂”中提取“马斯克”(人名)、“特斯拉”(公司)、“柏林”(地点)。
- 问答系统:回答基于实体的问题,如“谁发明了电话?” → 提取“贝尔”(人名)。
- 机器翻译:保留实体名称的准确性,避免翻译错误(如“iPhone”不应翻译为中文)。
- 知识图谱构建:将文本中的实体及其关系转化为结构化知识(如“姚明 → 篮球运动员 → 中国”)。
- 舆情分析:监控特定实体(如品牌、人物)在社交媒体中的提及情况。
安装开发包
外部库名称 | 版本号 |
---|---|
python | 3.11.9 |
pandas | 2.1.4 |
simpletransformers | 0.70.1 |
pyarrow | 16.1.0 |
xxhash | 3.5.0 |
opencv-python | 4.11.0.86 |
sentencepiece | 0.1.99 |
protobuf | 3.20.2 |
Simple Transformers 是一个基于 Hugging Face Transformers 库的封装,旨在简化 Transformer 模型的使用。它提供了简单的 API 来训练、评估和使用 Transformer 模型进行各种 NLP 任务。安装方法参考《安装深度学习框架PyTorch》和《安装Huggingface-Transformers》。安装Simple Transformers的方法为:
# 安装 simpletransformers
pip install simpletransformers
NERModel 是 Simple Transformers 中用于命名实体识别(NER)任务的类。主要功能:
- 支持多种 Transformer 模型(BERT, RoBERTa, DistilBERT 等)
- 简单的训练和评估接口
- 支持自定义实体标签
- 提供预测功能
源码结构
1. 环境初始化
import warnings
warnings.simplefilter('ignore')
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
import pandas as pd
pd.set_option('display.max_rows', 500)
from tqdm.notebook import tqdm
from simpletransformers.ner import NERModel, NERArgs
from simpletransformers.classification import ClassificationModel, ClassificationArgs
- 忽略警告信息
- 设置环境变量解决库冲突
- 导入数据处理和深度学习模型相关库
2. 数据加载与预处理
train = pd.read_csv('./data/train_data_public.csv') # 训练数据 (7528条)
test = pd.read_csv('./data/test_public.csv') # 测试数据 (2883条)
submit = pd.read_csv('./data/submit_example.csv') # 提交格式示例
训练数据结构:
text
:评论文本BIO_anno
:BIO标注序列(实体标签)class
:情感分类标签(0/1/2)
标签说明:
B-BANK
/I-BANK
:银行名称B-PRODUCT
/I-PRODUCT
:金融产品B-COMMENTS_N
/I-COMMENTS_N
:名词性评价B-COMMENTS_ADJ
/I-COMMENTS_ADJ
:形容词性评价O
:非实体
3. NER任务流程
(1) 数据转换
# 将文本拆分为字符级序列
for row in train.iterrows():
sentence_id = row['id']
for idx, char in enumerate(row['text']):
train_data.append({
'sentence_id': sentence_id,
'words': char,
'labels': row['BIO_anno'].split()[idx] # 匹配字符与标签
})
- 将原始文本转换为字符级BIO标注序列
- 生成185,971条字符级训练样本
(2) 模型配置
labels = [
'B-BANK',
'I-BANK',
'B-PRODUCT',
'I-PRODUCT',
'B-COMMENTS_N',
'I-COMMENTS_N',
'B-COMMENTS_ADJ',
'I-COMMENTS_ADJ',
'O'
]
model_args = NERArgs()
model_args.max_seq_length = 400 # 最大序列长度
model_args.train_batch_size = 8 # 批大小
model_args.num_train_epochs = 1 # 训练轮次
model_args.fp16 = False # 禁用混合精度
model_args.evaluate_during_training = True
(3) 模型训练与预测
model = NERModel("bert", "./chinese-bert-wwm-ext", labels=labels)
model.train_model(train_df, eval_data=valid_df) # 训练
pred, _ = model.predict(test['text']) # 预测
- 使用预训练中文BERT模型
- 训练集/验证集拆分(6800/728条)
- 测试集预测结果转换为BIO标签序列
4. 文本分类任务流程
(1) 模型配置
model_args = ClassificationArgs(
max_seq_length=400,
train_batch_size=8,
num_train_epochs=2, # 2轮训练
tensorboard_dir="../runs" # 日志目录
)
(2) 模型训练与预测
model = ClassificationModel("bert", "./chinese-bert-wwm-ext", num_labels=3)
model.train_model(train_df) # 训练(7528条)
pred = model.predict(list(test['text'])) # 预测情感分类
- 三分类模型(0/1/2)
- 直接使用原始文本训练
5. 结果整合与提交
sub = pd.read_csv('submit_ner.csv') # 加载NER结果
sub['class'] = pred # 添加分类结果
sub.to_csv('submit.csv', index=False)
最终提交文件结构:
id
:样本IDBIO_anno
:NER预测的BIO序列class
:情感分类预测(0/1/2)
运行结果
1、命名实体识别 (NER)
训练过程输出如下:
16/? [00:44<00:00, 1.58s/it]
Epoch 2 of 2: 100%
2/2 [6:45:00<00:00, 12140.81s/it]
Epochs 1/2. Running Loss: 0.3131: 100%
941/941 [3:23:13<00:00, 12.91s/it]
Epochs 2/2. Running Loss: 0.0375: 100%
941/941 [3:21:30<00:00, 12.85s/it]
2、最终提交文件
输出数据样例:submit.csv。其中id为原始文本id,BIO_anno为BIO格式的实体标注,class为情感分类预测结果(1:正面,0:负面,2:中立)。
id | BIO_anno | class |
---|---|---|
0 | O O O O B-COMMENTS_N I-COMMENTS_N O O O O O O O O B-PRODUCT O O B-COMMENTS_N I-COMMENTS_N O O O O O O O O O O O I-COMMENTS_ADJ I-COMMENTS_ADJ O B-BANK I-BANK O O O O O B-COMMENTS_N I-COMMENTS_N B-COMMENTS_ADJ O O O O O O O O O O | 1 |
1 | O O O O O O O O O B-BANK I-BANK O O O B-COMMENTS_ADJ I-COMMENTS_ADJ O O | 0 |
2 | O O O O O O O O O B-PRODUCT I-PRODUCT B-COMMENTS_N I-COMMENTS_N O O O O O O O | 2 |
… | … | … |
源码开源协议
GPL-v3