han_attention(双向GRU+attention)(imdb数据集---文档分类)


han_attention(双向GRU+attention)

在这里插入图片描述

词编码:
在这里插入图片描述
词级别的注意力机制:
在这里插入图片描述
句子编码:
在这里插入图片描述
句子级别的注意力机制:
在这里插入图片描述

一、文件目录

在这里插入图片描述

二、语料集

数据集: http://ir.hit.edu.cn/~dytang/paper/emnlp2015/emnlp-2015-data.7z

三、数据处理(IMDB_Data_Loader.py)

1.数据集加载(排序,分句)
2.读取标签和数据
3.创建word2id(源语言和目标语言)
   3.1统计词频
   3.2加入 pad:0,unk:1创建word2id
4.将数据转化成id(源语言和目标语言)
5.添加目标数据的输入(target_data_input)

from gensim.models import KeyedVectors
from torch.utils import data
import os
import torch
import numpy as np
class IMDB_Data(data.DataLoader):
    def __init__(self,data_name,min_count,word2id=None,max_sentence_length=100,batch_size=64,is_pretrain=True):
        self.path = os.path.abspath(".")
        if "data" not in self.path:
            self.path += "/data"
        self.data_name = "/imdb/"+data_name
        self.min_count = min_count
        self.word2id = word2id
        self.max_sentence_length = max_sentence_length
        self.batch_size =batch_size
        self.datas,self.labels = self.load_data()
        if is_pretrain:
            self.get_word2vec()
        else:
            self.weight = None
        for i in range(len(self.datas)):
            self.datas[i] = np.array(self.datas[i])

    # 数据集加载
    def load_data(self):
        datas = open(self.path+self.data_name,encoding="utf-8").read().splitlines()
        datas = [data.split("		")[-1].split() + [data.split("		")[2]] for data in datas]  # 取出数据并分词+标签
        # 根据长度排序
        datas = sorted(datas, key=lambda x: len(x), reverse=True)
        labels = [int(data[-1]) - 1 for data in datas]
        datas = [data[0:-1] for data in datas]
        if self.word2id == None:
            self.get_word2id(datas)
        # 分句
        for i, data in enumerate(datas):
            datas[i] = " ".join(data).split("<sssss>")
            for j, sentence in enumerate(datas[i]):
                datas[i][j] = sentence.split()
        datas = self.convert_data2id(datas)
        return datas,labels
        

    # word2id
    def get_word2id(self, datas):
        word_freq = {
   }
        for data in datas:
            for word in data:
                word_freq[word] = word_freq.get(word, 0) + 1
        word2id = {
   "<pad>": 0, "<unk>": 1}
        for word in word_freq:
            if word_freq[word] < self.min_count:
                continue
            else:
                word2id[word] =
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值