• 基于keras的文本情感识别


    情感识别是一个典型的分类问题,可以使用Keras来实现,本文是之前整理的笔记,分享出来大家一起学习。
     

    流程描述

        Keras文本情感分类基于机器学习算法,会根据大量数据训练出分类模型,然后使用训练好的模型对新来的数据进行分类。

    该过程主要由训练流程和分类流程构成,这里以LSTM模型为例对文本情感分类进行描述。

    训练流程

        训练流程的输入是大量的已打标签文本数据,输出是最终的训练模型。

    整体流程如下:

    流程解释如下:

    1、 评论数据分类

    将原始评论数据进行分类,并打标签。该过程可以由多人同时进行,标签数据以最高得分为准(即少数服从多数)。

    2、 数据预处理

    计算机无法理解人类的自然语言,需要将人类的自然语言转换为计算机能理解的机器语言。该过程可以使用Word2Vec、jieba分词等工具实现,预处理的最终数据是词向量形式。

    3、 模型训练过程

    训练过程使用LSTM网络进行,数据经过嵌入层、LSTM层,最终到达输出层。不断重复以上过程至预期准确率。

    4、 输出训练模型

    当训练过程达到预期准确率时,终止训练过程,并将训练好的模型输出到文件。

    分类流程

    训练流程结束后,会输出最终的模型文件,分类过程需要预先加载该文件,将模型加载到内存,然后使用该模型对新输入的数据进行分类。

    具体如下:

    流程描述如下:

    1、 启动程序,并加载模型;

    2、 预处理文本数据,得到词向量数据;

    3、 使用模型对词向量进行分类;

    4、得到分类结果。

    Keras安装

    可参考:

    https://www.cnblogs.com/MikeZhang/p/createKerasEnv-20210228.html

    操作系统 : Ubuntu1804_x64

    Python 版本 : 3.6.8

    keras + tensorflow 环境搭建,使用cpu,安装命令如下: 

    virtualenv -p /usr/bin/python3.6 py36env
    
    source py36env/bin/activate
    
    pip install -r req.txt

    req.txt 文件内容如下:

    absl-py==0.7.1
    astor==0.8.0
    attrs==19.1.0
    backcall==0.1.0
    bleach==3.1.0
    cycler==0.10.0
    decorator==4.4.0
    defusedxml==0.6.0
    entrypoints==0.3
    et-xmlfile==1.0.1
    gast==0.2.2
    google-pasta==0.1.7
    graphviz==0.11.1
    grpcio==1.22.0
    h5py==2.9.0
    interval==1.0.0
    ipykernel==5.1.1
    ipython==7.6.1
    ipython-genutils==0.2.0
    ipywidgets==7.5.0
    jdcal==1.4.1
    jedi==0.14.1
    jieba==0.39
    Jinja2==2.10.1
    joblib==0.13.2
    jsonschema==3.0.1
    jupyter==1.0.0
    jupyter-client==5.3.1
    jupyter-console==6.0.0
    jupyter-core==4.5.0
    Keras==2.2.4
    Keras-Applications==1.0.8
    Keras-Preprocessing==1.1.0
    kiwisolver==1.1.0
    Markdown==3.1.1
    MarkupSafe==1.1.1
    matplotlib==3.1.1
    mistune==0.8.4
    nbconvert==5.5.0
    nbformat==4.4.0
    notebook==6.0.0
    numpy==1.16.2
    openpyxl==2.6.2
    pandas==0.24.2
    pandocfilters==1.4.2
    parso==0.5.1
    pexpect==4.7.0
    pickleshare==0.7.5
    prometheus-client==0.7.1
    prompt-toolkit==2.0.9
    protobuf==3.9.0
    ptyprocess==0.6.0
    pydot==1.4.1
    Pygments==2.4.2
    pyparsing==2.4.0
    pyrsistent==0.15.3
    python-dateutil==2.8.0
    pytz==2019.1
    PyYAML==5.1.1
    pyzmq==18.0.2
    qtconsole==4.5.1
    scikit-learn==0.21.2
    scipy==1.3.0
    Send2Trash==1.5.0
    six==1.12.0
    sklearn==0.0
    tensorboard==1.14.0
    tensorflow==1.14.0
    tensorflow-estimator==1.14.0
    termcolor==1.1.0
    terminado==0.8.2
    testpath==0.4.2
    traitlets==4.3.2
    wcwidth==0.1.7
    webencodings==0.5.1
    Werkzeug==0.15.4
    widgetsnbextension==3.5.0
    wrapt==1.11.2
    View Code

    使用方法

    1、 激活虚拟环境

    source py36env/bin/activate

    2、 准备数据

    准备用于训练及测试的文本数据,可以直接使用百度情感分析的样本数据。

    3、 启动训练程序

    比如: python cnn_bdt1.py

    启动使用cnn模型的训练及测试流程。

    测试结果

    分词的情况决定最终的测试结果,以下结果基于百度情感分析里面的样本数据:

    算法

    训练

    测试

    cnn

    99%

    87%

    lstm

    98%

    86%

    cnn_lstm

    99%

    89%

    fasttext

    95%

    83%



    测试代码

    文件说明如下:

    senta_data  : 训练及测试数据

    testResult.csv : 测试结果

    cnn_test1.py  : CNN示例代码

    cnn_lstm_test1.py  : CNN_LSTM示例代码

    fasttext_test1.py  : fasttext示例代码

    lstm_test1.py  : LSTM示例代码 

    1、cnn示例

    fillArr(x_train,y_train,"senta_data/train.tsv")
    fillArr(x_test,y_test,"senta_data/test.tsv")
    x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
    x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
    model = Sequential()
    model.add(Embedding(max_features,embedding_dims,input_length=maxlen))
    model.add(Dropout(0.2))
    model.add(Conv1D(filters,kernel_size,padding='valid',activation='relu',strides=1))
    model.add(GlobalMaxPooling1D())
    model.add(Dense(hidden_dims))
    model.add(Dropout(0.2))
    model.add(Activation('relu'))
    model.add(Dense(1))
    model.add(Activation('sigmoid'))
    model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
    model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,validation_data=(x_test, y_test))          
    score, acc = model.evaluate(x_test, y_test,batch_size=batch_size)
    print('Test score:', score)
    print('Test accuracy:', acc)

    2、lstm示例

    fillArr(x_train,y_train,"senta_data/train.tsv")
    fillArr(x_test,y_test,"senta_data/test.tsv")
    x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
    x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
    model = Sequential()
    model.add(Embedding(max_features, 128))
    model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
    model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,validation_data=(x_test, y_test))
    score, acc = model.evaluate(x_test, y_test,batch_size=batch_size)
    print('Test score:', score)
    print('Test accuracy:', acc)

    3、cnn_lstm示例

    fillArr(x_train,y_train,"senta_data/train.tsv")
    fillArr(x_test,y_test,"senta_data/test.tsv")
    x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
    x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
    model = Sequential()
    model.add(Embedding(max_features, embedding_size, input_length=maxlen))
    model.add(Dropout(0.25))
    model.add(Conv1D(filters,kernel_size,padding='valid',activation='relu',strides=1))
    model.add(MaxPooling1D(pool_size=pool_size))
    model.add(LSTM(lstm_output_size))
    model.add(Dense(1))
    model.add(Activation('sigmoid'))
    model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
    model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,validation_data=(x_test, y_test))
    score, acc = model.evaluate(x_test, y_test,batch_size=batch_size)
    print('Test score:', score)
    print('Test accuracy:', acc)

    4、fasttext示例 

    fillArr(x_train,y_train,"senta_data/train.tsv")
    fillArr(x_test,y_test,"senta_data/test.tsv")
    
    if ngram_range > 1:
        ngram_set = set()
        for input_list in x_train:
            for i in range(2, ngram_range + 1):
                set_of_ngram = create_ngram_set(input_list, ngram_value=i)
                ngram_set.update(set_of_ngram)
        start_index = max_features + 1
        token_indice = {v: k + start_index for k, v in enumerate(ngram_set)}
        indice_token = {token_indice[k]: k for k in token_indice}
        max_features = np.max(list(indice_token.keys())) + 1
        x_train = add_ngram(x_train, token_indice, ngram_range)
        x_test = add_ngram(x_test, token_indice, ngram_range)
    
    x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
    x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
    model = Sequential()
    model.add(Embedding(max_features,embedding_dims,input_length=maxlen))
    model.add(GlobalAveragePooling1D())
    model.add(Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
    model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,validation_data=(x_test, y_test))
    score, acc = model.evaluate(x_test, y_test,batch_size=batch_size)
    print('Test score:', score)
    print('Test accuracy:', acc)

    本文涉及完整代码及资源下载地址:https://pan.baidu.com/s/182ZP5cBdA7QYk8lAj72mEA 

    可关注微信公众号(聊聊博文)后回复 2021033101 获得提取码。 

    微信公众号:

  • E-Mail : Mike_Zhang@live.com
  • 转载请注明出处,谢谢!
  • 相关阅读:
    一般图最大匹配
    UOJ164 线段树历史最值查询
    一个经典的排列组合面试题目
    动态代理理解
    JAVA nio
    hadoop NameNode 实现分析
    以一个上传文件的例子来说 DistributedFileSystem
    hadoop IPC 源代码分析
    hadoop DataNode实现分析
    HDFS 整体把握
  • 原文地址:https://www.cnblogs.com/MikeZhang/p/KerasEmotionRecognition20210331.html
  • Copyright © 2020-2023  润新知