keras实战教程二(文本分类bilstm)(代码片段)

pergrand pergrand     2022-12-14     264

关键词:

 

什么是文本分类


 

给模型输入一句话,让模型判断这句话的类别(预定义)。

以文本情感分类为例

输入:的确是专业,用心做,出品方面都给好评。
输出:2
输出可以是[0,1,2]其中一个,0表示情感消极,1表示情感中性,2表示情感积极。

数据样式


 

技术图片

 

 

 网上应该能找到相关数据。

模型图


 

技术图片

 

 

 

训练过程


 

技术图片

 

 仅仅作为测试训练一轮

代码


 

读取数据


 

import numpy as np
from gensim.models.word2vec import Word2Vec
from gensim.corpora.dictionary import Dictionary
from gensim import models
import pandas as pd
import jieba
import logging
from keras import Sequential
from keras.preprocessing.sequence import pad_sequences
from keras.layers import Bidirectional,LSTM,Dense,Embedding,Dropout,Activation,Softmax
from sklearn.model_selection import train_test_split
from keras.utils import np_utils

def read_data(data_path):
    senlist = []
    labellist = []  
    with open(data_path, "r",encoding=gb2312,errors=ignore) as f:
         for data in  f.readlines():
                data = data.strip()
                sen = data.split("	")[2] 
                label = data.split("	")[3]
                if sen != "" and (label =="0" or label=="1" or label=="2" ) :
                    senlist.append(sen)
                    labellist.append(label) 
                else:
                    pass                    
    assert(len(senlist) == len(labellist))            
    return senlist ,labellist 

sentences,labels = read_data("data_train.csv")

 

词向量


 

def train_word2vec(sentences,save_path):
    sentences_seg = []
    sen_str = "
".join(sentences)
    res = jieba.lcut(sen_str)
    seg_str = " ".join(res)
    sen_list = seg_str.split("
")
    for i in sen_list:
        sentences_seg.append(i.split())
    print("开始训练词向量") 
#     logging.basicConfig(format=‘%(asctime)s : %(levelname)s : %(message)s‘, level=logging.INFO)
    model = Word2Vec(sentences_seg,
                size=100,  # 词向量维度
                min_count=5,  # 词频阈值
                window=5)  # 窗口大小    
    model.save(save_path)
    return model

model =  train_word2vec(sentences,word2vec.model)    

数据处理


 

def generate_id2wec(word2vec_model):
    gensim_dict = Dictionary()
    gensim_dict.doc2bow(model.wv.vocab.keys(), allow_update=True)
    w2id = v: k + 1 for k, v in gensim_dict.items()  # 词语的索引,从1开始编号
    w2vec = word: model[word] for word in w2id.keys()  # 词语的词向量
    n_vocabs = len(w2id) + 1
    embedding_weights = np.zeros((n_vocabs, 100))
    for w, index in w2id.items():  # 从索引为1的词语开始,用词向量填充矩阵
        embedding_weights[index, :] = w2vec[w]
    return w2id,embedding_weights

def text_to_array(w2index, senlist):  # 文本转为索引数字模式
    sentences_array = []
    for sen in senlist:
        new_sen = [ w2index.get(word,0) for word in sen]   # 单词转索引数字
        sentences_array.append(new_sen)
    return np.array(sentences_array)

def prepare_data(w2id,sentences,labels,max_len=200):
    X_train, X_val, y_train, y_val = train_test_split(sentences,labels, test_size=0.2)
    X_train = text_to_array(w2id, X_train)
    X_val = text_to_array(w2id, X_val)
    X_train = pad_sequences(X_train, maxlen=max_len)
    X_val = pad_sequences(X_val, maxlen=max_len)
    return np.array(X_train), np_utils.to_categorical(y_train) ,np.array(X_val), np_utils.to_categorical(y_val)
w2id,embedding_weights = generate_id2wec(model)# 获取词向量矩阵和词典
x_train,y_trian, x_val , y_val = prepare_data(w2id,sentences,labels,200)#将数据处理成模型需要的格式

 

构建模型


 

class Sentiment:
    def __init__(self,w2id,embedding_weights,Embedding_dim,maxlen,labels_category):
        self.Embedding_dim = Embedding_dim
        self.embedding_weights = embedding_weights
        self.vocab = w2id
        self.labels_category = labels_category
        self.maxlen = maxlen
        self.model = self.build_model()
      
        
    def build_model(self):
        model = Sequential()
        #input dim(140,100)
        model.add(Embedding(output_dim = self.Embedding_dim,
                           input_dim=len(self.vocab)+1,
                           weights=[self.embedding_weights],
                           input_length=self.maxlen))
        model.add(Bidirectional(LSTM(50),merge_mode=concat))
        model.add(Dropout(0.5))
        model.add(Dense(self.labels_category))
        model.add(Activation(softmax))
        model.compile(loss=categorical_crossentropy,
                     optimizer=adam, 
                     metrics=[accuracy])
        model.summary()
        return model
    
    def train(self,X_train, y_train,X_test, y_test,n_epoch=5 ):
        self.model.fit(X_train, y_train, batch_size=32, epochs=n_epoch,
                      validation_data=(X_test, y_test))
        self.model.save(sentiment.h5)   
        
    def predict(self,model_path,new_sen):
        model = self.model
        model.load_weights(model_path)
        new_sen_list = jieba.lcut(new_sen)
        sen2id =[ self.vocab.get(word,0) for word in new_sen_list]
        sen_input = pad_sequences([sen2id], maxlen=self.maxlen)
        res = model.predict(sen_input)[0]
        return np.argmax(res)
senti = Sentiment(w2id,embedding_weights,100,200,3)

 

训练预测


senti.train(x_train,y_trian, x_val ,y_val,1)#训练
label_dic = 0:"消极的",1:"中性的",2:"积极的"
sen_new = "现如今的公司能够做成这样已经很不错了,微订点单网站的信息更新很及时,内容来源很真实"
pre = senti.predict("./sentiment.h5",sen_new)
print("‘‘的情感是:
".format(sen_new,label_dic.get(pre)))

参考https://www.jianshu.com/p/fba7df3a76fa

 

[python人工智能]三十一.keras实现bilstm微博情感分类和lda主题挖掘分析(上)(代码片段)

...像,一篇非常经典的图像分类文字。这篇文章将结合文本挖掘介绍微博情感分类知识,包括数据预处理、机器学习和深度学习的情感分类,后续结合LDA进行主题挖掘。基础性文章,希望对您有所帮助ÿ 查看详情

nlp进阶,bert+bilstm情感分析实战(代码片段)

Bert+BiLSTM做情感分析情感分析情感分析一类的任务比如商品评价正负面分析,敏感内容分析,用户感兴趣内容分析、甚至安全领域的异常访问日志分析等等实际上都可以用文本分类的方式去做,情感分析的问题本质... 查看详情

nlp屠夫系列-ner之实战bilstm(代码片段)

文章目录本文学习目标一.NER1.1什么是命名实体识别:1.2命名实体识别的作用:1.3命名实体识别常用方法:1.4医学文本特征:二、BiLSTM2.1学习目标:2.2BiLSTM网络结构:2.3BiLSTM模型实现:2.3.1第一步:实现类的初始化和网络结构的搭建.2.3.2第二... 查看详情

小白学习keras教程二基于cifar-10数据集训练简单的mlp分类模型(代码片段)

@Author:Runsen分类任务的MLP当目标(y)是离散的(分类的)对于损失函数,使用交叉熵;对于评估指标,通常使用accuracy数据集描述CIFAR-10数据集包含10个类中的60000个图像—50000个用于培训,10000个用于测试有关更多信息,请参阅... 查看详情

文本分类-04bilstm

...据集合 数据处理 预训练word2vec模型 一、大纲概述文本分类这个系列将会有8篇左右文章,从github直接下载代码,从百度云下载训练数据,在pycharm上导入即可使用,包括基于word2vec预训练的文本分类,与及基于近几年的预训... 查看详情

文本分类-05bilstm+attention

...据集合 数据处理 预训练word2vec模型 一、大纲概述文本分类这个系列将会有8篇左右文章,从github直接下载代码,从百度云下载训练数据,在pycharm上导入即可使用,包括基于word2vec预训练的文本分类,与及基于近几年的预训... 查看详情

python深度学习14——keras实现transformer中文文本十分类(代码片段)

...;音频文件,时间序列等。本次案例还是演示最经典的文本分类问题。比上次的外卖数据集高级一点,这次的数据集是一个主题分类,十个主题,而且数据量很大,有6w多条。Transformer在序列文本数据,尤其... 查看详情

keras深度学习实战(30)——使用文本生成模型进行文学创作(代码片段)

Keras深度学习实战(30)——使用文本生成模型进行文学创作0.前言1.文本生成模型与数据集分析1.1数据集分析1.2模型分析2.构建文本生成模型2.1数据预处理2.2模型构建与训练小结系列链接0.前言在情感分类任务中,神经... 查看详情

keras深度学习实战(39)——音乐音频分类(代码片段)

Keras深度学习实战(39)——音乐音频分类0.前言1.数据集与模型分析1.1数据集分析1.2模型分析2.歌曲流派分类模型2.1数据加载与预处理2.2模型构建与训练3.聚类分析小结系列链接0.前言音乐音频分类技术能够基于音乐内容为... 查看详情

keras深度学习实战——基于inceptionv3实现性别分类(代码片段)

Keras深度学习实战——基于Inceptionv3实现性别分类0.前言1.Inception结构1.1Inceptionv1损失函数1.2Inceptionv2和Inceptionv32.使用预训练的Inceptionv3模型实现性别分类2.1模型实现2.2错误分类的图片示例相关链接0.前言我们已经学习了基于VGG16和VG... 查看详情

keras深度学习实战——基于vgg19模型实现性别分类(代码片段)

Keras深度学习实战——基于VGG19模型实现性别分类0.前言1.VGG19架构简介2.使用预训练VGG19模型进行性别分类2.1构建输入与输出数据2.2模型构建与训练2.3模型错误分类示例相关链接0.前言在《迁移学习》中,我们了解了利用迁移学... 查看详情

实战keras——用cnn实现cifar10图像分类(代码片段)

原文:https://blog.csdn.net/zzulp/article/details/76358694 importkerasfromkeras.datasetsimportcifar10fromkeras.modelsimportSequentialfromkeras.layersimportDense,Dropout,Activation,Flattenfromkeras.l 查看详情

keras深度学习实战——基于resnet模型实现性别分类(代码片段)

Keras深度学习实战——基于ResNet模型实现性别分类0.前言1.ResNet架构简介2.基于预训练的ResNet50模型实现性别分类2.1训练性别分类模型2.2错误分类图像示例相关链接0.前言从VGG16到VGG19,最显著的变化在于网络层数的增加,通... 查看详情

nlp进阶,bert+bilstm情感分析实战(代码片段)

Bert+BiLSTM做情感分析情感分析情感分析一类的任务比如商品评价正负面分析,敏感内容分析,用户感兴趣内容分析、甚至安全领域的异常访问日志分析等等实际上都可以用文本分类的方式去做,情感分析的问题本质... 查看详情

keras遇到bert实战一(bert实现分类)(代码片段)

说明:最近一直在做关系抽取的任务,此次仅仅是记录一个实用的简单示例参考https://www.cnblogs.com/jclian91/p/12301056.html参考https://blog.csdn.net/asialee_bird/article/details/102747435importpandasaspdimportcodecs,gcimportnumpyasnpfromsklea 查看详情

bert实战:使用distilbert进行文本情感分类(代码片段)

这次根据一篇教程JayAlammar:AVisualGuidetoUsingBERTfortheFirstTime学习下如何在Pytorch框架下使用BERT。主要参考了中文翻译版本教程提供了可用的代码,可以在colab或者github获取。1.huggingface/transformersTransformers提供了数千个预训练的模型... 查看详情

如何为 biLSTM 层 Keras 设置自定义初始权重?

】如何为biLSTM层Keras设置自定义初始权重?【英文标题】:HowtosetcustominitialweightstobiLSTMlayerKeras?【发布时间】:2021-06-0115:44:29【问题描述】:我目前正在构建带有注意力的BiLSTM,并使用Antlion算法优化BiLSTM层权重。Antlion算法在MATLAB... 查看详情

python深度学习12——keras实现注意力机制(self-attention)中文的文本情感分类(详细注释)(代码片段)

...pytorch较为多。但是使用函数API也可以实现,Keras处理文本并且转化为词向量也很方便。本文使用了一个外卖评价的数据集,标签是0和1,1代表好评,0代表差评。并且构建了12种模型,即MLP,1DCNN,RNN,GRU,LSTM,  CNN&#... 查看详情