新闻单标签多分类

from keras.datasets import reuters
import numpy as np
训练数据,训练标签,测试数据,测试标签,8982个训练样本,2246个测试样本
# 这个是新闻单标签多分类问题,就是每个样本会被贴上一个标签,如果是贴多个,就是多标签多分类
# start_char=1,进入新的一篇新闻的标志, oov_char=2,只映射最常用的1万字,超出范围的映射2,
#index_from=3,真正有意义的单词是从索引3开始的,46个类别
(train_data,train_label),(test_data,test_lable)=reuters.load_data(num_words=10000)
#单词对应数字的字典
w_inx=reuters.get_word_index()
#新字典,数字对应单词
# rsw_inx={val:key for (key,val) in w_inx.items()}
rsw_inx=dict([(val,key) for (key,val) in w_inx.items()])
#为啥索引-3,因为它的0,1,2索引是'padding,start of sequence,unknown',
# 翻译成白话就是如果电脑读到1,她就知道这是一篇新的新闻,读到2,就知道这个单词不在1万个常用字之内
#单词和单词之间有空格,应该就是padding,根据数字映射单词,前两个单词应该是人名,不在1万常用字里面
decoded_newswire=''.join([rsw_inx.get(i-3,'?') for i in train_data[0][:20]])
def vect_sequences(seqs,dimension=10000):
    #初始化行为新闻样本数,列为常用的1万个单词
    # 如果是训练数据,形状是(8982,10000),默认元素是0
    res=np.zeros(shape=(len(seqs),dimension))
#     print(enumerate(seqs))
    #遍历所有新闻样本
    #seq是遍历的每一个新闻样本,现在脑子中一定要把新闻
    #这个东西当成一个数字列表,程序员就是翻译家,我们
    #在处理实际问题时要抽象化为数字,这样电脑看起来是很爽的
    # 在给人看的时候是把抽象的数字具体化了,这个方法得作用
    # 就是让电脑知道,一篇新闻里都出现了哪些字
    # 不同的新闻出现的字是不一样的,而我们给的答案(标签)
    # 不一样,这样电脑就会根据输入x,输出y来拟合f,拟合的好坏
    # 是比较真实答案和预测答案的误差,越大越糟糕
    for i,seq in enumerate(seqs):
#         print(len(seq),[rwindex.get(i) for i in seq])
#         print(i,seq)
        # 当前新闻里有某个单词,那这个单词对应的数字列会被赋值1
        #当前新闻没出现的字符是0,1代表Ture
        res[i,seq]=1
    return res
#训练集8982个样本,10000代表10000个常用单词
#一行代表一条新闻
x_train=vect_sequences(train_data)
x_test=vect_sequences(test_data)
display(x_train.shape)
a=rsw_inx.get(1)
b=''.join([rsw_inx.get(i-3,'?') for i in train_data[0]])
display(a,b)
from keras.utils import to_categorical
one_hot_train_labels=to_categorical(train_label)
one_hot_test_labels=to_categorical(test_lable)

from keras import models
from keras import layers
model=models.Sequential()
#128个神经元,隐层一,激活函数relu,10000,单个新闻样本的特征列
# 如果这一列是1,代表出现了某个单词,0,代表没出现这个单词
model.add(layers.Dense(128,activation='relu',input_shape=(10000,)))
#128个神经元,隐层二,激活函数relu
model.add(layers.Dense(128,activation='relu'))
#46分类,所以是46个神经元,softmax处理多分类,经过softmax函数作用后
# 使得某个新闻属于这46类中每个的概率总和等于1
model.add(layers.Dense(46,activation='softmax'))
model.summary()# (10000+1)*128,(128+1)*128,(128+1)*46
# 参数:优化器,rmsprop一阶导,之后做个调和平均放在分母位置,loss多元分类交叉,accuracy看它预估的正确率
#分类问题,不要用mse平方差公式,因为梯度太平坦,要用logi回归的交叉乘
model.compile(optimizer='RMSProp',loss='categorical_crossentropy',metrics=['acc'])
#如果对train(test)_label没做one_hot_encode,可以这样写sparse_categorical_crossentropy
model.compile(optimizer='RMSProp',loss='sparse_categorical_crossentropy',metrics=['acc'])
#验证集,索引0-999,对y先做one_hot_encode编码
#之后再切片,不然会很麻烦
yzj_x=x_train[:1000]
yzj_y=one_hot_train_labels[:1000]
#测试集
csj_x=x_train[1000:]
csj_y=one_hot_train_labels[1000:]
#validation_data验证和测试一起
history=model.fit(csj_x,csj_y,epochs=20,batch_size=512,validation_data=(yzj_x,yzj_y))
import matplotlib.pyplot as plt
#过拟合,太想拟合训练资料,所以在拟合新资料时就有很大偏差
xl_loss=history.history['loss']
xl_zql=history.history['acc']
yz_loss=history.history['val_loss']
yz_zql=history.history['val_acc']
epochs=range(1,1+len(xl_loss))
plt.figure(figsize=(20,9))
plt.rcParams['font.size']=18
ax1=plt.subplot(121)
ax1.plot(epochs,xl_loss,'b',label='xl_loss')
ax1.plot(epochs,yz_loss,'bo',label='yz_loss')
ax1.set_xlabel('epochs')
ax1.set_ylabel('loss')
plt.legend()
plt.title('xl_loss, yz_loss')
ax2=plt.subplot(122)
ax2.plot(epochs,xl_zql,'r',label='xl_zql')
ax2.plot(epochs,yz_zql,'ro',label='yz_zql')
plt.title('xl_zql,yz_zql')
plt.legend()
plt.show()
np.argmin(yz_loss)# 索引5,就是第6次val_loss最小
# 根据上面的训练验证,可以看到第6次迭代,val_loss最小,这次拿
#所有训练数据来跑
model=models.Sequential()
#128个神经元,隐层一,激活函数relu,10000,单个新闻样本的特征列
# 如果这一列是1,代表出现了某个单词,0,代表没出现这个单词
model.add(layers.Dense(128,activation='relu',input_shape=(10000,)))
#128个神经元,隐层二,激活函数relu
model.add(layers.Dense(128,activation='relu'))
#46分类,所以是46个神经元,softmax处理多分类,经过softmax函数作用后
# 使得某个新闻属于这46类中每个的概率总和等于1
model.add(layers.Dense(46,activation='softmax'))
model.compile(optimizer='RMSProp',loss='categorical_crossentropy',metrics=['acc'])
model.fit(x_train,one_hot_train_labels,epochs=6,batch_size=512)
#评估,results返回损失和准确率
results=model.evaluate(x_test,one_hot_test_labels)
#会获得模型对某条新闻属于那一类的概率
#最后一层46个神经元每个预估的概率,总和肯定是1
np.set_printoptions(suppress=True)
pre=model.predict(x_test)
print(np.sum(pre[0]),np.argmax(pre[0]))
np.set_printoptions(suppress=True)
#模型预测的类别
pre_class=np.array([np.argmax(i) for i in pre])
pre_class
#真实类别
test_lable
import pandas as pd
#交叉表
pd.crosstab(index=test_lable,columns=pre_class,rownames=['True_Label'],colnames=['predict_label'])
from sklearn.metrics import classification_report
# 准确率,召回率 support提供的样本,样本资料少,电脑也不知道怎么分
#准确率是电脑预估是几,真的是几的概率
#召回率是真的是几,电脑预估是几的概率
print(classification_report(test_lable,pre_class))
test_copy=test_lable.copy()
display(test_copy[:5])
#随机瞎蒙
np.random.shuffle(test_copy)
display(test_copy[:5])
np.sum(test_copy==test_lable)/len(test_lable)
arr=np.arange(18)
display(arr)
np.random.shuffle(arr)
display(arr)
# 如果不是特别原因,不要某一层神经元突然大幅度减少,会降低验证准确率,降到0.7680
# 之前0.8多
model2=models.Sequential()
#128个神经元,隐层一,激活函数relu,10000,单个新闻样本的特征列
# 如果这一列是1,代表出现了某个单词,0,代表没出现这个单词
model2.add(layers.Dense(128,activation='relu',input_shape=(10000,)))
#10个神经元,隐层二,激活函数relu
model2.add(layers.Dense(10,activation='relu'))
#46分类,所以是46个神经元,softmax处理多分类,经过softmax函数作用后
# 使得某个新闻属于这46类中每个的概率总和等于1
model2.add(layers.Dense(46,activation='softmax'))
model2.compile(optimizer='RMSProp',loss='categorical_crossentropy',metrics=['acc'])
model2.fit(csj_x,csj_y,epochs=20,batch_size=256,validation_data=(yzj_x,yzj_y))
#评估,results返回损失和准确率
results=model2.evaluate(x_test,one_hot_test_labels)

### 回答1: 基于CNN的新闻文本多标签分类算法研究与实现是一项研究如何使用卷积神经网络(CNN)来对新闻文本进行多标签分类的工作。该算法可以自动地将新闻文本分类到多个标签中,从而提高了分类的准确性和效率。该算法的实现需要对CNN的原理和技术进行深入研究,并结合实际的数据集进行训练和测试。该算法的研究和实现对于提高新闻分类的准确性和效率具有重要的意义。 ### 回答2: 近年来,随着互联网和社交媒体的普及,新闻报道数量不断增加,并且涉及到的话题越来越广泛复杂。因此,对新闻进行多标签分类(Multi-label Classification)成为一项重要的挑战。在传统文本分类方法中,往往只能将文本划分为标签,无法解决多标签分类问题。而基于卷积神经网络(CNN)的新闻文本多标签分类算法,则成为目前比较有效的解决方案之一。 基于CNN的新闻文本多标签分类算法的实现主要分为以下几个步骤: 1. 数据预处理:对新闻文本进行分词、停用词过滤、词干提取等操作,将文本转化为固定长度的向量形式。 2. 构建CNN模型:将文本向量作为CNN的输入,通过卷积层和池化层进行特征提取,再通过全连接层进行分类预测,最终输出多个不同的标签。 3. 模型训练:采用标准的反向传播算法,通过最小化损失函数的方式对模型进行训练。 4. 模型评估:使用评估指标(如准确率、宏平均F1、微平均F1等)对训练的模型进行评估。 在实际应用中,基于CNN的新闻文本多标签分类算法可以广泛应用于新闻推荐、舆情分析、文本智能分类等领域。同时,该算法也存在一些问题,如需要标记大量数据、模型容易过拟合等。因此,未来还需要继续进行深入的研究和改进。 总之,基于CNN的新闻文本多标签分类算法是目前比较有效的解决方案之一,可以帮助人们更加准确、高效地管理和浏览海量的新闻数据。 ### 回答3: 随着互联网技术的发展,新闻信息的数量呈现井喷式增长,如何利用新技术对这些海量新闻信息进行自动化处理成为了亟待解决的问题。其中,一项重要的任务便是新闻文本的多标签分类。为此,本文将介绍基于卷积神经网络(CNN)的新闻文本多标签分类算法研究与实现。 1. CNN的工作原理与应用 卷积神经网络是一种深度学习模型,最早应用于图像识别领域。其基本工作原理是:通过卷积核对输入的信号进行滑动窗口的卷积操作,从而提取出突出的特征信息,并依次经过多层卷积层、池化层和全连接层的处理,最终输出分类结果。 近几年,CNN在文本分类领域的研究也取得了许多成果。其常见的应用包括情感分类、垃圾邮件识别、事件检测等。此外,CNN还被用于新闻文本的多标签分类任务,成为了一种有效的解决方案。 2. 新闻文本多标签分类任务的定义与挑战 新闻文本多标签分类任务,是指对一篇新闻进行多个标签的判别,通常标签数量较多,常见的标签包含标题、摘要、正文、时间、地点等信息。挑战在于如何对这些标签进行有效的抽取和表示,保证高质量的分类结果。 3. 基于CNN的新闻文本多标签分类算法 具体而言,该算法主要分为以下几个步骤: (1)文本预处理:将原始文本分词、停用词过滤、去除非中文字符等操作,将其转化为数字表示的向量; (2)卷积层处理:将预处理后的文本数据作为输入,进行卷积操作并提取特征信息,得到多维特征向量; (3)池化层处理:通过对卷积层输出进行池化操作,压缩特征向量的维度减少计算负担; (4)全连接层处理:对池化层提取的特征向量进行全连接操作,进一步提取新的特征信息并完成标签的判别; (5)模型训练:使用大量标注数据进行模型的训练,使其可以准确地完成标签的分类; (6)模型评估:通过测试集对训练好的模型进行性能评估,包括准确率、召回率、F1分数等指标。 该算法的优点在于可以充分利用文本中的局部特征,有效降低文本分类的计算复杂度,同时在标签数量较多的情况下也能有较好的表现。 4. 结论 基于CNN的新闻文本多标签分类算法是一种有效的解决方案,可以实现高效、准确、自动化地对海量新闻信息进行分类处理,是新闻领域中不可缺少的技术之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值