bert 新闻标题聚类

尝试用bert做文本聚类 尝试用bert做文本聚类 以前文本聚类多以TF-IDF构建词权重的方法进行,在本文中尝试用bert提取的向量做文本聚类。对于bert模型,尝试提取不同层的特征,尝试对bert做fun-tune,观察相应特征对应的文本聚类的效果 数据 数据使用的是百度2020语言比赛的数据,该数据是标注并分类好的,所以在聚类的情况下,省去了聚类时对k值的搜索,同时可以可以根据标注好的数据和聚类得到的数据比较,从侧面评价聚类的效... 阅读详情

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.flatten()
(unique, counts) = np.unique(y_train, return_counts=True)
np.asarray((unique, counts)).T

选择bert模型,加载数据集

model_choice = 'hfl/chinese-bert-wwm'
tokenizer = BertTokenizer.from_pretrained(model_choice)
# 进行token,预处理
def preprocessing_for_bert(text):
    input_ids = []
    attention_masks = []

    for sent in text:
        encoded_sent = tokenizer.encode_plus(
            text=sent,  # 预处理语句
            add_special_tokens=True,  # 加 [CLS] 和 [SEP]
            max_length=MAX_LEN,  # 截断或者填充的最大长度
            padding='max_length',  # 填充为最大长度,这里的padding在之间可以直接用pad_to_max但是版本更新之后弃用了,老版本什么都没有,可以尝试用extend方法
            return_attention_mask=True,  # 返回 attention mask
            truncation=True
        )

        # 把输出加到列表里面
        input_ids.append(encoded_sent.get('input_ids'))
        attention_masks.append(encoded_sent.get('attention_mask'))

    # 把list转换为tensor
    input_ids = torch.tensor(input_ids)
    attention_masks = torch.tensor(attention_masks)

    return input_ids, attention_masks
device = 'cuda' if torch.cuda.is_available() else 'cpu'
print(device)
MAX_LEN = 35
batch_size = 32

# 在train,valid上运行 preprocessing_for_bert 转化为指定输入格式
train_inputs,train_masks = preprocessing_for_bert(x_train)
valid_inputs,valid_masks = preprocessing_for_bert(x_valid)
train_labels = torch.tensor(y_train)
valid_labels = torch.tensor(y_valid)

# 创建DataLoader
train_data = TensorDataset(train_inputs, train_masks, train_labels)
train_dataloader = DataLoader(train_data, sampler=RandomSampler(train_data), batch_size=batch_size)
valid_data = TensorDataset(valid_inputs, valid_masks, valid_labels)
valid_dataloader = DataLoader(valid_data, sampler=SequentialSampler(valid_data), batch_size=batch_size)

构建模型,为了进一步提高准确度,bert后链接bi-lstm做后续处理

class BertClassifier(nn.Module):
    def __init__(self, out_dim, res,freeze_bert=False):
        super(BertClassifier, self).__init__()

        self.bert = BertModel.from_pretrained(model_choice, return_dict=False)
        if freeze_bert:
            for param in self.bert.parameters():
                param.requires_grad = False
        self.drop = nn.Dropout(0.5)
        self.lstm = nn.LSTM(768, out_dim, batch_first=True, dropout=0.5, bidirectional=True, num_layers=2)
        self.linear = nn.Sequential(
            nn.Linear(2 * out_dim, 64),
            nn.Dropout(0.3),
            nn.ReLU(),
            nn.Linear(64, res)
        )

    def forward(self, input_ids, attention_mask):
        # 开始搭建整个网络了
        # 输入
        enbedding, pooled_output = self.bert(input_ids=input_ids,
                                             attention_mask=attention_mask)

        # outputs = self.drop(pooled_output)

        out, (h, c) = self.lstm(enbedding)
        out = torch.cat((h[-2, :, :], h[-1, :, :]), dim=1)
        out = self.linear(out)

        return out
def initialize_model(epochs):
    """
    初始化我们的bert,优化器还有学习率,epochs就是训练次数
    """
    # 初始化我们的Bert分类器
    bert_classifier = BertClassifier(128,5)
    # 用GPU运算
    bert_classifier.to(device)
    # 创建优化器
    optimizer = AdamW(bert_classifier.parameters(),
                      lr=5e-5,
                      eps=1e-8
                      )
    total_steps = len(train_dataloader) * epochs
    warm_ratio=0.1
    scheduler = get_linear_schedule_with_warmup(optimizer,num_warmup_steps=warm_ratio*total_steps,num_training_steps=total_steps)

    return bert_classifier, optimizer ,scheduler

criterion = nn.CrossEntropyLoss()  # 交叉熵

def train(model, train_dataloader, valid_dataloader, epochs, path):
    best_loss = 1000
    best_acc = 0
    for epoch_i in range(epochs):
        print("epoch %d" % (epoch_i + 1))

        time_begin = time.time()
        train_loss = []

        model.train()

        for step, batch in enumerate(train_dataloader):
            b_input_ids, b_attn_mask, b_labels = tuple(t.to(device) for t in batch)

            model.zero_grad()

            logits = model(b_input_ids, b_attn_mask)
            loss = criterion(logits, b_labels)
            train_loss.append(loss.item())
            loss.backward()
            torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)

            optimizer.step()
            scheduler.step()

        time_elapsed = time.time() - time_begin
        avg_train_loss = sum(train_loss) / len(train_loss)
        print("训练集 Loss: %.2f 时间: %.2f" % (avg_train_loss, time_elapsed))
        
        # ---------------------------------------验证------------------------------
        model.eval()
        valid_accuracy = []
        valid_loss = []
      
        # 用于早停机制(这里由于epochs过少,不使用)
        # cnt, stop = 0, 10

        time_begin = time.time()

        for batch in valid_dataloader:
            b_input_ids, b_attn_mask, b_labels = tuple(t.to(device) for t in batch)

            with torch.no_grad():
                logits = model(b_input_ids, b_attn_mask)

            loss = criterion(logits, b_labels.long())
            valid_loss.append(loss.item())

            preds = torch.argmax(logits, dim=1).flatten()

            accuracy = (preds == b_labels).cpu().numpy().mean() * 100

            valid_accuracy.append(accuracy)

        time_elapsed = time.time() - time_begin
        valid_loss = sum(valid_loss) / len(valid_loss)
        valid_accuracy = sum(valid_accuracy) / len(valid_accuracy)
        print("验证集 Loss: %.2f 验证集 Acc: %.2f 时间: %.2f" % (valid_loss, valid_accuracy, time_elapsed))
        # 采用准确率作为评价指标
        if best_acc < valid_accuracy:
            best_loss = valid_loss
            best_acc= valid_accuracy
            torch.save(model.state_dict(), path)  # save entire net
            
            print('保存最好效果模型')
        
        print("\n")
    print("验证集最高准确率为%.2f" % best_acc)

最后训练

t_epoch = 10
net, optimizer ,scheduler = initialize_model(t_epoch)
save_path = 'model/try_bert_params.pkl'
print("Start training and validating:")
train(net, train_dataloader, valid_dataloader, t_epoch, pre_path+save_path)

训练结果如下
在这里插入图片描述
相比之前文章的准确度91%,提高确实很明显

创新实训(10)-提取式文本摘要之bert聚类 创新实训(10)-提取式文本摘要之bert聚类 1. 思路 使用bert作为预训练模型,利用bert生成的词向量进行下游任务的处理,在这篇论文中使用的是k-means计算词向量分布的重心作为文本摘要的候选句子。可以看作是聚类的一种形式。 2.代码分析 基于Pytorch的Transformers框架,使用预训练的Bert模型或者是其他的预训练模型生成词向量,然后使用k-means或者expectation-maximization算法进行聚类。 2.1 简单使用 首先先来测试一下readme里给的例子: f 阅读详情

相关推荐

Bert文本聚类实践

文本聚类探索与实践,文本分类用于聚类能行么?

NLP与推荐算法 1768

Bert模型对文本聚类任务的应用与提升

BERT预训练模型和KMeans结合可以有效提高文本数据的聚类分析能力,提供更具实际意义和语义相关性的聚类结果。

m0_62350221的博客 3237

S7-1200与KINCO伺服通信实战:CM CANopen模块配置避坑指南(附完整PDO映射表)

本文详细解析了西门子S7-1200 PLC通过CM CANopen模块与KINCO伺服驱动器的通信配置全流程,重点解决PDO映射混乱、心跳报文配置错误等常见问题。提供硬件组态、参数设置、PDO映射模板及故障排查方案,助力工业自动化系统实现稳定高效的多轴运动控制。

2y3u4i5o6p的博客 1101

Bert实现意图分类

bert模型实现意图分类

weixin_62791428的博客 3101

一图文带您认识磁编码器

磁编码器是以磁电原理技术生产的编码器。 磁编码器工作原理: 当电流通过一个位于磁场中的导体的时候,磁场会对导体中的电子产生一个垂直于电子运动方向上的的作用力,从而在垂直于导体与磁感线的方向上产生电势差。 如果让施加在这个导体上的磁场以电流流经路径为轴线,按照上图箭头所示的方向旋转,那么这个霍尔电势差就会因为磁场与导体之间角度的改变而发生变化,而这个电势差的变化趋势,与之前一文中次级线圈旋转时的输出电压一样,是一条正弦曲线。因此,基于这个通电导体两侧的电压,就可以反推计算出磁场旋转的角度了。 .

encoder_yang的博客 2万+

arcgis密度分析

密度分析 密度分析是指根据输入的要素数据集计算整个区域的数据集状况,从而产生一个连续的密度表面。通过计算密度,将每个采样点的值散布到整个研究区域,并获得输出栅格中每个像元的密度值。在 ArcGIS 中,分布密度的计算方法有点密度分析、线密度分析和核密度分析三种。 1.点密度分析 导入实验数据居民点图层和道路图层 在自定义里勾选空间分析模块Spatial Analyst 点击空间分析工具中密度分析内的点密度分析, 参数设置如下,其中输出像元大小表示输出栅格数据集的像元大小。值越小.

Jasenjane的博客 2万+

Milvus+HDBSCAN实战:如何用向量数据库加速百万级新闻标题聚类(附完整代码)

本文详细介绍了如何结合Milvus向量数据库与HDBSCAN密度聚类算法,实现对百万级新闻标题的高效语义聚类。通过将文本转化为高维嵌入向量并存入Milvus构建高效索引,替代传统的暴力计算,大幅降低了聚类的时间复杂度。文章提供了从环境搭建、向量生成、数据入库到协同聚类的完整代码实战,帮助开发者快速处理海量文本数据,挖掘深层主题脉络。

w1x2y3的博客 185

C#读取CAD文件(dwg/dxf)并处理

项目要求识别CAD图纸(图纸内容与现实事物比例是1:1)中的内容,并提取出一些关键信息。这里的CAD图纸是指CAD文件,包含多种格式,dwg/dxf/dwf/stl/pdf等等。识别其中内容,主要指文件中的图元信息(也叫实体Entity),指线段、圆弧、矩形等图形元素。得到图元基础信息(比如长度、坐标、粗细)后,进一步做处理(如得到交点、得到线段间间隔、圆弧与线段切点等)。听起来有点难,因为作为软件工程师,对CAD相关事物并不了解,它是未知的;

三千幻想乡 1万+

计算机毕业设计Django+大模型淘新闻标题关键词提取与趋势分析(源码+LW+PPT+讲解)

摘要:本文介绍了一个基于Django框架和大语言模型(如BERT、GPT)的新闻标题关键词提取与趋势分析系统。系统通过爬取新闻数据,利用预训练模型进行关键词提取和话题聚类,实现热点识别与趋势可视化。项目包含数据收集、模型微调、系统开发等模块,最终形成完整的Web应用。文章还提供了项目计划、资源需求和风险评估,适合作为毕设选题或技术开发参考。文末附有联系方式获取源码和技术支持。

全网计算机/大数据辅导(自媒体)道祖第一人、全网粉丝100W+,专注于大学生项目实战开发,讲解,毕业答疑辅导,高校老师/讲师/同行合作。以及产品测评宣传、工具推广等合作。同时招收学生代理、校园代理。 612

YOLO11改进 | 卷积模块 | 轻量化GSConv替换普通的conv

yolo11,GSConv,卷积模块

kay_545 3958

关于在线excel插件Univer笔记教程

univer在线excel插件确实是够强大,但也存在不少bug,用户用起来是真的很爽,和本地的wps差不多,但真正的开发起来是真的费劲。由于文档提供的信息不足,我们很多功能只能去看他们插件里的源代码,然后一点点测试,一点点尝试研究。此文章可省去五天的研究成本

guiplan 5827

StructBERT批量特征提取教程:新闻标题向量化处理全流程

本文介绍了如何在星图GPU平台上自动化部署📚 StructBERT 中文语义智能匹配系统镜像,高效完成新闻标题批量向量化。该镜像基于Siamese孪生网络结构,专为中文句对语义匹配优化,可直接应用于新闻去重、聚类与相似检索等典型NLP任务,显著提升语义理解准确性。

weixin_42405592的博客 151

Cadence OrCAD Capture CIS元器件管理时ERROR(ORCIS-6454): Temporary part number tracking is turned on报错的解决方法

使用Part manager对工程的元器件进行批量管理时,出现如下图所示的ERROR(ORCIS-6454): Temporary part number tracking is turned on报错其解决方法如下。

fydar的博客 3505

GTE-Chinese-Large效果展示:新闻标题-正文语义匹配F1值提升37%实测

本文介绍了如何在星图GPU平台上自动化部署nlp_gte_sentence-embedding_chinese-large镜像,高效实现中文新闻标题与正文的语义匹配。该模型在真实新闻数据集上F1值提升37%,典型应用于智能推荐、RAG知识检索及客服工单聚类等场景,显著提升中文语义理解准确率。

weixin_35094083的博客 239

双目深度相机--10.双目视觉的主要步骤讲解分析

双目视觉技术通过模拟人眼原理,利用两个相机从不同视角采集图像,实现三维坐标计算。其核心流程包括:1)系统标定,消除相机畸变并建立坐标映射关系;2)图像同步采集与预处理;3)立体匹配,寻找左右图像对应点;4)基于视差图的深度计算;5)三维重建生成点云或网格模型;6)结果应用如目标测距、三维建模等。关键技术难点在于精确标定和准确匹配,这两步直接影响最终深度计算的精度。该技术广泛应用于自动驾驶、工业检测、VR等领域,实现了从二维图像到三维空间的精准转换。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 625

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

gte-base-zh入门实战:5分钟完成中文新闻标题向量化与聚类

本文介绍了如何在星图GPU平台上自动化部署gte-base-zh镜像,实现中文文本的语义向量化。该镜像能够将新闻标题等中文内容转换为高维向量,应用于文本聚类、相似度搜索和智能推荐等场景,提升自然语言处理任务的效率与准确性。

weixin_42504649的博客 321

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

StructBERT文本相似度模型惊艳效果:新闻标题聚类准确率提升41%

本文介绍了如何在星图GPU平台自动化部署StructBERT文本相似度-中文-通用-large镜像,实现高效的中文文本语义匹配。该模型特别适用于新闻标题聚类场景,能精准识别语义相似内容,相比传统方法准确率提升41%,大幅提升内容推荐和搜索体验。

weixin_34471637的博客 32

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

StructBERT中文匹配系统实战案例:新闻标题聚类去重全流程

本文介绍了如何在星图GPU平台上自动化部署StructBERT中文语义智能匹配系统镜像,高效实现新闻标题的语义级聚类与去重。该镜像基于孪生网络结构,可精准识别表述不同但语义相同的新闻事件,广泛应用于舆情分析、热点发现和内容质量评估等场景。

weixin_33363025的博客 599

StructBERT中文匹配系统精彩案例:新闻标题语义聚类准确率超96%

本文介绍了如何在星图GPU平台上自动化部署StructBERT中文语义智能匹配系统,并展示了其在新闻标题语义聚类中的典型应用。该系统通过孪生网络设计,有效解决了传统方法的语义歧义问题,能够将海量新闻标题按主题进行高精度、实时自动归类,准确率超过96%。

weixin_31597759的博客 239

StructBERT中文句对匹配实战案例:新闻标题聚类与重复报道识别系统搭建

本文介绍了如何在星图GPU平台自动化部署nlp_structbert_sentence-similarity_chinese-large镜像,构建新闻标题聚类与重复报道识别系统。该系统能精准计算中文句子语义相似度,有效识别和聚合同一事件的不同报道,提升新闻内容去重效率与质量。

weixin_42596246的博客 998

StructBERT中文语义匹配系统实际作品:新闻标题聚类向量分布图集

本文介绍了如何在星图GPU平台自动化部署StructBERT中文语义智能匹配系统镜像,实现精准的中文文本语义匹配与向量化。该系统特别适用于新闻标题聚类分析,能够将文本转换为语义向量并通过可视化展示不同主题新闻的分布规律,为内容推荐、趋势分析等场景提供核心技术支持。

weixin_42509507的博客 148

基于密度聚类的新闻热点发现实现步骤

由于网络新闻的复杂性、冗余性、更新和传播的快速性等,都给人们快速、准确地获取自己所需的关键信息带来了困难,也不利于网络舆情的监控,因此网络新闻热点发现已成舆情监控的重点。 基于自适应参数调整的密度聚类算法的新闻热点发现实现步骤如下: 从es获取目标数据(新闻标题、摘要等信息):根据过滤条件获取目标数据; 利用bert将新闻标题和新闻摘要生成新闻特征向量: 利用bert-servin...

AI人工智能的学习之路 3506

Milvus + HDBSCAN 实战:如何用向量数据库加速百万级新闻标题聚类(附完整代码)

本文详细介绍了如何利用Milvus向量数据库与HDBSCAN密度聚类算法构建百万级新闻标题的高效语义聚类解决方案。通过文本向量化、Milvus数据建模优化和HDBSCAN参数调优等关键技术步骤,实现从海量新闻数据中自动发现潜在主题模式,为数据分析提供强大支持。

aa123的博客 695

GTE-Chinese-Large实操手册:中文新闻标题聚类与自动分类实战

本文介绍了如何在星图GPU平台上自动化部署nlp_gte_sentence-embedding_chinese-large镜像,高效实现中文新闻标题的语义向量化、聚类与零样本自动分类。该镜像专为中文新闻分析优化,适用于媒体选题策划、金融舆情监控等典型场景,显著提升文本理解与信息组织效率。

weixin_32999557的博客 99

gte-base-zh中文语义向量实战:新闻标题聚类与相似文章推荐效果展示

本文介绍了如何在星图GPU平台自动化部署gte-base-zh镜像,实现中文文本的语义向量生成。该镜像可应用于新闻标题聚类和相似文章推荐,帮助内容平台智能组织信息并提升推荐精准度,适用于媒体、电商等多种文本处理场景。

weixin_33557333的博客 427

nlp_gte_sentence-embedding_chinese-large效果展示:新闻标题聚类准确率达91%案例

本文介绍了如何在星图GPU平台上自动化部署nlp_gte_sentence-embedding_chinese-large镜像,高效实现中文新闻标题语义聚类。该镜像专为中文短文本优化,在真实200条新闻标题上达成91%聚类准确率,典型应用于新闻主题归类、政策文件检索与客服问答匹配等场景。

weixin_28840811的博客 268
上一篇: nlp数据增强-back translation
下一篇: leetcode 第 303 场周赛
cnzx005
博客等级 码龄8年 4粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值