RNN,LSTM用于情感分类问题

1、词袋定义和keras自带分词和编码工具

词袋定义

n-gram: 是从一个句子中提取的 N 个(或更少)连续单词的集合
        “The cat sat on the mat.”分解为2-gram:
        {"The", "The cat", "cat", "cat sat", "sat",
        "sat on", "on", "on the", "the", "the mat", "mat"}
        这样的集合叫做二元语法袋(bag-of-2-grams)
note: 词袋是一种不保存顺序的分词方法(生成的标记组成一个集合,而不是一个序列,舍
      弃了句子的总体结构),因此它往往被用于浅层的语言处理模型,而不是深度学习模型。
      但在使用轻量级的浅层文本处理模型时(比如 logistic 回归和随机森林),
      n-gram 是一种功能强大、不可或缺的特征工程工具。

数据介绍

在这里插入图片描述
在这个文件里面一共有1600 000条文本句子,前800000条表示消极情感(后面用0作为标签),后800000条表示积极情感(后面用1作为标签)
读取文件:

def getData(fileName):
    data = []
    with open(fileName, 'r', encoding='utf-8') as f:
        for line in f.readlines():
            data.append(line[:-2])  #  最后两个字符是换行符'\n'
    return data

data = getData('train_textToWords.txt')

因为数据集较大,在调参数时我们只取部分数据用于训练和测试:

numer = 50000  # 设置正例和反例数
data = data[:numer]+data[-numer:]

利用keras自带工具分词并编码

from keras.preprocessing.text import Tokenizer
maxlen = 60  # 每个句子截断长度为60,长度不够60的补零
tokenizer = Tokenizer(num_words=20000)  # 只取前20000个常用单词
tokenizer.fit_on_texts(data)
sequences = tokenizer.texts_to_sequences(data)  # 每个句子转化为一个行向量
data = preprocessing.sequence.pad_sequences(sequences, maxlen=maxlen)

# 也可以直接得到one-hot表示,每个句子是一个num_words大小的行向量
# one_hot_results = tokenizer.texts_to_matrix(data, mode='binary')  
# word_index = tokenizer.word_index   # 单词索引
# print(word_index)

标签

#  设置标签,划分训练集和测试集
from sklearn.model_selection import train_test_split
label = [0 if i<numer else 1 for i in range(2*numer)]
x_train, x_test, y_train, y_test = train_test_split(data, label, train_size=0.9)

#  将标签向量化
y_train = np.asarray(y_train).astype('float32')
y_test = np.asarray(y_test).astype('float32')

未完待续。。。

猜你喜欢

转载自blog.csdn.net/qq_40438165/article/details/84329886