Paddle使用半监督式学习完成语句分类

本项目基于PaddlePaddle使用半监督学习进行语句分类,涵盖数据处理、网络搭建和模型训练。通过有标签数据训练网络,对无标签数据进行推理并设定阈值,创建伪标签,迭代训练提升模型性能。
摘要由CSDN通过智能技术生成

项目说明,本项目是李宏毅老师在飞桨授权课程的作业解析
课程 传送门
该项目AiStudio项目 传送门
数据集 传送门

本项目仅用于参考,提供思路和想法并非标准答案!请谨慎抄袭!

语句分类——半监督学习

三岁出品,必是精品!
温馨提示时间很长建议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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三岁学编程

感谢支持,更好的作品会继续努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值