【AI创造营】网抑云选手等级鉴定器

  • 记录项目的过程与经历
    • 背景
    • 所用模型与体系
    • 项目地址
    • 使用的数据集
    • 不足之处与后期想法

记录项目的过程与经历

背景

前段时间看到百度有一个AI创造训练营,可以免费白嫖算力,尝试一下很久以前的想法,利用网易云热评做情感分析,对输入的语句进行乐观或悲观程度评级,我平时有收集一些有趣的评论,正好用上;

所用模型与体系

使用的paddlepadddle,padlenlp框架上的lstm网络来做情感分析,后期再用bert尝试一下看效果对比

项目地址

点进去后用百度云账号登录,就可以使用百度的资源,点击右上角的运行一下就可以进行代码修改或效果应用,欢迎大家点击试用
链接: link.

https://aistudio.baidu.com/aistudio/projectdetail/1687287?channelType=0&channel=0

图片

##代码片

代码片段.

// An highlighted block#引用需要的库
import paddle
import paddlenlp
import numpy as np
from functools import partialimport paddle.nn as nn
import paddle.nn.functional as F
import paddlenlp as ppnlp
from paddlenlp.data import Pad, Stack, Tuple
from paddlenlp.datasets import MapDatasetWrapper
from utils import load_vocab, convert_example
class SelfDefinedDataset(paddle.io.Dataset):def __init__(self, data):super(SelfDefinedDataset, self).__init__()self.data = datadef __getitem__(self, idx):return self.data[idx]def __len__(self):return len(self.data)def get_labels(self):return ["0", "1"]def txt_to_list(file_name):res_list = []for line in open(file_name):res_list.append(line.strip().split('\t'))return res_listtrainlst = txt_to_list('train.txt')
devlst = txt_to_list('dev.txt')
testlst = txt_to_list('test.txt')train_ds, dev_ds, test_ds = SelfDefinedDataset.get_datasets([trainlst, devlst, testlst])
label_list = train_ds.get_labels()
print(label_list)for i in range(10):print (train_ds[i])# 加载词表
vocab = load_vocab('./senta_word_dict.txt')
# 下载词汇表文件word_dict.txt,用于构造词-id映射关系。
!wget https://paddlenlp.bj.bcebos.com/data/senta_word_dict.txt
for k, v in vocab.items():print(k, v)# Reads data and generates mini-batches.
def create_dataloader(dataset,trans_function=None,mode='train',batch_size=1,pad_token_id=0,batchify_fn=None):if trans_function:dataset = dataset.apply(trans_function, lazy=True)# return_list 数据是否以list形式返回# collate_fn  指定如何将样本列表组合为mini-batch数据。传给它参数需要是一个callable对象,需要实现对组建的batch的处理逻辑,并返回每个batch的数据。在这里传入的是`prepare_input`函数,对产生的数据进行pad操作,并返回实际长度等。dataloader = paddle.io.DataLoader(dataset,return_list=True,batch_size=batch_size,collate_fn=batchify_fn)return dataloader# python中的偏函数partial,把一个函数的某些参数固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
trans_function = partial(convert_example,vocab=vocab,unk_token_id=vocab.get('[UNK]', 1),is_test=False)# 将读入的数据batch化处理,便于模型batch化运算。
# batch中的每个句子将会padding到这个batch中的文本最大长度batch_max_seq_len。
# 当文本长度大于batch_max_seq时,将会截断到batch_max_seq_len;当文本长度小于batch_max_seq时,将会padding补齐到batch_max_seq_len.
batchify_fn = lambda samples, fn=Tuple(Pad(axis=0, pad_val=vocab['[PAD]']),  # input_idsStack(dtype="int64"),  # seq lenStack(dtype="int64")  # label
): [data for data in fn(samples)]train_loader = create_dataloader(train_ds,trans_function=trans_function,batch_size=128,mode='train',batchify_fn=batchify_fn)
dev_loader = create_dataloader(dev_ds,trans_function=trans_function,batch_size=128,mode='validation',batchify_fn=batchify_fn)
test_loader = create_dataloader(test_ds,trans_function=trans_function,batch_size=128,mode='test',batchify_fn=batchify_fn)break
#搭建lastm模型
class LSTMModel(nn.Layer):def __init__(self,vocab_size,num_classes,emb_dim=128,padding_idx=0,lstm_hidden_size=198,direction='forward',lstm_layers=1,dropout_rate=0,pooling_type=None,fc_hidden_size=96):super().__init__()# 首先将输入word id 查表后映射成 word embeddingself.embedder = nn.Embedding(num_embeddings=vocab_size,embedding_dim=emb_dim,padding_idx=padding_idx)# 将word embedding经过LSTMEncoder变换到文本语义表征空间中self.lstm_encoder = ppnlp.seq2vec.LSTMEncoder(emb_dim,lstm_hidden_size,num_layers=lstm_layers,direction=direction,dropout=dropout_rate,pooling_type=pooling_type)# LSTMEncoder.get_output_dim()方法可以获取经过encoder之后的文本表示hidden_sizeself.fc = nn.Linear(self.lstm_encoder.get_output_dim(), fc_hidden_size)# 最后的分类器self.output_layer = nn.Linear(fc_hidden_size, num_classes)def forward(self, text, seq_len):# text shape: (batch_size, num_tokens)# print('input :', text.shape)# Shape: (batch_size, num_tokens, embedding_dim)embedded_text = self.embedder(text)# print('after word-embeding:', embedded_text.shape)# Shape: (batch_size, num_tokens, num_directions*lstm_hidden_size)# num_directions = 2 if direction is 'bidirectional' else 1text_repr = self.lstm_encoder(embedded_text, sequence_length=seq_len)# print('after lstm:', text_repr.shape)# Shape: (batch_size, fc_hidden_size)fc_out = paddle.tanh(self.fc(text_repr))# print('after Linear classifier:', fc_out.shape)# Shape: (batch_size, num_classes)logits = self.output_layer(fc_out)# print('output:', logits.shape)# probs 分类概率值probs = F.softmax(logits, axis=-1)# print('output probability:', probs.shape)return probsmodel= LSTMModel(len(vocab),len(label_list),direction='bidirectional',padding_idx=vocab['[PAD]'])
model = paddle.Model(model)
optimizer = paddle.optimizer.Adam(parameters=model.parameters(), learning_rate=5e-5)loss = paddle.nn.CrossEntropyLoss()
metric = paddle.metric.Accuracy()model.prepare(optimizer, loss, metric)
# 设置visualdl路径
log_dir = './visualdl'
callback = paddle.callbacks.VisualDL(log_dir=log_dir)
model.fit(train_loader, dev_loader, epochs=10, save_dir='./checkpoints', save_freq=5, callbacks=callback)
results = model.evaluate(dev_loader)
print("Finally test acc: %.5f" % results['acc'])
label_map = {0: '悲伤', 1: '积极'}
results = model.predict(test_loader, batch_size=128)[0]
predictions = []for batch_probs in results:# 映射分类labelidx = np.argmax(batch_probs, axis=-1)idx = idx.tolist()labels = [label_map[i] for i in idx]predictions.extend(labels)# 看看预测数据前5个样例分类结果
#for idx, data in enumerate(test_ds.data[:10]):
#    print('Data: {} \t Label: {}'.format(data[0], predictions[idx]))for i in range(len(results[0])):sad_level=results[0][i][0]/(results[0][i][0]+results[0][i][1])happy_level=results[0][i][1]/(results[0][i][0]+results[0][i][1])popele_level=int(-((-sad_level+happy_level)/2-0.5)*10)#print(popele_level)print('Data: {} \t 网抑云等级: {}'.format(test_ds.data[i], popele_level))

使用的数据集

不足之处与后期想法

一个简单的表格是这么创建的:该项目还有很多不足之处,比如训练集较少导致分级单一,模型拟合度不够等等,后期想将模型换成bert与enire,再多收集一些数据集参加训练,现在只有三百句数据集

【AI创造营】网抑云选手等级鉴定器相关推荐

  1. 【AI创造营】基于PaddleHub与Jetson Nano的智能宠物看护助手

    基于PaddleHub与Jetson Nano的智能宠物看护助手 一.效果展示 二.实现思路 1.训练一个适用于该需求的模型 2.使用PaddleHub预训练模型 三.数据采集 硬件部分 代码部分 四 ...

  2. Metaverse启动机之重构现世,AI创造营创意赛开启

    ibrandup @shadow 听说最近又有好玩的竞赛啦? Metaverse启动机 2021.7.9 AI创造营 创意赛正式发布 近日,由百度大脑AI Studio平台发布,PaddlePaddl ...

  3. “网抑云”,缺的是梗吗?

    点击"技术领导力"关注∆  每天早上8:30推送 来源:燃财经(ID:rancaijing) "到点了,上号." "网抑云时间,兄弟们给我哭.&quo ...

  4. 【AI创造营】决战二仙桥

    参赛作品名 [AI创造营]决战二仙桥(DodgeFace-EXQver) 作品简介 和前作DodgeFace操作方式一样,内部使用的技术换了:之前是ace2p,如果电脑配置不好的话,可能跑起来非常的卡 ...

  5. [AI创造营]Wechaty实用小工具---九宫图爱心生成器~

    [AI创造营]Wechaty实用小工具-九宫图爱心生成器~ 项目地址: https://aistudio.baidu.com/aistudio/projectdetail/2300569 背景 跟随抖 ...

  6. AI创造营来了!万元奖金、Switch等你来拿...

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 朋友,看青你和创了吗? 牛年最先牛起来的无疑是这两档选秀节目,100多位小哥哥轮番上阵,每个观众都能pick ...

  7. [AI创造营]Wechaty实用小工具---证件照助手

    [AI创造营]Wechaty实用小工具-证件照助手 项目地址: https://aistudio.baidu.com/aistudio/projectdetail/2253862 你是否苦恼于没有条件 ...

  8. 飞桨AI创造营2期-t3-数据处理

    飞桨AI创造营2期-数据处理 (Datawhale34期组队学习) 文章目录 飞桨AI创造营2期-数据处理 1知识点 2具体内容 2.1AI Studio Notebook命令 2.2Numpy基础 ...

  9. Python分析年度爆款“网抑云”热评,看看哪些文案触动了你的内心世界?

    点击上方"蓝字",发现更多精彩. 前段时间,"网抑云"这个词很火,尤其是到凌晨十二点,"网抑云"时间到,便有很多网友在网易云音乐上有感而发, ...

  10. 网抑云了是什么意思,网抑云语录有哪些,网抑云网抑云梗表情包

    最近经常上网的朋友会发现,有个很流行的网络用语"网抑云",那么究竟这个网抑云是什么意思呢,今天我们就一起来了解一下 首先"网抑云"是指网易加的产品"网 ...

最新文章

  1. 专题3 标准IO编程
  2. mysql1577_使用Navicat for MySQL的1577错误解决办法
  3. 面试之 Mysql 汇总
  4. 网站html标签如何优化,网站HTML标签优化教程
  5. 《微观经济学》博弈论入门:囚徒困境、智猪博弈、性别战、斗鸡博弈
  6. Kotlin 系列 之 Flow (一)
  7. 黑苹果10.15.1睡眠唤醒死机问题
  8. git format-patch命令介绍
  9. 腾讯AlloyTeam招募Web工程师(社招/校招/实习生)
  10. 顺序表的初始化、插入、删除、查找
  11. 程序人生--hello‘s P2P(From Program to Process)
  12. 北航计算机学院吉祥物,北航软件学院吉祥物征集令
  13. 自制嵌入式操作系统 DAY1
  14. 洛谷 1203 [USACO1.1]坏掉的项链Broken Necklace
  15. 直流有刷电机及Matlab/Simulink驱动仿真
  16. 职工工资管理系统程序
  17. C语言中如何引用其他c文件(以VScode演示)
  18. 2022-2027年中国家具电商市场竞争态势及行业投资前景预测报告
  19. redis数据同步至另一个redis
  20. 红米10android auto,红米note5刷魔趣Android10上手体验!这速度,我爱了!

热门文章

  1. java毕业设计鞋类秒杀商城Mybatis+系统+数据库+调试部署
  2. windows开机自启exe程序bat
  3. LightOJ - 1341 Aladdin and the Flying Carpet 唯一分解定理
  4. 支付宝支付对账单java_java下载支付宝对账单,实现与支付宝实收对账和日清日结对账...
  5. linux命令配置永久ip地址,Linux命令行永久修改IP地址、网关和DNS。
  6. 移动硬盘已连接USB但不显示盘符怎么办
  7. 《嵌入式系统原理与应用》 | 嵌入式系统 重点知识梳理
  8. 使用多线程爬取笔趣阁
  9. 免费注册 上传html,一些可以免费上传文件的网站
  10. 搭建机器人电控系统——通信协议——IIC通信原理及其实例(库函数+模拟IO口)