练习:NLP之文本分类---(1)Word2Vec+Conv2d+AG_news

目录

一、任务

二、思路

三、数据预处理

四、建立模型

五、模型结果

六、报错及处理

1.Error: 'Tensor' object has no attribute 'lower'

2.Error: ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`


一、任务

  1. 数据为AG_news 新闻数据集标题文本
  2. word2vec进行词向量训练 并输入卷积模型
  3. 利用多种卷积核3*64、5*64、7*64来训练
  4. 最大池化转二维结构
  5. 将池化结果连接
  6. 全连接层分类---5类

二、思路

随手画的---后面模型按这个思路 单数换了参数 懒得画了 将就一下

三、数据预处理

  1. 标题文本清洗
  2. 标签one-hot
  3. 标题文本词向量word2vec 向量大小为12 不够补齐 多余截断
"""一、单词文本处理函数"""
#1.文本清理函数(大小写、去除标点、删除多余空格、首尾空格删除、以空格分词

def text_clearTitle_word2vec(text):
    text = text.lower()  					#将文本转化成小写
    text = re.sub(r"[^a-z]"," ",text)   	#替换非标准字符,^是求反操作。
    text = re.sub(r" +", " ", text) 		#替换多重空格
    text = text.strip()  					#取出首尾空格
    text = text + " eos"                 	#添加结束符
    text = text.split(" ")
    return text

#2.将标签转为one-hot格式函数
def get_label_one_hot(list):
    values = np.array(list)
    # print("values:",values)
    n_values = np.max(values) + 1
    # print(np.max(values))
    return np.eye(n_values)[values]

#3.获取训练集和标签函数
def get_word2vec_dataset(n = 12):
    #读取数据并完成预处理
    agnews_label = []
    agnews_title = []
    agnews_train = csv.reader(open("./dataset/train.csv", "r"))
    for line in agnews_train:
        agnews_label.append(np.int(line[0]))
        agnews_title.append(text_clearTitle_word2vec(line[1]))

    #建立word2vec模型
    model = word2vec.Word2Vec(agnews_title,vector_size=64,min_count=0,window=5)

    train_dataset = []
    for line in agnews_title:
        length = len(line)
        if length > n:
            line = line[:n]
            word2vec_matix = (model.wv[line])
            train_dataset.append(word2vec_matix)
        else:
            word2vec_matix = (model.wv[line])
            pad_length = n - length
            pad_matrix = np.zeros([pad_length,64])+1e-10
            word2vec_matix = np.concatenate([word2vec_matix,pad_matrix],axis=0)
            train_dataset.append(word2vec_matix)
    train_dataset = np.expand_dims(train_dataset,3)
    print(train_dataset.shape)
    print(train_dataset.ndim)

    label_dataset = get_label_one_hot(agnews_label)
    return train_dataset,label_dataset

四、建立模型

"""二、创建word2vec模型"""
#word2vec_CNN的模型
def word2vec_CNN():
    xs = tf.keras.Input(shape=(12,64,1))
    #设置卷积核大小为[3,64]通道为12的卷积计算
    conv_3 = tf.keras.layers.Conv2D(12,[3,64],activation=tf.nn.relu)(xs)
    #设置卷积核大小为[5,64]通道为12的卷积计算
    conv_5 = tf.keras.layers.Conv2D(12,[5,64],activation=tf.nn.relu)(xs)
    #设置卷积核大小为[7,64]通道为12的卷积计算
    conv_7 = tf.keras.layers.Conv2D(12,[7,64],activation=tf.nn.relu)(xs)
    #下面是分别对卷积计算的结果进行池化处理,将池化处理的结果转成二维结构
    conv_3_mean = tf.keras.layers.Flatten()(tf.reduce_max(conv_3,axis=1,keepdims=True))
    conv_5_mean = tf.keras.layers.Flatten()(tf.reduce_max(conv_5,axis=1,keepdims=True))
    conv_7_mean = tf.keras.layers.Flatten()(tf.reduce_max(conv_7,axis=1,keepdims=True))

    flatten = tf.concat([conv_3_mean,conv_5_mean,conv_7_mean],axis=1)
    fc_1 = tf.keras.layers.Dense(128,activation=tf.nn.relu)(flatten)
    logits = tf.keras.layers.Dense(5,activation=tf.nn.softmax)(fc_1)
    model = tf.keras.Model(inputs = xs, outputs = logits)
    return model

train_dataset,label_dataset = get_word2vec_dataset()
X_train,X_test,y_train,y_test = train_test_split(train_dataset,label_dataset,test_size=0.1,random_state=217)

batch_size = 12
train_data = tf.data.Dataset.from_tensor_slices((X_train,y_train)).batch(batch_size)
model = word2vec_CNN()
model.compile(optimizer = tf.optimizers.Adam(1e-3),loss = tf.losses.categorical_crossentropy,metrics=['accuracy'])
model.fit(train_data,epochs=10)

五、模型结果

1.运行结果

score = model.evaluate(X_test,y_test)
print("score:",score)

2.可视化

history = model.fit(train_data,epochs=10)
history_dict = history.history
train_loss = history_dict["loss"]
train_accuracy = history_dict["accuracy"]


plt.figure()
plt.plot(range(10), train_loss, label='train_loss')
plt.legend()
plt.plot(range(10), train_accuracy, label='train_accuracy')
plt.legend()
plt.xlabel('epochs')
plt.ylabel('loss & accuracy')
plt.show()

六、报错及处理

1.Error: 'Tensor' object has no attribute 'lower'

1)前后代码:

    xs = tf.keras.Input(shape=(12,64,1))
    #设置卷积核大小为[3,64]通道为12的卷积计算
    conv_3 = tf.keras.layers.Conv2D(12,[3,64],activation=tf.nn.relu)(xs)
    #设置卷积核大小为[5,64]通道为12的卷积计算
    conv_5 = tf.keras.layers.Conv2D(12,[5,64],activation=tf.nn.relu)(xs)
    #设置卷积核大小为[7,64]通道为12的卷积计算
    conv_7 = tf.keras.layers.Conv2D(12,[7,64],activation=tf.nn.relu)(xs)
    #下面是分别对卷积计算的结果进行池化处理,将池化处理的结果转成二维结构
    conv_3_mean = tf.keras.layers.Flatten()(tf.reduce_max(conv_3,axis=1,keepdims=True))
    conv_5_mean = tf.keras.layers.Flatten()(tf.reduce_max(conv_5,axis=1,keepdims=True))
    conv_7_mean = tf.keras.layers.Flatten()(tf.reduce_max(conv_7,axis=1,keepdims=True))

2)报错行:

conv_3_mean = tf.keras.layers.Flatten(tf.reduce_max(conv_3,axis=1,keepdims=True))

3)修改:

 参考:python - 'Tensor' object has no attribute 'lower' - Stack Overflow

conv_3_mean = tf.keras.layers.Flatten()(tf.reduce_max(conv_3,axis=1,keepdims=True))

2.Error: ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`

1)问题:Dense层在输入的时候,需要定义shape/size

2)解决:在tf.keras.Input层定义shape---不要用None

# xs = tf.keras.Input([None, None])
xs = tf.keras.Input(shape=(12,64,1))
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Word2Vec和TextCNN进行情感分析的方法如下: 1.数据预处理:首先,需要将原始文本数据进行预处理。包括去除停用词、标点符号等,统一转换为小写字母形式。然后,根据数据集的标签,将文本数据划分为正面和负面两类。 2.Word2Vec嵌入:使用Word2Vec文本数据转换为向量表示。通过训练密集向量,将每个词表示为一个固定长度的向量。可以使用Gensim库中的Word2Vec模型来实现。 3.构建TextCNN模型:使用卷积神经网络(CNN)进行情感分类。TextCNN模型是一种常用的文本分类模型,它通过卷积层和池化层来提取特征并进行分类。可以使用Tensorflow或Keras等框架来构建TextCNN模型。 4.训练模型:将预处理后的数据集分为训练集和测试集,然后使用训练集来训练TextCNN模型。训练过程中,输入文本数据经过Word2Vec嵌入层,然后通过卷积层和池化层提取特征,最后进行情感分类。 5.评估模型:使用测试集评估模型的性能。可以使用准确率、精确率、召回率等指标来评估模型的效果。 6.模型优化:根据评估结果,可以对模型进行优化,如调整超参数、增加正则化、改变网络结构等,以提高模型性能。 7.应用模型:使用经过训练和优化的TextCNN模型对新的文本数据进行情感分类。 总结:使用Word2Vec文本数据转换为向量表示,结合TextCNN模型进行情感分析可以提高文本分类的性能。同时,通过模型的评估和优化,可以进一步提高模型的准确性和泛化能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值