【大模型实战篇】一种关于大模型高质量数据的处理方法-无标注数据类别快速识别及重复数据检测(加权向量-卷积神经网络-聚类算法结合)

news2024/11/15 13:22:04

1. 背景介绍  

        大模型的能力很大程度上依赖于高质量的数据,在之前的一篇文章《高质量数据过滤及一种BoostedBaggingFilter处理方法的介绍》中,我们介绍了大模型的数据处理链路,本文继续关注在高质量数据的模块。

        本文所要介绍的处理方法,其实是很多年之前在构建对话机器人系统中涉及的,当时的场景是需要对不同地区的用户大量问题进行自动化区分,识别出热门问题,并给出类别划分,进而给出不同类别问题的热门问答示例,展现在用户的对话框窗口,对于不同地区的问题都需要做类似处理。做过对话系统的同学应该有一种感受,那就是当用户问答数据够多时,其实问答系统的主要任务就变成了对于历史问题的匹配和检索,因此用户问题往往是相似的。

        之所以该方法同样可以适用大模型数据处理领域,是因为大模型的训练数据往往是从大量的网站或者其他数据源获取的,原始数据可能并没有完整的类别区分,并且可能涉及到重复数据,而人工标注又非常的耗时且昂贵。因此完全可以采用类似的针对热门问题自动识别的方式,对原始数据进行快速自动划分类别,识别重复数据等。

2. 具体算法介绍

        针对热门问题自动识别的方法,我们主要采用cnn+kmeans方式,结合了卷积神经网络(CNN)特征提取和 K均值聚类(K-Means)算法,用于文本数据的聚类识别,这种处理方式速度快、资源要求低,适合在大规模数据上进行处理。这个处理流程整合了词嵌入、卷积神经网络以及聚类算法,能够对文本数据进行有效的特征提取和聚类分析。其中对于加权平均词嵌入向量的处理可以注意下,这一步对于文本语意的表达比较重要。

算法流程及原理

  1. 数据预处理

    • 文本清洗和分词:去除噪声并分词。
    • 分词序列化:使用 Tokenizer 对文本进行编码,将文本转换为词索引的序列。
    • 词嵌入:加载预训练的词向量,并构建词嵌入矩阵,其中每个词都有对应的向量表示。
    • 序列填充:对词索引序列进行填充或截断,使得所有样本具有相同的长度。
  2. 构建词嵌入矩阵

    • 加载预训练的词向量模型。
    • 初始化嵌入矩阵,使用预训练的词向量填充矩阵。
    • 统计未命中词向量的词。
  3. 构建平均词嵌入向量

    • 使用 TF-IDF 对词频进行加权。
    • 归一化 TF-IDF 值,并计算加权平均词嵌入向量。
    • 将平均词嵌入向量二值化,即对每个样本的向量进行处理,保留那些超过中位数的特征。
  4. 构建模型

    • 输入层接受序列化的文本数据。
    • 嵌入层使用预训练的词向量。
    • 卷积层对嵌入后的序列进行卷积操作。
    • 全局最大池化层提取卷积特征。
    • 输出层使用 Sigmoid 激活函数,输出维度等于二值化后的向量维度。
  5. 训练模型

    • 使用二值化的向量作为监督信号训练模型。
    • 保存最佳权重,并从倒数第二层推断出中间表示。
    • 对中间表示进行 L2 归一化,并使用 K-Means 聚类算法进行聚类。

主要步骤

  • 初始化:加载预训练词向量,初始化 tokenizer。
  • 文本预处理:分词、构建词嵌入矩阵、计算平均词嵌入向量并二值化。
  • 构建模型:定义 CNN 模型结构,编译模型。
  • 训练模型:拟合模型,保存最佳权重。
  • 推断:使用训练好的模型从倒数第二层获取中间表示。
  • 聚类:对中间表示进行聚类,并将结果输出。

示例代码:

from utils.data_preprocess import DataTools
import numpy as np
from gensim.models.keyedvectors import KeyedVectors
from keras.callbacks import ModelCheckpoint
from keras.optimizers import Adam
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.layers import Input, Embedding
from keras.layers import Dense, Conv1D, Dropout
from keras.layers import GlobalMaxPooling1D
from keras.models import Model
from sklearn.cluster import KMeans
from sklearn.preprocessing import normalize

class CNNKMeans(object):
    def __init__(self):
        self.data_tools = DataTools()
        self.EMBEDDING_FILE = 'data/ss_vector300.bin' #加载预训练的词向量数据
        self.tokenizer = Tokenizer()
        self.EMBEDDING_DIM = 300

    def cluster_texts(self, texts, clusters=50, n_iters=10):
        self.text_preprocess(texts)
        model = self.get_model()
        H = self.train_model_and_infer(model, n_iters)
        #使用倒数第二层的输出作为infer的向量进行聚类
        km = KMeans(n_clusters=clusters, n_jobs=2)
        V = normalize(H, norm='l2')
        km.fit(V)
        pred_y = km.labels_
        return pred_y

    # 文本预处理&构建格式化输入输出数据
    def text_preprocess(self, texts):

        '''
        (1)分词并向量化
        '''

        texts = [" ".join(self.data_tools.process_text(text)) for text in texts]
        self.tokenizer.fit_on_texts(texts)
        #texts_to_sequences可获得 [词的index列表]
        sequences_full = self.tokenizer.texts_to_sequences(texts)
        word_index = self.tokenizer.word_index
        print('Found %s unique tokens.' % len(word_index))
        MAX_NB_WORDS = len(word_index)
        seq_lens = [len(s) for s in sequences_full]
        print("Average length: %d" % np.mean(seq_lens))
        print("Max length: %d" % max(seq_lens))
        self.MAX_SEQUENCE_LENGTH = max(seq_lens)
        self.X = pad_sequences(sequences_full, maxlen=self.MAX_SEQUENCE_LENGTH)

        '''
        (2)构建词嵌入矩阵
        '''
        word2vec = KeyedVectors.load_word2vec_format(self.EMBEDDING_FILE, binary=True)
        self.nb_words = min(MAX_NB_WORDS, len(word_index)) + 1
        self.embedding_matrix = np.zeros((self.nb_words, self.EMBEDDING_DIM))
        for word, i in word_index.items():
            if word in word2vec.vocab:
                self.embedding_matrix[i] = word2vec.word_vec(word)
            else:
                print(word)
        print('Null word embeddings: %d' % np.sum(np.sum(self.embedding_matrix, axis=1) == 0))

        '''
        (3)通过 Average embeddings (AE)构建目标映射向量, binary Y
        '''

        Y = {}
        #sequences_to_matrix 获得每一句话在全量词列表中对应出现词的tf-idf向量,如[[0,0,0, 0.3, 0, 1, 0, 0.5],[...]]
        tfidf = self.tokenizer.sequences_to_matrix(sequences_full, mode='tfidf')
        denom = 1 + np.sum(tfidf, axis=1)[:, None] #按行求和
        #对每一行进行归一化
        normed_tfidf = tfidf / denom
        #假如normed_tfidf.shape 为N X 1000, embedding_matrix shape  为 1000 X 300, 那么average_embeddings 的shape为 N X 300, 这一步可以理解为使用tf-idf的词重要性对每一句中的词向量做了加权求和,得到每一句文本的新的表征向量,之所以这么做,是考虑结合全局词重要性信息+局部的词语义信息。
        average_embeddings = np.dot(normed_tfidf, self.embedding_matrix)
        Y["ae"] = average_embeddings
        print("Shape of average embedding: ", Y['ae'].shape)
        reduction_name = "ae"
        self.B = self.binarize(Y[reduction_name])
        self.TARGET_DIM = self.B.shape[1]

    # 构建模型计算图
    def get_model(self):
        embedding_matrix_copy = self.embedding_matrix.copy()
        trainable_embedding = False
        # Embedding layer
        pretrained_embedding_layer = Embedding(
            input_dim=self.nb_words,
            output_dim=self.EMBEDDING_DIM,
            weights=[self.embedding_matrix],
            input_length=self.MAX_SEQUENCE_LENGTH,
        )

        # Input
        sequence_input = Input(shape=(self.MAX_SEQUENCE_LENGTH,), dtype='int32')
        embedded_sequences = pretrained_embedding_layer(sequence_input)

        # 1st Layer
        x = Conv1D(100, 5, activation='tanh', padding='same')(embedded_sequences)
        x = GlobalMaxPooling1D()(x)

        # Output
        x = Dropout(0.5)(x)
        predictions = Dense(self.TARGET_DIM, activation='sigmoid')(x)
        model = Model(sequence_input, predictions)

        model.layers[1].trainable = trainable_embedding

        adam = Adam(lr=1e-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
        # Loss and Optimizer
        model.compile(loss='binary_crossentropy',
                      optimizer=adam,
                      metrics=['mae'])
        # Fine-tune embeddings or not
        model.summary()
        return model

    # 原始数据表征学习
    def train_model_and_infer(self, model, nb_epoch):
        checkpoint = ModelCheckpoint('models/weights.{epoch:03d}-{val_acc:.4f}.hdf5', monitor='val_acc', verbose=1,
                                     save_best_only=True, mode='auto')
        model.fit(self.X, self.B, validation_split=0.2,
                  epochs=nb_epoch, batch_size=100, verbose=1, shuffle=True)
        input = model.layers[0].input
        output = model.layers[-2].output
        model_penultimate = Model(input, output)
        # inference of penultimate layer
        H = model_penultimate.predict(self.X)
        print("Sample shape: {}".format(H.shape))
        return H

    # 二值化向量
    #只保留向量中超过中位数的特征值,置为1,其他置为0。也就是仅保留最重要的信息。
    def binarize(self, target):
        median = np.median(target, axis=1)[:, None]
        binary = np.zeros(shape=np.shape(target))
        binary[target > median] = 1
        return binary

if __name__ == "__main__":
    query_path = "data/query.txt"
    citywise=True
    K = 20
    nb_epoch = 50
    city = "北京"
    dir = "/cluster_result/"+city+"/cnnkmeans/"
    CKM = CNNKMeans()
    city_query_tokens = CKM.data_tools.data_taxonomy(query_path)
    if city in city_query_tokens:
        texts = city_query_tokens[city]
        clusters = CKM.cluster_texts(texts, K, nb_epoch)
        CKM.data_tools.cluster2csv(dir, clusters, texts, K, "CKM")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2163433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言课程设计题目(24个选题)

C语言课程设计题目 题目一:职工信息管理系统设计题目二:图书信息管理系统设计题目三:图书管理系统设计题目四:实验设备管理系统设计题目五:西文下拉菜单的设计题目六:学生信息管理系统设计题目七&#xff1…

R包:gplots经典热图

加载R包 # install.packages("gplots")library("gplots")数据 mat <- matrix(rnorm(1200), ncol6)画图1 heatmap.2(xmat)画图2 heatmap.2(xmat, ColvFALSE, dendrogram"row",scale"row",col"bluered",trace"non…

用Python提取PDF表格到Excel文件

在对PDF中的表格进行再利用时&#xff0c;除了直接将PDF文档转换为Excel文件&#xff0c;我们还可以提取PDF文档中的表格数据并写入Excel工作表。这样做可以避免一些不必要的文本和格式带来的干扰&#xff0c;获得更易于分析和处理的表格数据&#xff0c;并方便进行更多的格式设…

uniapp监听滚动实现顶部透明度变化

效果如图&#xff1a; 实现思路&#xff1a; 1、使用onPageScroll监听页面滚动&#xff0c;改变导航条的透明度&#xff1b; 2、关于顶部图片的高度&#xff1a; 如果是小程序&#xff1a;使用getMenuButtonBoundingClientRect获取胶囊顶部距离和胶囊高度&#xff1b; 如果…

List几种遍历方法速度

准备数据 ArrayList<Integer> list new ArrayList<Integer>();for (int i 0; i < 100000000; i) {list.add(i); }1.for循环 for (int i 0; i < list.size(); i) {Integer str list.get(i); }2.for-each循环 for (Integer vo:list) {}3.Lambda list.forEa…

XXl-SSO分布式单点登录框架

概述 下载地址&#xff1a;https://gitee.com/xuxueli0323/xxl-sso 文档地址&#xff1a;https://www.xuxueli.com/xxl-sso/ 概述 XXL-SSO 是一个分布式单点登录框架。只需要登录一次就可以访问所有相互信任的应用系统。 拥有"轻量级、分布式、跨域、CookieToken均支持…

工业数据采集系统

一、网页部分代码 效果图&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0&qu…

中国蚁剑(antSword)安装使用

antSword下载 antSword-Loader下载 作者&#xff1a;程序那点事儿 日期&#xff1a;2024/09/12 19:35 中国蚁剑&#xff08;AntSword&#xff09;是一款跨平台的开源网站管理工具&#xff0c;旨在满足渗透测试人员的需求。它是一个功能强大的工具&#xff0c;可以帮助用户管理…

这样做PPT也太酷了吧,27.9kstar,适合开发者的ppt工具推荐

1 slidev简介 slidev 是一个基于 Vue 开发的网页演示文稿工具,主要功能是将 Markdown 文档转换为演示幻灯片。 为开发者打造的演示文稿工具 Slidev最大的优势在于整个演示文稿内容的编写采用简单的Markdown格式,这极大降低了创作门槛。我们可以使用VS Code等编辑器高效编写Mar…

Linux centerOS 服务器搭建NTP服务

1&#xff0c;安装 NTP软件 sudo yum -y install ntp2&#xff0c;编辑配置文件 sudo vim /etc/ntp.conf 3&#xff0c;修改配置 在ntp.conf文件中&#xff0c;可以配置服务器从哪些上游时间源同步时间。如果你想让你的服务器对外同步时间&#xff0c;可以去掉restrict d…

js中Fucntion的意义

在js中&#xff0c;我们常常如下方式写函数&#xff1a; function fn(){console.log("这是一个函数."); }; fn(); 在js中&#xff0c;函数本质就是一个对象。 那么&#xff0c;结合我的上一篇文章&#xff1a;通俗讲解javascript的实例对象、原型对象和构造函数以及…

C盘空间不足--WizTree(管理空间)

WizTree&#xff1a;高效的磁盘空间分析工具 在日常使用电脑的过程中&#xff0c;磁盘空间的管理常常成为一个棘手的问题。随着文件的不断增加&#xff0c;我们的硬盘空间逐渐被占满&#xff0c;而这些文件中有很多其实并不重要。为了帮助用户更好地管理磁盘空间&#xff0c;Wi…

CNS-WRFID-01地标卡读写器|写卡器DEMO软件读、写操作说明

CNS-WRFID-01地标卡读写器|写卡器是一款高频读写设备&#xff0c;支持ISO15693协议芯片卡&#xff0c;地标标签读写&#xff0c;支持兴颂系列抗金属|非抗金属RFID标签&#xff0c;如&#xff1a;CNS-CRFID-01、CNS-CRFID-02、CNS-CRFID-03、CNS-CRFID-04、CNS-CRFID-05、CNS-CR…

Vue3 中集成海康 H5 监控视频播放功能

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vuet篇专栏内容:Vue-集成海康 H5 监控视频播放功能 目录 一、引言 二、环境搭建 三、代码解析 子组件部分 1.…

Spring项目报错:Public Key Retrieval is not allowed

报错原因&#xff1a; 如图 在你项目的数据库下可以找到该文件 解决方案&#xff1a; 在service-oa模块的application-dev.yml文件中 在红框中改成下面代码&#xff0c;数据库与具体项目保持一致&#xff0c;不一定是我这个&#xff0c;改allowPublicKeyRetrievaltrue String…

支持K歌音箱方案应用的高性能 32 位蓝牙音频应用处理器-BP1048B2

DSP是一类嵌入式通用可编程微处理器&#xff0c;主要用于实现对信号的采集、识别、变换、增强、控制等算法处理&#xff0c;是各类嵌入式系统的“大脑”应用十分广泛。BP1048B2是一款高性能DSP音频数字信号处理器芯片&#xff0c;能实现多种音频功能如混响、均衡、滤波、反馈抑…

Python邮件发送附件:怎么配置SMTP服务器?

Python邮件发送附件如何实现&#xff1f;Python发送带附件邮件&#xff1f; 在自动化和脚本编写中&#xff0c;使用Python发送带有附件的邮件是一个非常实用的功能。AokSend将详细介绍如何配置SMTP服务器&#xff0c;以便在Python中实现邮件发送附件的功能。 Python邮件发送附…

Postman/Jmeter接口测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是接口测试 通常做的接口测试指的是系统对外的接口&#xff0c;比如你需要从别的系统来获取到或者同步资源与信息&#xff0c;他们会提供给你一个写好…

独立站烧钱背后:Facebook 广告转化率策略的神秘“致胜法则”

Facebook广告作为大部分零售独立站的主要“烧钱”渠道&#xff0c;投放策略的决策往往比日常操作技巧更为重要。 之前出海笔记分享过关于在我们烧了一年广告预算后&#xff0c;对人群定位的总结 这次在另外一个项目上再次印证了我们的推断。 省流&#xff1a;直接告诉你们结论…

全国糖酒会全域采购商选品会前瞻-见证零售新势力的崛起与变革

消费市场正经历着前所未有的变革。新兴零售渠道如雨后春笋般迅速崛起&#xff0c;对传统大卖场和电商模式提出了严峻挑战。在这一变革浪潮中&#xff0c;仓储会员店、零食折扣店、即时零售、内容电商以及私域团购等新兴模式脱颖而出&#xff0c;零售商与供应商关系被重构&#…