共计 1994 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点:为什么需要 BERT 处理投诉数据?
在处理客服或电商场景的投诉数据时,我们常常遇到几个头疼的问题。首先,投诉文本通常是非结构化的,表达方式千奇百怪。同一个问题,用户可能用完全不同的方式描述。其次,人工标注成本极高,特别是当数据量达到数十万条时。最后,传统的关键词匹配方法很难捕捉到语义层面的相似性。

技术对比:从 TF-IDF 到 BERT 的进化之路
- TF-IDF:简单直接,但无法理解词义和上下文关系。比如 ” 退款 ” 和 ” 退货 ” 会被视为完全不相关的词。
- Word2Vec:有了词向量的概念,可以计算词语相似度,但依然存在一词多义问题。
- BERT:通过 Transformer 架构和预训练机制,既能理解上下文,又能捕捉深层语义。这正是处理投诉数据时最需要的特性。
核心实现步骤
1. 构建 BERT 特征提取器
from transformers import BertModel, BertTokenizer
import torch
# 加载预训练模型
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertModel.from_pretrained('bert-base-chinese')
# 获取文本向量
def get_bert_embedding(text):
inputs = tokenizer(text, return_tensors='pt', padding=True, truncation=True)
with torch.no_grad():
outputs = model(**inputs)
return outputs.last_hidden_state[:,0,:] # 取 [CLS] 向量
2. 用 K -Means 进行聚类
确定最佳聚类数很关键,这里用肘部法则:
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 尝试不同 K 值
inertia = []
for k in range(2, 10):
kmeans = KMeans(n_clusters=k, random_state=42).fit(embeddings)
inertia.append(kmeans.inertia_)
# 可视化
plt.plot(range(2,10), inertia)
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')
plt.show()
3. 用 T5 模型生成摘要
from transformers import T5ForConditionalGeneration, T5Tokenizer
# 加载模型
t5_tokenizer = T5Tokenizer.from_pretrained('t5-small')
t5_model = T5ForConditionalGeneration.from_pretrained('t5-small')
# 自定义 prompt
def generate_summary(text):
input_text = "summarize:" + text
inputs = t5_tokenizer(input_text, return_tensors='pt', max_length=512, truncation=True)
outputs = t5_model.generate(inputs['input_ids'])
return t5_tokenizer.decode(outputs[0], skip_special_tokens=True)
避坑指南:那些我踩过的坑
- 短文本处理 :对于很短的投诉文本,直接使用[CLS] 向量效果可能不好。可以尝试取所有 token 向量的平均值。
- 类别不平衡:某些类型的投诉可能特别多。可以在聚类前对少数类别的 embedding 进行过采样。
- 显存不足:
from transformers import TrainingArguments, Trainer training_args = TrainingArguments( per_device_train_batch_size=4, gradient_accumulation_steps=8, # 模拟更大的 batch size # 其他参数... )
性能验证
在我的电商投诉数据集上(约 5 万条数据):
– 聚类轮廓系数:0.62(K= 6 时)
– 摘要生成的 ROUGE- 1 分数:0.48
延伸思考
有兴趣的读者可以尝试:
1. 用 Sentence-BERT 替代原生 BERT,看看聚类效果是否有提升
2. 尝试不同的摘要模型,如 BART 或 PEGASUS
3. 加入一些业务规则后处理,进一步提升可用性
结语
通过这次实践,我深刻体会到预训练模型在文本处理中的强大能力。虽然初期调参有点痛苦,但一旦跑通流程,后续维护成本反而比传统方法低很多。希望这篇笔记能帮助大家少走弯路。
正文完
