利用BiLSTM网络实现文本分类

这里数据的Preprocess过程不贴代码了,训练过程(train)也不贴了,只是记录一下BiLSTM网络实现代码:


这里隐层数为2,词向量为100维。

import tensorflow as tf
from tensorflow.contrib import rnn


class Model(object):
    def __init__(self, num_layers, seq_length, embedding_size, vocab_size, rnn_size, label_size):
        # 输入数据以及数据标签
        self.input_x = tf.placeholder(tf.int32, [None, seq_length], name="input_x1")
        self.input_y = tf.placeholder(tf.float32, [None, label_size], name="input_y")
        self.dropout_keep_prob = tf.placeholder(tf.float32, name="dropout_keep_prob")
        self.l2_loss = tf.constant(0.0)

        with tf.name_scope('embeddingLayer'):
            # w : 词表(embedding 向量),后面用来训练.
            w = tf.Variable(tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0), name='W')
            embedded = tf.nn.embedding_lookup(w, self.input_x)

            # 根据第二维展开,维度从0开始
            # 删除所有大小为1的维度,删除[1]为要删除维度的参数
            inputs = tf.split(embedded, seq_length, 1)
            inputs = [tf.squeeze(input_, [1]) for input_ in inputs]

        with tf.name_scope("fw"):
            stacked_rnn_fw = []
            for _ in range(num_layers):
                fw_cell = tf.nn.rnn_cell.BasicLSTMCell(rnn_size, forget_bias=1.0, state_is_tuple=True)
                stacked_rnn_fw.append(fw_cell)
            lstm_fw_cell_m = tf.nn.rnn_cell.MultiRNNCell(cells=stacked_rnn_fw, state_is_tuple=True)

        with tf.name_scope("bw"):
            stacked_rnn_bw = []
            for _ in range(num_layers):
                bw_cell = tf.nn.rnn_cell.BasicLSTMCell(rnn_size, forget_bias=1.0, state_is_tuple=True)
                stacked_rnn_bw.append(bw_cell)
            lstm_bw_cell_m = tf.nn.rnn_cell.MultiRNNCell(cells=stacked_rnn_bw, state_is_tuple=True)

        with tf.name_scope("output"):
            outputs, _, _ = rnn.static_bidirectional_rnn(lstm_fw_cell_m, lstm_bw_cell_m, inputs, dtype=tf.float32)

        with tf.name_scope("result"):
            w = tf.Variable(tf.random_uniform([2 * rnn_size, label_size], -1.0, 1.0), name='W')
            b = tf.get_variable('b', [label_size])
            self.output = tf.nn.xw_plus_b(outputs[-1], w, b)
            self.logits = tf.nn.softmax(self.output, dim=1)

        with tf.name_scope("loss"):
            self.losses = tf.nn.softmax_cross_entropy_with_logits(logits=self.logits, labels=self.input_y)
            self.loss = tf.reduce_mean(self.losses)

        with tf.name_scope("accuracy"):
            self.accuracys = tf.equal(tf.argmax(self.logits, axis=1), tf.argmax(self.input_y, axis=1), name="equal")
            self.accuracy = tf.reduce_mean(tf.cast(self.accuracys, "float"), name="accuracy")

        # with tf.name_scope("ans"):
        #     self.ans = tf.subtract(tf.ones_like(self.distance), self.distance, name="temp_sim")
        #     print(self.ans)

# blstm = Model(num_layers=3,
#               seq_length=30,
#               embedding_size=399,
#               vocab_size=120,
#               rnn_size=20,
#               label_size=6)

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
BiLSTM是一种常用的深度学习模型,可以用于文本分类任务。在情感分类任务中,可以利用BiLSTM文本进行表示学习,进而进行情感分类。 以下是一种利用BiLSTM实现情感分类分类的示例代码: 1. 准备数据 首先需要准备情感分类的数据集。假设数据集包含两个字段:text和label。其中text是一个字符串,表示文本内容;label是一个整数,表示文本的情感分类,取值为0、1、2。 可以使用pandas库读取数据集,并将text和label分别存储到两个列表中。 import pandas as pd data = pd.read_csv('sentiment.csv') texts = data['text'].tolist() labels = data['label'].tolist() 2. 分词和向量化 接下来需要对文本进行分词和向量化。可以使用分词工具jieba和词向量库gensim进行处理。 import jieba from gensim.models import Word2Vec # 分词 texts_cut = [jieba.lcut(text) for text in texts] # 训练词向量模型 model = Word2Vec(texts_cut, size=100, window=5, min_count=1) # 将文本转换为词向量序列 texts_vec = [] for text in texts_cut: vec = [] for word in text: if word in model.wv.vocab: vec.append(model[word]) texts_vec.append(vec) 3. 构建模型 构建BiLSTM模型,用于情感分类。 from keras.models import Sequential from keras.layers import Embedding, Bidirectional, LSTM, Dense # 定义模型 model = Sequential() model.add(Embedding(input_dim=len(model.wv.vocab), output_dim=100, input_length=None)) model.add(Bidirectional(LSTM(128, dropout=0.2, recurrent_dropout=0.2))) model.add(Dense(3, activation='softmax')) # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) 4. 训练模型 使用上一步中构建的模型对数据进行训练。 import numpy as np from keras.utils import to_categorical # 将标签转换为one-hot编码 labels_onehot = to_categorical(labels, num_classes=3) # 训练模型 model.fit(np.array(texts_vec), labels_onehot, batch_size=32, epochs=10, validation_split=0.2) 5. 预测结果 使用训练好的模型对新的文本进行情感分类。 # 对新文本进行分词和向量化 text_new = '这家餐厅很好吃' text_new_cut = jieba.lcut(text_new) text_new_vec = [] for word in text_new_cut: if word in model.wv.vocab: text_new_vec.append(model[word]) # 预测结果 result = model.predict(np.array([text_new_vec])) label_new = np.argmax(result) print('新文本的情感分类为:', label_new) 以上就是利用BiLSTM实现情感分类分类的示例代码。需要注意的是,这只是一种示例代码,具体实现可能因数据集、模型结构等因素而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值