bert 新闻标题聚类

本文介绍了如何在无GPU环境下,利用BERT模型对新闻标题进行聚类,通过RandomOverSampler改善数据分布,最终实现91%以上准确度的提升过程。

bert 新闻标题聚类

数据集参考之前的博客lstm 新闻标题聚类

由于自己的电脑没有装pytorch的gpu环境,在colab上进行代码编写

先安装环境

!pip install transformers

然后加载一堆库

import torch
import time
import numpy as np
import pandas as pd
import torch.nn as nn
from transformers import BertModel
from transformers import BertTokenizer
from sklearn.model_selection import train_test_split
from transformers import  get_linear_schedule_with_warmup
from torch.utils.data import TensorDataset, DataLoader, RandomSampler, SequentialSampler
from torch.optim import AdamW

import random
from imblearn.over_sampling import RandomOverSampler

接下来读取数据,设置种子数

pre_path="./drive/MyDrive/"
SEED = 721
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

def seed_init(seed):
  random.seed(seed)
  np.random.seed(seed)
  torch.manual_seed(seed)
  torch.cuda.manual_seed_all(seed)

seed_init(SEED)
data = pd.read_csv(pre_path+'./data/news.csv')

划分测试集验证集,并观察数据的分布

x = data['comment'].to_numpy()
y = data['pos'].to_numpy()

x_train, x_valid, y_train, y_valid = train_test_split(x, y, test_size=0.3, random_state=SEED)

(unique, counts) = np.unique(y_train, return_counts=True)
np.asarray((unique, counts)).T

在这里插入图片描述
根据对比,对数据使用过采用能提高训练的准确度

ros = RandomOverSampler()
x_train, y_train = ros.fit_resample(np.array(x_train).reshape(-1,1),np.array(y_train).reshape(-1,1))
x_train = x_train.flatten()
y_train = y_train
<think>我们计划设计一个对《环球时报》热门新闻进行聚类分析的工程方案。该方案需要包括数据采集、预处理、特征提取、聚类算法选择、结果评估等步骤。以下是详细设计:###数据采集使用网络爬虫从《环球时报》官网或API获取热门新闻数据。采集字段包括标题、正文、发布时间、作者、标签等。建议使用Python的Scrapy框架或Requests库配合BeautifulSoup解析HTML。设置定时任务每日抓取最新热门新闻。###数据预处理清洗文本:去除HTML标签、特殊字符、停用词(使用中文停用词表)。中文分词:采用jieba分词工具进行分词处理。去除低频词:过滤出现次数低于阈值的词汇。文本向量化:使用TF-IDF或词嵌入模型(如Word2Vec、BERT)将文本转化为数值向量。```pythonimportjiebafromsklearn.feature_extraction.textimportTfidfVectorizer#分词函数defchinese_tokenizer(text):returnlist(jieba.cut(text))#示例:TF-IDF向量化vectorizer=TfidfVectorizer(tokenizer=chinese_tokenizer,stop_words=stopwords)tfidf_matrix=vectorizer.fit_transform(cleaned_texts)```###特征提取与降维高维文本向量需降维以提升聚类效率。采用主成分分析(PCA)或t-SNE将维度降至50-100维。$$X_{reduced}=PCA(X,n\_components=50)$$###聚类算法选择根据新闻数据特性选择聚类算法:-**K-Means**:适用于大规模数据,需预先指定聚类数$K$。-**DBSCAN**:自动确定簇数量,适合非球形分布。-**层次聚类**:可生成层次化结构,但计算复杂度高。建议使用K-Means(效率高)或DBSCAN(无需预设$K$值)作为核心算法。###聚类数确定(K-Means适用)使用肘部法则(ElbowMethod)或轮廓系数(SilhouetteScore)确定最佳$K$值。$$SilhouetteScore=\frac{1}{N}\sum_{i=1}^{N}\frac{b(i)-a(i)}{\max\{a(i),b(i)\}}$$其中$a(i)$为样本$i$到同簇其他点的平均距离,$b(i)$为样本$i$到最近其他簇的平均距离。###结果评估使用内部指标(轮廓系数、戴维森堡丁指数)和外部指标(若有标注数据)评估聚类质量。可视化降维后的数据点分布,观察簇分离情况。###工程架构设计模块化流水线:1.**数据层**:MySQL/MongoDB存储原始新闻及聚类结果。2.**计算层**:Spark或Dask处理大规模数据;Scikit-learn实现聚类算法。3.**调度层**:Airflow定时触发爬虫与聚类任务。4.**展示层**:Web界面(Flask/Django)展示新闻聚类结果及主题关键词。###性能优化-增量聚类:仅处理每日新增新闻,减少计算量。-分布式计算:使用SparkMLlib处理海量历史数据。§§相关问题§§:1.如何评估新闻聚类结果的有效性?2.中文新闻聚类有哪些特殊的预处理步骤?3.DBSCAN算法在新闻文本聚类中的参数如何调优?</think>### 工程设计流程 **数据采集模块** 通过《环球时报》官方API或网络爬虫获取热门新闻数据,采集字段包括: - 标题、正文、发布时间、作者、标签、阅读量、评论数 - 使用Python的`requests`库或`Scrapy`框架实现定时抓取 - 数据存储采用MongoDB文档结构,保留原始HTML和清洗后文本 **文本预处理流程** 1. 清洗:去除HTML标签、特殊符号、非中文字符 2. 分词:使用`jieba`分词工具进行中文切分 ```python import jieba text = "环球时报报道国际热点事件" word_list = jieba.lcut(text) # 输出: ['环球时报','报道','国际','热点','事件'] ``` 3. 去停用词:加载中文停用词表过滤无关词汇 4. 向量化:采用TF-IDF或BERT嵌入生成文本向量 $$ \text{TF-IDF}(t,d) = \text{tf}(t,d) \times \log\frac{N}{\text{df}(t)} $$ **聚类分析层** - **算法选择**: - K-Means:需预设聚类数$K$,使用肘部法则确定最优$K$ - DBSCAN:自动识别簇数量,适合非球形分布 - LDA主题建模:提取隐含语义主题 - **降维处理**:通过PCA或t-SNE将高维向量压缩至2-3维 $$ \mathbf{X}_{\text{reduced}} = \mathbf{X} \mathbf{W} $$ 其中$\mathbf{W}$是PCA变换矩阵 **可视化与评估** 1. 使用`matplotlib`绘制聚类散点图 2. 计算轮廓系数评估聚类质量: $$ s(i) = \frac{b(i) - a(i)}{\max\{a(i),b(i)\}} $$ 3. 提取每簇关键词:通过TF-IDF权重排序生成主题标签 **系统部署方案** - 架构:微服务设计(Flask API + React前端) - 调度:Airflow定时执行每日聚类任务 - 存储:聚类结果存入Elasticsearch支持实时检索 - 监控:Prometheus跟踪算法性能指标 ### 关键技术选型 | 模块 | 推荐工具 | |-------|----------| | 数据采集 | Scrapy, Newspaper3k | | 文本处理 | jieba, HanLP | | 向量化 | scikit-learn TF-IDF, HuggingFace BERT | | 聚类算法 | scikit-learn K-Means/DBSCAN, Gensim LDA | | 可视化 | Pyecharts, Plotly |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值