文本分类TF-IDF+LSTM

首先需要注意的是,使用深度学习进行文本分类,输入的向量必须是相同的长度。

其次,文本分类主要需要注意的是输入向量的维度需要与神经网络匹配,因此,TF-IDF得到的矩阵需要升一维才可以输入到神经网络中,只要输入维度正确,建立CNN,LSTM,GRU等模型都是可以的。

核心一点,要把数据维度搞清楚,此文以二分类为例

##数据预处理,分词,去停用词,去标点符号省略,此处所用数据为已经数据处理好
#X为文本,y为标签
X = text_data['text']
y = text_data['label1']
#将文本使用TF-IDF向量化
from sklearn.feature_extraction.text import TfidfVectorizer
tfid = TfidfVectorizer()
t_X = tfid.fit_transform(X)
##将t_X和y转为numpy
import numpy as np
n_X = t_X.toarray()
y1 = np.array(y)
##将n_X升维
X1=np.expand_dims(n_X,axis=2)
#划分训练、验证、测试集
from sklearn.model_selection import train_test_split
train_X, test_X, train_y, test_y = train_test_split(X1, y1, test_size=0.3,shuffle=True)
train_X, val_X, train_y, val_y = train_test_split(train_X, train_y, test_size=0.2)
print(len(train_X), 'train examples')
print(len(val_X), 'validation examples')
print(len(test_X), 'test examples')
#建模
model = tf.keras.Sequential([
  tf.keras.layers.Conv1D(activation='relu', filters=128, kernel_size=3,input_shape= 
  (X1.shape[1],1)),
  tf.keras.layers.MaxPool1D(),
  tf.keras.layers.Conv1D(activation='relu', filters=64, kernel_size=3),
  tf.keras.layers.MaxPool1D(),
  tf.keras.layers.Bidirectional(layers.LSTM(16)),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(64, activation='relu'),
  tf.keras.layers.Dropout(0.5),
  tf.keras.layers.Dense(32, activation='relu'),
  tf.keras.layers.Dropout(0.5),
  tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])
##训练模型
model.fit(train_X,train_y,
      batch_size = 32,
      validation_data = (val_X,val_y),
      epochs = 20)

你可能感兴趣的:(分类,深度学习)