使用keras-bert实现 谭松波 酒店评论 文本分类(情感分析)

本文介绍使用Keras-Bert实现文本分类。先说明了安装Keras、keras-bert、tensorflow及下载bert模型的方法,接着阐述项目实现流程,包括数据集处理、文本编码、加载Bert模型、构建自定义模型、训练保存模型等,还对比了Bert与Word2vec,最后提及训练好的模型加载和预测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Keras-Bert  实现文本分类

 

以下文档可下载:https://pan.baidu.com/s/1UfnIWmFMhqAIXl8LouJNWQ 提取码:9m5u 
复制这段内容后打开百度网盘手机App,操作更方便哦

项目的地址在Github: https://github.com/Luomiou/keras-bert-

目录

Keras-Bert  实现文本分类

项目的地址在Github: https://github.com/Luomiou/keras-bert-

安装Keras、keras-bert、tensorflow

下载bert模型

 项目实现

1. 数据集

1.1. 流程

1.1.1. 导入的包和参数

1.1.2. 得到编码

1.1.3. 健壮性编码

1.1.4. 读取数据

1.1.5. 将文字进行编码

1.1.6. 加载Bert模型和构建自己的模型

1.1.7. 运行和保存深度学习网络模型

1.1.8. 运行

1.1.9. 结果

1.1.10. 总结

 1.1.11. 训练好的模型加载和预测

参考:



前言:Bert讲解网上很多,就不累赘。使用Keras-bert实现分类很少,故尝试使用。使用过程如下

安装Keras、keras-bert、tensorflow

   pip install XXX -i https://pypi.douban.com/simple/

下载bert模型

   https://github.com/google-research/bert/ 该网站下 下载bert模型,可能需要梯子,本项目上传到了github上,供大家使用。改模型的下载地址如下:

https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip 。

将压缩包解压,有如下四个文件:

                             

   废话少说,讲点效率的事。将以上模型应用到二分类上。手撕代码。

 

 项目实现

项目所需要的 数据集 和 模型 下载地址为:

数据集:https://pan.baidu.com/s/1AvKeyY8_QC_ksXozGxZPlg 提取码:vk8f

模型chinese_L-12_H-768_A-12:

https://pan.baidu.com/s/1QFmUqh0ArsrlNCWFt8qGYA 提取码:g6ro

1. 数据集

首先看看数据集长什么样。本数据是 谭松波 酒店评论 数据,6000=3000 pos+3000 neg)条,谭的数据集全是 一句话一个txt文本,本人将这些总结到了一个文档数据,在github上 https://github.com/Luomiou/keras-bert-/tree/master/hotl/data

 

1.1. 流程

1.1.1. 导入的包和参数

 

import codecs
import os
import sys

import numpy as np
from keras import Input, Model, losses
from keras.layers import Lambda, Dense
from keras.optimizers import Adam
from keras.preprocessing import sequence
from keras.activations import softmax,sigmoid
from keras_bert import Tokenizer, load_trained_model_from_checkpoint

# syspath = sys.path[1]+'/hotl'# 本文项目名称为hotl,可以改成你自己的
syspath = sys.path[1] # 

os.chdir(syspath)
# 注意!!!!特别注意!!!此处要慎重,是绝对路径,以下内容是Bert-Pre-training
config_path = 'D:\Pycharm\post\hotl\chinese_L-12_H-768_A-12\\bert_config.json'# 加载配置文件
checkpoint_path = 'D:\Pycharm\post\hotl\chinese_L-12_H-768_A-12\\bert_model.ckpt'
dict_path = 'D:\Pycharm\post\hotl\chinese_L-12_H-768_A-12\\vocab.txt'
#  以上是模型的加载,要慎重,一定要慎重!!!!!

maxlen=100# 句子的最大长度,padding要用的

1.1.2. 得到编码

在喂入bert模型之前,将文本数据进行编码,也就是对每个汉字进行编码,可不是词语哦!!!,Bert模型中有个vocab.txt文件,类似一个大词典。使用get_token_dict(vocab.txt)将得到每个字对应的索引。

def get_token_dict(dict_path):
    '''
    :param: dict_path: 是bert模型的vocab.txt文件
    :return:将文件中字进行编码
    '''
    # 将bert模型中的 字 进行编码
    # 目的是 喂入模型  的是  这些编码,不是汉字
    token_dict = {}
    with codecs.open(dict_path, 'r', 'utf-8') as reader:
        for line in reader:
            token = line.strip()
            token_dict[token] = len(token_dict)
    return token_dict

测试:

token_dict = get_token_dict(dict_path)
print(token_dict)

结果:

{'': 13503, '##right': 11264,................, '慷': 2724, '##盅': 17714, '##剤': 14251}

1.1.3. 健壮性编码

class OurTokenizer(Tokenizer):
    '''
    关键在  Tokenizer 这个类,要实现这个类中的方法,其实不实现也是可以的
    目的是 扩充 vocab.txt文件的
    '''
    def _tokenize(self, text):
        R = []
        for c in text:
            if c in self._token_dict:
                R.append(c)
            elif self._is_space(c):
                R.append('[unused1]')
            else:
                R.append('[UNK]')
        return R

1.1.4. 读取数据

def get_data():
    '''
    读取数据的函数
    :return: list  类型的 数据
    '''
    pos = []
    neg = []
    with codecs.open('./data/pos.txt','r','utf-8') as reader:
        for line in reader:
            pos.append(line.strip())
    with codecs.open('./data/neg.txt','r','utf-8') as reader:
        for line in reader:
            neg.append(line.strip())
    return pos,neg

1.1.5. 将文字进行编码

# 得到编码
def get_encode(pos,neg,token_dict):
    '''
    :param pos:第一类文本数据
    :param neg:第二类文本数据
    :param token_dict:编码字典
    :return:[X1,X2],其中X1是经过编码后的集合,X2表示第一句和第二句的位置,记录的是位置信息
    '''
    all_data = pos + neg
    tokenizer = OurTokenizer(token_dict)
    X1 = []
    X2 = []
    for line in all_data:
        # tokenizer.encode(first,second, maxlen)
        # 第一句和第二句,最大的长度,
        # 本数据集是  都是按照第一句,即一行数据即是一句,也就是第一句
        # 返回的x1,是经过编码过后得到,纯整数集合
        # 返回的x2,源码中segment_ids,表示区分第一句和第二句的位置。

        # 结果为:[0]*first_len+[1]*sencond_len
        # 本数据集中,全是以字来分割的。
        # line_list = line.split('.')
        # for i in line_list:
        #     print(i)
        x1,x2 = tokenizer.encode(first=line)
        # print(line,'\n')
        # print(x1,'\n',len(x1),'\n',x2,'\n',len(x2))
        # break
        X1.append(x1)
        X2.append(x2)
    # 利用Keras API进行对数据集  补齐  操作。
    # 与word2vec没什么区别,都需要进行补齐
    X1 = sequence.pad_sequences(X1,maxlen=maxlen,padding='post',truncating='post')
    X2 = sequence.pad_sequences(X2,maxlen=maxlen,padding='post',truncating='post')
    return [X1,X2]

1.1.6. 加载Bert模型和构建自己的模型

def build_bert_model(X1,X2):
    '''
    :param X1:经过编码过后的集合
    :param X2:经过编码过后的位置集合
    :return:模型
    '''

    #  !!!!!! 非常重要的!!!非常重要的!!!非常重要的!!!
    # 加载  Google 训练好的模型bert 就一句话,非常完美prefect
    bert_model = load_trained_model_from_checkpoint(config_path, checkpoint_path, seq_len=None)
    # config_path 是Bert模型的参数,checkpoint_path 是Bert模型的最新点,即训练的最新结果
    # 特别注意的是  加载Bert的路径 问题,
    # 注:https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip,
    #     下载完之后,解压得到4个文件,直接放到 项目的路径下,要写上绝对路径,以防出现问题。
    # 安装 keras-bert:pip install keras-bert
    wordvec = bert_model.predict([X1,X2])
    # wordvec就是得到的向量矩阵
    return wordvec

def build_model():
    model =Sequential()
    model.add(Bidirectional(LSTM(128)))
    model.add(Dense(1,activation=sigmoid))
    model.compile(loss=losses.binary_crossentropy, optimizer=Adam(1e-5), metrics=['accuracy'])
    
    return model

                

1.1.7. 运行和保存深度学习网络模型

 训练和保存模型

def train(wordvec,y):
    model = build_model()
    model.fit(wordvec,y,batch_size=32,epochs=10,validation_split=0.2)
    yaml_string = model.to_yaml()
    with open('test_keras_bert.yml', 'w') as f:
        f.write(yaml.dump(yaml_string, default_flow_style=True))
    model.save_weights('test_keras_bert.h5')

1.1.8. 运行


if __name__ =='__main__':
    pos,neg = get_data()
    token_dict = get_token_dict(dict_path)
    # get_encode()
    [X1,X2] = get_encode(pos,neg,token_dict)
    wordvec = build_bert_model(X1,X2)
    # 标签类,其中选取3000个积极的文本和3000个消极的文本,将积极的记为1,将消极的记为0
    y = np.concatenate((np.ones(3000, dtype=int), np.zeros(3000, dtype=int)))
    # y = keras.utils.to_categorical(y,num_classes=2)
    # p = Dense(2, activation='sigmoid')(x)
    train(wordvec,y)

1.1.9. 结果

由于训练时间较长,故停止了运行,程序是能跑的。

                       

 

1.1.10. 总结

使用Bert模型,最重要的还是特征提取,不了解Bert的小伙伴,去网上get,本文只介绍使用。

Bert与Word2vec相比,前者使用了以字为级别的向量,而word2vec则是以词语为级别的向量,而且,word2vec将一个词语的所有的意思都叠加到了一个词语的向量,而Bert只是参考上下文,进行语义提取,故不存在一词多义的问题。

项目开发流程:

  1. 首先将以字为级别的数据集,进行编码
  2. 将得到的编码喂入到训练好的Bert模型中。
  3. 定义自己的模型,切记Bert模型后面不要加入太复杂的模型。

 1.1.11. 训练好的模型加载和预测

 

 

    #  输入  转化成   bert 向量
    # 1. 首先数据预处理
    # 2. 编码 X1,X2 = get_encode()
    # 3. 加载bert模型,生成wordvector  , wordvec = build_bert_model(X1,X2)
    # 4. 加载训练好的模型      
    print('Loading model ......')
    with open('test_keras_bert.yml','r') as f:
        yaml_string=yaml.load(f)
    model=model_from_yaml(yaml_string)
    print('Loading weights')
    model.load_weights('test_keras_bert.h5')

    # 5. 模型预测
    result = model.predict(wordvec)

  
    
    

xlnet和bert都已经完成编码,若有需要后文,再做解释和对比。

参考:

 

Keras-Bert: https://kexue.fm/archives/6736#%E6%96%87%E6%9C%AC%E5%88%86%E7%B1%BB 

 

 

评论 54
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tiki_taka_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值