NLP多模型集成与比较

news2024/11/27 5:32:37

目录

  • 数据集
  • 目的
  • 所用的两种词嵌入方式
  • 步骤
    • 随机读取10000条文本
    • TF-IDF方法
    • 多模型比较
      • CNN (用于比较 TF-IDF嵌入和词向量嵌入时的区别)
      • LSTM
      • BI-LSTM

数据集

10分类的新闻文本分类任务

目的

1.比较不同数据处理方式,词嵌入方式对任务的影响
2.比较相同处理方式下,不同模型对任务的影响

所用的两种词嵌入方式

1.TF-IDF
2.腾讯AI Lab开源的词嵌入(70000 small,2000000 big)

腾讯AI Lab地址链接

步骤

随机读取10000条文本

#读文件,并sample一部分数据出来单独保存
import numpy as np
import random

f=open('./data/train.txt','r',encoding='utf-8')
f_list=f.read().splitlines()
f_sample_list=random.sample(f_list,10000)
f.close
print('sample后的文件长度为:',len(f_sample_list))
#将sample后的文件保存
with open('./train_data/train_1w.txt','w',encoding='utf-8') as fw:
    for line in f_sample_list:
        line=line.strip()
        fw.write(line+'\n')
fw.close

TF-IDF方法

from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
from tqdm import tqdm #用来看迭代进度条
import numpy as np
# s1.读输入数据文件, 区分input和label, 然后进行分词
f = open('./train_data/train_1w.txt', 'r' , encoding='utf-8')
train_data_list = f.read().splitlines()
label_list = []
input_list = []

for line_data in tqdm(train_data_list):
    line_data_split = line_data.split('\t') 
    line_in = line_data_split[0]
    line_label = int(line_data_split[-1])
    label_list.append(line_label)
    
    line_data_seg = jieba.lcut(line_in)
    # print(line_data_seg)
    input_list.append(' '.join(line_data_seg))
    # print(' '.join(line_data_seg))
    # print('-------------------')

f.close()
# s2.将input转换为tf-tdf表示
tf_idf_vectorizer = TfidfVectorizer(max_features=200, use_idf=True)
tfidf = tf_idf_vectorizer.fit_transform(input_list)
tfidf_metrics = tf_idf_vectorizer.transform(input_list) 
tfidf_metrics = tfidf_metrics.toarray()
# tfidf_test_metrics = np.reshape(tfidf_test_metrics, [-1,1,100])
print('tfidf_metrics shape: ', tfidf_metrics.shape, type(tfidf_metrics))

tfidf_metrics shape: (10000, 200) <class ‘numpy.ndarray’>

# s3. 以tf-idf表示作为输入,进行dataset打包
import os
import tensorflow as tf
import numpy as np
# from sklearn.feature_selection import mutual_info_regression

os.environ["CUDA_VISIBLE_DEVICES"]="-1" #使用cpu版tensorflow
print(tf.test.is_gpu_available())

# 3.1 首先可以对数据进行打乱
# 关于shuffle 和 seed 之间的关系,可以参考 https://blog.csdn.net/qq_46380784/article/details/128823842
tf.random.set_seed(222)
x_row = tf.reshape(tfidf_metrics, (-1, 10, 20))
x_row = tf.random.shuffle(x_row)

tf.random.set_seed(222)
y_row = tf.random.shuffle(label_list)
y_row = tf.one_hot(y_row, depth=10)

# 3.2 手动地将数据进行分割, 大概按照[8:2]或者[7.5:2.5]
x_train = x_row[:7600]
y_train = y_row[:7600]

x_test = x_row[7600:]
y_test = y_row[7600:]

print('训练输入: ', x_train.shape, type(x_train))
print('训练输出: ', y_train.shape, type(y_train))
print('测试输入: ', x_test.shape, type(x_test))
print('测试输出: ', y_test.shape, type(y_test))

在这里插入图片描述

db_train = tf.data.Dataset.from_tensor_slices((x_train,y_train))
db_train = db_train.batch(64)

db_test = tf.data.Dataset.from_tensor_slices((x_test,y_test))
db_test = db_test.batch(64)
# s4. 搭建神经网络用于实验
#需要说明的是:
    #以上数据处理的好处是:
    #1) sample的文件单独保存, 方便每次直接读取使用;
    #2) 数据处理和打包与神经网络的搭建较为独立, 这样方便在使用同样的数据处理方式时, 使用不同的模型对其进行实验.

# 4.1 普通卷积神经网络
from tensorflow.keras import layers, Sequential, Model, Input, optimizers, metrics

inputs = Input(shape=(10, 20), dtype=tf.float32)
cnn = layers.Convolution1D(64, kernel_size=3)
pool = layers.MaxPool1D(pool_size=2)
fc = layers.Dense(10, activation='softmax')

x = cnn(inputs)
print('cnn out: ', x.shape)
x = pool(x)
print('pool out: ', x.shape)
x = tf.reshape(x, (-1, 4*64))
print('Flatten out: ', x.shape)
x = fc(x)

model = Model(inputs=inputs, outputs=x)
model.compile(loss=tf.keras.losses.CategoricalCrossentropy(from_logits=False), 
              optimizer=tf.keras.optimizers.Adam(),
               metrics=['accuracy'])

在这里插入图片描述

model.fit(db_train, epochs=20, verbose=True)

在这里插入图片描述

model.evaluate(db_test)

在这里插入图片描述
总结:tf-idf不适用于大文本,因为其没有考虑时序,其偏偏就是把每一个单词独立看待的一个东西

多模型比较

# 1. 读数据
from tqdm import tqdm
import numpy as np
f = open('./train_data/train_1w.txt', 'r' , encoding='utf-8')
train_data_list = f.read().splitlines()
label_list = []
text_list = []

for text in tqdm(train_data_list):
    text_split = text.split('\t') 
    if len(text_split) == 2: #担心出现没有标签的情况
        text_list.append(text_split[0])
        label_list.append(text_split[1])

f.close()
print('文本处理长度为: ', len(text_list))
print('标签处理长度为: ', len(label_list))
# 2. 文本预处理
#主要包含:
    #2.1 Embedding;
    #2.2 分词;
    #2.3 padding;
#2.1 Embedding
from gensim.models import KeyedVectors

model = KeyedVectors.load_word2vec_format('./embeding/70000-small.txt')
model.get_vector('电脑')
model.similarity('电脑','手机')

0.722775

'哈拉少' in model.index_to_key

False

# 2.2 分词 获取每一句话的句向量形式 [n, sen_length, dim]
import jieba as jb

def getSenVec(sen):
    sen_vec = []
    for word in sen:
        if word in model.index_to_key:
            word_vec = model.get_vector(word)
        else:
            word_vec = model.get_vector('未知')
        
        sen_vec.append(word_vec)
    
    return sen_vec  

vec_list = []

for text in tqdm(text_list):
    text_seg = jb.lcut(text)
    text_seg = [i for i in text_seg if i not in [' ', '《', '》','(',')','(',')','!','!','。','.']]
    text_vec = getSenVec(text_seg)
    vec_list.append(text_vec)

    
print('获取的句向量长度为: ', len(vec_list))
# 2.3 padding为统一长度
t_length = 0
for vec in vec_list:
    t_length = t_length + len(vec)
print('平均长度为: ', t_length / 10000)

平均长度为: 9.3808
所以, 我们取padding的长度为10.

pad_text_vec = []

for vec in vec_list:
    length = len(vec)
    
    if length < 10:
        num = 10-length
        
        for _ in range(num):
            vec.append(model.get_vector('pad'))
    elif length > 10:
        vec = vec[:10]
    pad_text_vec.append(vec)

vec_array = np.array(pad_text_vec)
print('padding 以后的向量维度: ', vec_array.shape)

padding 以后的向量维度: (10000, 10, 200)

# 处理一下Y label
import tensorflow as tf
one_hot_label_list = []

for label in label_list:
    label = tf.one_hot(int(label), depth=10)
    one_hot_label_list.append(label)

one_hot_label_array = np.array(one_hot_label_list)
print('经过处理后的label: ', one_hot_label_array.shape)

经过处理后的label: (10000, 10)

# 2. 打包数据
import os
import tensorflow as tf
import numpy as np
# from sklearn.feature_selection import mutual_info_regression

os.environ["CUDA_VISIBLE_DEVICES"]="-1"
print(tf.test.is_gpu_available())

tf.random.set_seed(222)
x_row = tf.random.shuffle(vec_array)

tf.random.set_seed(222)
y_row = tf.random.shuffle(one_hot_label_array)

# 3.2 手动地将数据进行分割, 大概按照[8:2]或者[7.5:2.5]
x_train = x_row[:7600]
y_train = y_row[:7600]

x_test = x_row[7600:]
y_test = y_row[7600:]

print('训练输入: ', x_train.shape, type(x_train))
print('训练输出: ', y_train.shape, type(y_train))
print('测试输入: ', x_test.shape, type(x_test))
print('测试输出: ', y_test.shape, type(y_test))

db_train = tf.data.Dataset.from_tensor_slices((x_train,y_train))
db_train = db_train.batch(64)

db_test = tf.data.Dataset.from_tensor_slices((x_test,y_test))
db_test = db_test.batch(64)

在这里插入图片描述

CNN (用于比较 TF-IDF嵌入和词向量嵌入时的区别)

# 3. 搭建神经网络
# 3.1 CNN (用于比较 TF-IDF嵌入和词向量嵌入时的区别)
class MyCNN(tf.keras.Model):
    def __init__(self):
        super(MyCNN, self).__init__()
        self.cnn = layers.Conv1D(256, 3, padding='same')
        self.pool = layers.MaxPool1D(padding='same')
        self.fc = layers.Dense(10, activation='softmax')
    
    def call(self, inputs):
        out = self.cnn(inputs)
        print('cnn out: ', out.shape)
        
        out = self.pool(out)
        print('pool out: ', out.shape)
        
        out = tf.reshape(out, (-1, 5*256))
        print('reshape out: ', out.shape)
        
        out = self.fc(out)
        
        return out
model_MyCNN = MyCNN()
model_MyCNN.compile(loss=tf.keras.losses.CategoricalCrossentropy(from_logits=False), 
              optimizer=tf.keras.optimizers.Adam(),
               metrics=['accuracy'])
model_MyCNN.fit(db_train, epochs=20, verbose=True)
model_MyCNN.evaluate(db_test)

在这里插入图片描述

LSTM

#3.2 LSTM 用来进行, 同嵌入时, 不同模型的比较
class MyLSTM(tf.keras.Model):
    def __init__(self):
        super(MyLSTM, self).__init__()
        self.lstm = layers.LSTM(256)
        self.drop = layers.Dropout(0.1)
        self.fc = layers.Dense(10, activation='softmax')
    
    def call(self, inputs):
        out = self.lstm(inputs)
        print('lstm out: ', out.shape)
        
        out = self.drop(out)
        print('drop out: ', out.shape)
        
        out = self.fc(out)
        
        return out
model_MyLSTM = MyLSTM()
model_MyLSTM.compile(loss=tf.keras.losses.CategoricalCrossentropy(from_logits=False), 
              optimizer=tf.keras.optimizers.Adam(),
               metrics=['accuracy'])
model_MyLSTM.fit(db_train, epochs=20, verbose=True)
model_MyLSTM.evaluate(db_test)

在这里插入图片描述

BI-LSTM

class MyBILSTM(tf.keras.Model):
    def __init__(self):
        super(MyBILSTM, self).__init__()
        self.lstm = layers.LSTM(256)
        self.bilstm = layers.Bidirectional(self.lstm, merge_mode='concat')
        self.drop = layers.Dropout(0.1)
        self.fc = layers.Dense(10, activation='softmax')
    
    def call(self, inputs):
        out = self.bilstm(inputs)
        print('bilstm out: ', out.shape)
        
        out = self.drop(out)
        print('drop out: ', out.shape)
        
        out = self.fc(out)
        
        return out
model_MyBILSTM = MyBILSTM()
model_MyBILSTM.compile(loss=tf.keras.losses.CategoricalCrossentropy(from_logits=False), 
              optimizer=tf.keras.optimizers.Adam(),
               metrics=['accuracy'])
model_MyBILSTM.fit(db_train, epochs=20, verbose=True)
model_MyBILSTM.evaluate(db_test)

在这里插入图片描述

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

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

相关文章

对于awd

最近我们老师直接说要我准备awd&#xff0c;大概率要我上场我就顺便整理一下awd的资料&#xff08;准备写很多所以建议大家收藏一下&#xff09; 攻防指北 先来一个思维导图 Awd竞赛 AWD(Attack With Defense&#xff0c;攻防兼备)是一个非常有意思的模式&#xff0c;你需要…

4P营销模型

4P营销模型 菲利普科特勒在其畅销书《营销管理&#xff1a;分析、规划与控制》中进一步确认了以4P为核心的营销组合方法. 模型介绍 「4P营销模型」是市场营销中的经典理论&#xff0c;代表了产品、价格、促销和渠道四个要素。这些要素是制定市场营销策略和实施计划的关键组成部…

ARM(Day5)

思维导图&#xff1a; 通过封装函数实现点灯&#xff1a;

CAN转EtherNet/IP网关can协议支持哪两种报文

你是否曾经遇到过不同的总线协议难以互相通信的问题&#xff1f;远创智控的YC-EIP-CAN网关为你解决了这个烦恼&#xff01; 远创智控YC-EIP-CAN通讯网关是一款自主研发的设备&#xff0c;它能够将各种CAN总线和ETHERNET/IP网络连接起来&#xff0c;解决不同总线协议之间的通信障…

小程序 methods方法互相调用 this.onClickCancel is not a function

背景 做了一个自定义的弹出对话窗口&#xff0c;主要是自定义一些文本颜色。 问题 但是点击按钮事件&#xff1a;取消与确认&#xff0c;调用了同一个接口&#xff0c;然后想着走不同方法&#xff0c;需要调用methods其他方法。然后报错了&#xff1a; VM1081 WAService.js:…

【综述】化学预训练模型

目录 摘要1 引言2 分子描述符和编码器 (Molecular Descriptors and Encoders)3 预训练策略 (Pre-training Strategies)3.1 自动编码 (AutoEncoding, AE)3.2 自回归建模 (Autoregressive Modeling, AM)3.3 掩蔽组件建模 (Masked Component Modeling, MCM)3.4 上下文预测 (Contex…

绘出「星辰大海」:华为云Astro轻应用新手指南-第二章

第2章 Astro轻应用奇遇——用鼠标「拖拽」的开发 不被编程所困&#xff0c;像玩拼图一样打造订购系统&#xff01; 今天&#xff0c;我们用鼠标拖拽的方式开发订餐应用。 读过本章&#xff0c;你可以同理开发出各异的订购小程序。 继续Astro轻应用旅行吧&#xff01; 第1站…

macOS coreAudio 之 AudioQueue 播放本地音频文件

macOS的音频模块使用还是和 iOS有细微差别的。 今天记录是的是 使用 AudioQueue 配合 AudioFile 进行播放macOS 本地音频文件 本文打仓库代码为&#xff1a; JBPlayLocalMusicFile.m CoreAudio 作为Apple音频系统中音频库的集合&#xff0c;今天需要使用到的库为&#xff1a…

力扣热门100题之三数之和【中等】

题目描述 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组…

ChatGPT 最佳实践指南

GPT Best Practices GPT 最佳实践指南 This guide shares strategies and tactics for getting better results from GPTs. The methods described here can sometimes be deployed in combination for greater effect. We encourage experimentation to find the methods that…

Java类的封装

封装将类的某些信息隐藏在类内部&#xff0c;不允许外部程序直接访问&#xff0c;只能通过该类提供的方法来实现对隐藏信息的操作和访问。 例如&#xff1a;一台计算机内部极其复杂&#xff0c;有主板、CPU、硬盘和内存&#xff0c; 而一般用户不需要了解它的内部细节&#xff…

涤生大数据教学集群的首次运维现场复现

事故背景交代 涤生大数据花费重金购得几台较高配置的阿里云服务器机器&#xff0c;构建了一整套以cdh为核心的大数据课程教学、学员实操练习环境、但是&#xff0c;就是这个但是&#xff0c;以为集群规模目前相对较小。不会有什么幺蛾子发生&#xff0c;于是运维中最核心的监控…

[Linux] CentOS7 中 pip3 install 可能出现的 ssl 问题

由于解决问题之后, 才写的博客, 所以没有图片记录. 尽量描述清楚一些 今天写代码的时候, 突然发现 文件里用了#define定义宏之后, coc.nvim的coc-clangd补全就用不了 :checkhealth了一下, 发现nvim忘记支持python3了 尝试pip3 install neovim的时候, 发现会警告然后安装失败.…

设计模式结构型——代理模式

目录 代理模式的用途 代理模式的实现 静态代理 JDK动态代理 CGLIB动态代理 代理模式的特点 与其他模式比较 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许通过创建一个代理对象来间接访问原始对象。代理模式的核心思想是将对目…

20230721在WIN10下安装openssl并解密AES-128加密的ts视频切片

20230721在WIN10下安装openssl并解密AES-128加密的ts视频切片 2023/7/21 22:58 1、前言&#xff1a; AES-128加密的ts视频切片【第一个】&#xff0c;打开有时间限制的&#xff01; https://app1ce7glfm1187.h5.xiaoeknow.com/v2/course/alive/l_64af6130e4b03e4b54da1681?typ…

小鹏G6吹响汽车智能化普惠号角

监制 | 何玺 排版 | 叶媛 小鹏G6大卖。目前其订单的交车周期已经长达12周。这款主打智能化的“未来之车”&#xff0c;已经正式吹响了汽车智能化普及的号角。 01 订单排满&#xff0c;小鹏G6成“爆款” 7月11日&#xff0c;小鹏汽车董事长何小鹏在社交媒体上发了一张照片&am…

Flink笔记

Flink笔记 2.Flink学习笔记2.1流式处理对比2.2 Flink核心概念2.2.1并行度2.2.2算子链2.2.3任务槽 2.3 DataStream2.3.2 读取数据源-源算子&#xff08;Source&#xff09;2.3.3 转换算子&#xff08;Transformation&#xff09; 2.Flink学习笔记 2.1流式处理对比 学习Spark S…

Django设置权限管理

目录 整体思路 1.使用django自带的后台功能添加组和用户 启动django服务后&#xff0c;在Django终端添加一个账号 在网页上输入网址&#xff0c;跳转到登录页面 Groups 新增组&#xff0c;设置组的名字&#xff0c;对应的权限Save即可 Users 将用户绑定组或单独设置权限 2.用…

arm-day2

汇编实现三个灯循环点亮 .text .global _start _start: /**********LED1点灯**************/ RCC_TNIT:ldr r0,0x50000a28ldr r1,[r0]orr r1,r1,#(0x1 << 4)orr r1,r1,#(0x1 << 5)str r1,[r0]LED_TNIT:ldr r0,0x50006000ldr r1,[r0]and r1,r1,#(~(0x3 << 20…

珠海市黄杨山之旅游

西湾村 早上6点半出门&#xff0c;买点五人份的早餐 A点 第一个点&#xff0c;冲 C点 D岛 到d点休息 B点 高度&#xff1a;229米 到这里有人吐了&#xff0c;建议早餐不要吃超过三个包子&#xff08;他吃了四个包子&#xff0c;1个鸡蛋&#xff0c;1个火腿&#xff09; 记…