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')
未完待续。。。