Keras IMDB数据集的预处理方法是什么?

4

我正在处理情感分析的问题,有一个数据集,非常类似于Keras的imdb数据集。 当我加载Keras的imdb数据集时,它返回一系列单词索引。

(X_train, y_train), (X_test, y_test) = imdb.load_data()
X_train[0]
[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 22665, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 21631, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 19193, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 10311, 8, 4, 107, 117, 5952, 15, 256, 4, 31050, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 12118, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32]

但是,我想了解这个序列是如何构建的。 在我的数据集中,我使用了CountVectorizer,并在我的数据集中使用了ngram_range=(1,2)来分词,但我想尝试复制Keras的方法。

2个回答

4
IMDb数据集中的单词已被替换为一个整数,该整数表示它们在数据集中出现的频率。当您第一次调用load_data函数时,它将下载数据集。
为了查看如何计算该值,让我们从源代码的片段中取一部分代码(链接在结尾提供)。
idx = len(x_train)
x_train, y_train = np.array(xs[:idx]), np.array(labels[:idx])
x_test, y_test = np.array(xs[idx:]), np.array(labels[idx:])

x_train是从长度为x_train的列表xs中创建的numpy数组;

xs是由x_train和x_test中所有单词组成的列表,首先从数据集中提取每个项(电影评论),然后提取单词。每个单词的位置都加上了index_from,该变量指定要从哪个实际索引开始(默认为3),并且加上起始字符(默认为1,使得值从1开始,因为填充将使用零)

类似地,通过load_data函数创建了numpy数组x_train、y_train、x_test和y_test,并将它们返回。

源代码在此处可用。

https://github.com/keras-team/keras/blob/master/keras/datasets/imdb.py


但是如果我们指定num_words = 10。那么实际上我们只得到了前6个值,因为1、2、3是用于start、oov_char、unused的。如何解决这个问题并获得所有前10个最常见的值。 - user13226257

3

此处所述:

  1. 评论已经过预处理,每个评论都被编码为单词索引(整数)序列。例如,一个句子被处理为I am coming home => [ 1, 3, 11, 15]。这里的1是单词I的词汇索引。

  2. 单词按照数据集中的总体频率进行索引。如果您正在使用CountVectorizer,则需要按频率降序排列词汇表。然后,结果单词的顺序对应于它们的词汇索引。


我明白了,谢谢!但是这种编码对于TF-IDF有什么实际好处呢?毕竟TF-IDF被认为比CountVectorizer更先进。 - Daniel Chepenko
你可以使用序列模型来保留单词的顺序。由于单词索引已按频率排序,因此您可以轻松地过滤掉前n个常用单词。 - vumaasha
我查看了有关预处理的官方文档。我尝试使用one_hot、哈希和Tokenizer.API对您上面发送的句子进行编码。但是这些方法都没有显示出您的编码结果。https://keras.io/preprocessing/text/ - Daniel Chepenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接