Paddle使用半监督式学习完成语句分类
本项目仅用于参考,提供思路和想法并非标准答案!请谨慎抄袭!
语句分类——半监督学习
三岁出品,必是精品!
温馨提示时间很长建议GPU模型!
语句分类——监督式学习 (只使用training_label.txt进行学习)
项目简介:
李宏毅老师课程配套作业,应大家要求把作业进行一个梳理,老规矩全流程全代码注释加解析!(由于对半监督式学习不是非常理解,内容仅供参考!!!)
顺序说明:
1、建立字典,确保每一个词都有其对应的值!
2、对有进行处理:先转换为词典对应值,然后扩充数据。转换为paddle Tensor。
3、对无标签数据进行处理:先转换为词典对应值,然后扩充数据。
4、网络搭建
5、训练数据
6、测评
7、推理
半监督原理(个人理解):
首先设置阈值:作为评定标准。(待用)
1、先对第一组数据(有标签的原始数据)进行学习。
2、学习结束以后对无标签数据进行推理
3、判断推理结果是否超过阈值
超过阈值就假设为正确给予(伪标签)
4、在无标签数据中删除超过阈值的数据
5、添加伪正确数据和伪标签到原始训练集
6、原始训练集出现整理打包
7、继续下一步训练。
学习指南
除了课程还可以参考《零基础实践深度学习第六章:情感分析文本情感倾向性分析》传送门
项目描述
- 本次作业是要让同学接触自然语言处理当中一个简单的任务 —— 语句分类(文本分类)
- 给定一个语句,判断他有没有恶意(负面标 1,正面标 0)
数据集介绍
有三个文件,分别是 training_label.txt、training_nolabel.txt、testing_data.txt
-
training_label.txt:有标签的训练数据(句子配上 0 or 1,+++$+++ 只是分隔符号,不要理它)
- e.g., 1 +++$+++ are wtf … awww thanks !
-
training_nolabel.txt:没有标签的训练数据(只有句子),用来做半监督学习
- ex: hates being this burnt !! ouch
-
testing_data.txt:你要判断测试数据里面的句子是 0 or 1
id,text
0,my dog ate our dinner . no , seriously … he ate it .
1,omg last day sooon n of primary noooooo x im gona be swimming out of school wif the amount of tears am gona cry
2,stupid boys … they ’ re so … stupid !
项目要求
- 用一些方法 pretrain 出 word embedding (e.g., skip-gram, CBOW. )
- 请使用 RNN 实现文本分类
- 不能使用额外 data (禁止使用其他 corpus 或 pretrained model)
数据准备
无
环境配置/安装
监督式学习 (只使用training_label.txt进行学习)
数据处理!
import paddle
import numpy as np
import matplotlib.pyplot as plt
import paddle.nn as nn
import os
import random
import numpy as np
print(paddle.__version__) # 查看当前版本
2.0.1
# ! unzip -oq /home/aistudio/data/data78806/语句分类.zip
data = open('语句分类/training_nolabel.txt')
for i in data:
print(i)
print(i.split('+++$+++'))
print(i.replace('\n', '').split(' '))
print(i.split(' ')[0])
print(i.split('+++$+++')[-1].replace('\n', '').split(' '))
break
mkhang mlbo . dami niang followers ee . di q rin naman sia masisisi . desperate n kng desperate , pero dpt tlga replyn nia q = d
['mkhang mlbo . dami niang followers ee . di q rin naman sia masisisi . desperate n kng desperate , pero dpt tlga replyn nia q = d\n']
['mkhang', 'mlbo', '.', 'dami', 'niang', 'followers', 'ee', '.', 'di', 'q', 'rin', 'naman', 'sia', 'masisisi', '.', 'desperate', 'n', 'kng', 'desperate', ',', 'pero', 'dpt', 'tlga', 'replyn', 'nia', 'q', '=', 'd']
mkhang
['mkhang', 'mlbo', '.', 'dami', 'niang', 'followers', 'ee', '.', 'di', 'q', 'rin', 'naman', 'sia', 'masisisi', '.', 'desperate', 'n', 'kng', 'desperate', ',', 'pero', 'dpt', 'tlga', 'replyn', 'nia', 'q', '=', 'd']
字典生成
def open_label(data_path): # 打开文件并读取数据
'''
这里读取'label'
'''
dict_set = set() # 新建一个集合(内容不可重复)
with open(data_path, 'r', encoding='utf-8') as f: # 读取数据到f
for line in f.readlines(): # 逐行获取f的内容
# print(1)
title = line.split('+++$+++')[-1].replace('\n', '').split(' ') # 此处效果查看上一个code
for s in title[1:]: # 循环内容
dict_set.add(s) # 数据存入集合
# print(dict_set)
print(f'{data_path}数据读取完毕')
return dict_set
def open_nolabel(data_path): # 打开文件并读取数据
'''
这里读取‘nolabel’
'''
dict_set = set() # 新建一个集合(内容不可重复)
with open(data_path, 'r', encoding='utf-8') as f: # 读取数据到f
for line in f.readlines(): # 逐行获取f的内容
# print(1)
title = line.split('+++$+++')[-1].replace('\n', '').split(' ') # 此处效果查看上一个code
for s in title: # 循环内容
dict_set.add(s) # 数据存入集合
# print(dict_set)
print(f'{data_path}数据读取完毕')
return dict_set
def open_data(data_path): # 打开文件并读取数据
dict_set = set() # 新建一个集合(内容不可重复)
with open(data_path, 'r', encoding='utf-8') as f: # 读取数据到f
for line in f.readlines(): # 逐行获取f的内容
# print(1)
title = line.replace(',', ' ').replace('\n', '').split(' ')
for s in title[1:]: # 循环内容
dict_set.add(s) # 数据存入集合
# print(dict_set)
print(f'{data_path}数据读取完毕')
return dict_set
def create_dict(label_path, nolabel_path, data_path, dict_path):
'''
把数据生成字典
'''
print('正在读取数据……')
label_data = open_label(label_path) # 读取数据
nolabel_data = open_nolabel(nolabel_path)
data_data = open_data(data_path)
dict_set = label_data | nolabel_data | data_data # 使用并集获得数据
print('正在生产字典……')
dict_list = [] # 新建一个空列表
i = 0
for s in dict_set: # 循环集合
dict_list.append([s, i]) # 存入集合并新建一个单独对应的数值
i += 1
dict_txt = dict(dict_list) # 强制转换成 字典
end_dict = {
"<unk>": i} # 添加未知字符<unk>
dict_txt.update(end_dict) # 空字符数据存入
# 把这些字典保存到本地中
with open(dict_path, 'w', encoding='utf-8') as f:
f.write(str(dict_txt)) # 把字典存入文本
print