keras路透社(reuters)新闻数据的思考

在学习keras内置的路透社新闻数据过程中,我有一些问题,在此纪录一下:

1. 取前10000个出现频率最高的单词,个数貌似不是10000

加载数据代码:

from keras.datasets import reuters
(train_data, train_labels), (test_data, test_labels) = reuters.load_data(
 num_words=10000)

参数 num_words=10000 将数据限定为前 10 000 个最常出现的单词。然而我在研究数据的时候,发现并不是10000个单词。

train_data.shape
输出:(8982,),说明有8982行数据,而每行数据内的元素个数都不一样,所以我们继续分析

#我们将所有数据元素都添加到res数组中
res=[]
for i in range(0,8982):
  for j in train_data[i]:
    res.append(j)

print(res)
#查看数据元素总个数
len(res)
输出:1307239 说明有很多重复元素(单词)

#查看最大的元素编号
max(res)
输出:9999

#去重处理:
temp=[]
for i in res:
  if not i in temp:
    temp.append(i)

len(temp)
输出:9982 发现train_data中只有9982个不同单词

#查找不存在train_data的单词序号
not_train=[]
for i in range(0,10000): #range是左闭右开的
  if i in res:
    continue
  else:
    not_train.append(i)
    print(i,'不存在')
    
len(not_train)
输出:18 说明缺失了18个单词,加上前面出现的9982个单词,恰好构成10000

上面部分是对train_data数据处理的。我考虑到前10000个频率最高的单词可能被分配到train_data和test_data两个部分,所以接下来查看test_data

test_data.shape
输出:(2246,) 说明有2246行数据,但是每个数据内元素不一样大小(单词个数不同)

#获取所有元素
test_res=[]
for i in range(0,2246):
  for j in test_data[i]:
    test_res.append(j)

print(test_res)

max(test_res)
输出:9999 说明最大序号还是9999

#对元素去重
test_temp=[]
for i in test_res:
  if not i in test_temp:
    test_temp.append(i)

len(test_temp)
输出:9099 说明有9099个不同元素

not_test=[]
for i in range(0,10000): #range是左闭右开的
  if i in test_res:
    continue
  else:
    not_test.append(i)
    print(i,'不存在')

len(not_test)
输出:901 说明前10000个最多出现的单词有901个不在test_data中

接下来我们查找既不在train_data也不在test_data的数据:

tmp = [val for val in not_train if val in not_test]
print(tmp)
输出:[0, 3] 说明出现频率最高的单词中,0号和3号都不在train_data和test_data中

在下面的
路透社新闻专线分类数据集
中提到:按照惯例,“0”不代表特定单词,而是使用“0” 对任何未知单词进行编码。
在这里插入图片描述
那么0不存在我可以理解,但是为什么代表第三多的“3”也不存在呢?期待后续的学习

2.矢量化问题

矢量化

import numpy as np
def vectorize_sequences(sequences, dimension=10000):
 results = np.zeros((len(sequences), dimension))
 for i, sequence in enumerate(sequences):
  results[i, sequence] = 1.
 return results
x_train = vectorize_sequences(train_data)  #将训练数据向量化
x_test = vectorize_sequences(test_data)  #将测试数据向量化

在这里插入图片描述
为什么要矢量化:

矢量化序列说明

高赞的那个回答非常好
在这里插入图片描述

3.查看数据集大小

我们可以直接点击下载数据:
在这里插入图片描述
npz说明是经过numpy压缩后的数据,我们保存后。在python的ide,例如Pycharm查看和处理

# _*_ coding : utf-8 _*_
# @Time : 2024/7/25 0:41
# @Author : NEU weeklyRain
# @File : txtdata
# @Project : dataanalysis
import numpy as np
file_path="F:\\研究生\\reuters.npz"
poem=np.load(file_path,allow_pickle=True)
print(poem.files)
y,x=poem['y'],poem['x']
print(type(y))
print(x.shape)
res=[]
for key, arr in poem.items():
  print(key, ": ", arr)
  # print(len(arr))
  #newarr = np.array(arr)
  if(key=='x'):
    for j in range(0,len(arr)):
        # print(arr[j])
        # print(type(arr[j]))
        for i in arr[j]:
            res.append(i)
# print(res)
# print(len(res))
list2 = list(set(res)) #内置set方法去重
# print(len(list(set(res))))
print(max(res)) # 最大表示单词的整数
print(list2.sort()) #排序,返回None,没有返回值而是直接修改了源数据
print("================================================================================")
print(list2) #输出排序后的数据
# for i in range (x.shape[0]):
#     print(len(x[i]))

在这里插入图片描述
在这里插入图片描述
发现确实和官方文档描述一致。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用长短期记忆模型实现路透社数据集的主体分类的示例代码: ```python import numpy as np from keras.datasets import reuters from keras.preprocessing.sequence import pad_sequences from keras.utils import to_categorical from keras.models import Sequential from keras.layers import Embedding, LSTM, Dense, Dropout # 定义超参数 max_features = 10000 # 词汇表大小 max_len = 200 # 每篇文章的最大长度 batch_size = 32 # 批次大小 embedding_dims = 128 # 词向量维度 lstm_units = 64 # LSTM单元数 dropout_rate = 0.2 # Dropout比例 epochs = 10 # 训练轮数 # 加载数据集 (x_train, y_train), (x_test, y_test) = reuters.load_data(num_words=max_features, test_split=0.2) # 对数据进行预处理 x_train = pad_sequences(x_train, maxlen=max_len) x_test = pad_sequences(x_test, maxlen=max_len) y_train = to_categorical(y_train) y_test = to_categorical(y_test) # 定义模型 model = Sequential() model.add(Embedding(max_features, embedding_dims, input_length=max_len)) model.add(Dropout(dropout_rate)) model.add(LSTM(lstm_units)) model.add(Dropout(dropout_rate)) model.add(Dense(y_train.shape[1], activation='softmax')) # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test, y_test)) # 评估模型 score, acc = model.evaluate(x_test, y_test, batch_size=batch_size) print('Test score:', score) print('Test accuracy:', acc) ``` 在这个示例中,我们使用了`keras`库来加载路透社数据集,对数据进行预处理,定义并训练了一个包含一个嵌入层、两个LSTM层和一个全连接层的长短期记忆模型,并对模型进行了评估。 具体来说,我们首先加载了路透社数据集,并对数据进行了预处理,使得每篇文章的长度都不超过200个单词。然后,我们定义了一个包含一个嵌入层、两个LSTM层和一个全连接层的长短期记忆模型。其中,嵌入层将词汇表中的每个单词映射为一个128维的词向量,LSTM层将这些词向量序列作为输入,经过一系列的LSTM单元进行处理,最后输出一个64维的向量,全连接层将这个向量映射为路透社数据集中的20个类别之一。最后,我们使用`adam`优化器和`categorical_crossentropy`损失函数来编译模型,并使用训练集对模型进行训练,并在测试集上对模型进行评估。 需要注意的是,由于路透社数据集是一个多分类问题,因此我们使用了`categorical_crossentropy`损失函数来训练模型,并使用`accuracy`度量指标来评估模型的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值