【问题标题】:Processing Text for Classification with Keras使用 Keras 处理文本以进行分类
【发布时间】:2018-08-20 00:01:57
【问题描述】:

我正在尝试使用 Keras 训练一个基本的文本分类 NN。我从一个网站下载了 12,500 个 pos 和 12,500 个负面电影评论。但是,我无法将数据处理成 Keras 可以使用的东西。

首先,我打开 25000 个文本文件并将每个文件存储到一个数组中。然后我通过这个函数运行每个数组(一个正一个负):

def process_for_model(textArray):
    '''
     Given a 2D array of the form:
     [[fileLines1],[fileLines2]...[fileLinesN]]
     converts the text into integers
    '''
    result = []
    for file_ in textArray:
        inner = []
        for line in file_:
            length = len(set(text_to_word_sequence(line)))
            inner.append(hashing_trick(line,round(length*1.3),hash_function='md5'))
        result.append(inner)

    return result

目的是将单词转换为数字,使它们接近 Keras 模型可以使用的东西。

然后我将转换后的数字附加到一个数组中,同时将 0 或 1 作为标签附加到另一个数组中:

training_labels = []
train_batches = []
for i in range(len(positive_encoded)):
    train_batches.append(positive_encoded[i])
    training_labels.append([0])
for i in range(len(negative_encoded)):
    train_batches.append(negative_encoded[i])
    training_labels.append([1])

最后我将每个数组转换为一个 np 数组:

train_batches = array(train_batches)
training_labels = array(training_labels)

但是,我不确定从这里去哪里。我相信每条评论都是 168 字。我不知道如何为这些数据创建合适的模型,也不知道如何使用 sklearn 将所有数字正确缩放到 0 和 1 之间。

我最困惑的事情是:我应该有多少层,每层应该有多少神经元,以及第一层我应该有多少输入维度。

我应该完全采用另一种方法吗?

【问题讨论】:

    标签: python machine-learning keras text-classification


    【解决方案1】:

    这里有一个很好的 Keras 教程和这个数据集:https://machinelearningmastery.com/predict-sentiment-movie-reviews-using-deep-learning/

    【讨论】:

      【解决方案2】:

      您也可以使用Keras official tutorial for text classification

      它基本上从 IMDB 集合中下载了 50k 条评论,平均平衡(一半正面,一半负面)。他们将(随机)一半用于训练,一半用于测试,并将 10k (40%) 的训练示例作为验证集。

      imdb = keras.datasets.imdb    
      (train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
      

      评论已经在他们的词词典表示中(即每条评论都是一个数字数组)。总字典有大约 80k+ 词,但它们只使用前 10k 最常用词(特定评论中的所有其他词都映射到特殊标记 - 未知 ('<UNK>'))。

      (在教程中,他们创建了一个反向词典——为了向您展示原始评论。但这并不重要。)

      每条评论最多 256 个单词,因此他们会对每条评论进行预处理,并用 0(<PAD> 令牌)填充它,以防它更短。 (填充完成后,即在最后)

      train_data = keras.preprocessing.sequence.pad_sequences(train_data,
                                                              value=word_index["<PAD>"],
                                                              padding='post',
                                                              maxlen=256)
      test_data = keras.preprocessing.sequence.pad_sequences(test_data,
                                                             value=word_index["<PAD>"],
                                                             padding='post',
                                                             maxlen=256)
      

      他们的 NN 架构由 4 层组成:

      1. Input Embedding 层:接受一批评论,每个评论有 256 个向量,数字为 [0, 10,000),并尝试找到一个 16 维向量(每个词)来表示它们。
      2. 全局平均池化层:对评论中的所有单词(16 维表示)进行平均,并为您提供一个 16 维向量来表示整个评论。
      3. 完全连接的 16 个节点的密集层 - 'vanilla' NN 层。他们选择了 ReLu 激活函数。
      4. 1 个节点的输出层:具有 sigmoid 激活函数 - 给出一个从 0 到 1 的数字,表示它是正面/负面评论的置信度。

      这是它的代码:

      vocab_size = 10000    
      model = keras.Sequential()
      model.add(keras.layers.Embedding(vocab_size, 16))
      model.add(keras.layers.GlobalAveragePooling1D())
      model.add(keras.layers.Dense(16, activation=tf.nn.relu))
      model.add(keras.layers.Dense(1, activation=tf.nn.sigmoid))
      

      然后他们拟合模型并运行它:

      model.compile(optimizer='adam',
                    loss='binary_crossentropy',
                    metrics=['acc'])
      history = model.fit(partial_x_train,
                          partial_y_train,
                          epochs=40,
                          batch_size=512,
                          validation_data=(x_val, y_val),
                          verbose=1)
      

      总而言之 - 他们选择将原本可能是 10k 维的向量简化为仅 16 维,然后运行一个密集层 NN - 他们得到了非常好的结果 (87%)。

      【讨论】:

        猜你喜欢
        • 2016-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-18
        • 2017-12-11
        • 2017-11-29
        相关资源
        最近更新 更多