Paddle使用监督式学习完成语句分类
本项目仅用于参考,提供思路和想法并非标准答案!请谨慎抄袭!
语句分类——监督式学习 (只使用training_label.txt进行学习)
三岁出品,必是精品!
项目简介:
李宏毅老师课程配套作业,应大家要求把作业进行一个梳理,老规矩全流程全代码注释加解析!
学习指南
除了课程还可以参考《零基础实践深度学习第六章:情感分析文本情感倾向性分析》传送门
项目描述
- 本次作业是要让同学接触自然语言处理当中一个简单的任务 —— 语句分类(文本分类)
- 给定一个语句,判断他有没有恶意(负面标 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)
数据准备
无
环境配置/安装
数据处理!
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_label.txt')
for i in data:
print(i.split('+++$+++'))
print(i.split(' ')[0])
print(i.split('+++$+++')[-1].replace('\n', '').split(' '))
break
['1 ', ' are wtf ... awww thanks !\n']
1
['', 'are', 'wtf', '...', 'awww', 'thanks', '!']
字典生成
def open_label(data_path): # 打开文件并读取数据
'''
这里数据读取适合与‘label’和‘nolabel’,因为data文件数据是标签 + 文本 读取出来的数据不正确
'''
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_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_label(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("数据字典生成完成!")
print(f'字典长度为:{len(dict_txt.keys())}')
return dict_txt
label_path = '语句分类/training_label.txt' # 把地址进行赋值
data_path = '语句分类/testing_data.txt'
nolabel_path = '语句分类/training_nolabel.txt'
dict_path = './dict.txt'
word_dict = create_dict(label_path, nolabel_path, data_path, dict_path