基于pytorch使用BI-LSTM模型做中文文本分类

基于pytorch使用BI-LSTM模型做中文文本分类

主要涉及使用pandas从csv文件读取文本数据,将dataframe格式数据转为torch iteration 输出模型训练和预测。

import pandas as pd 
import numpy as np
import re
import torch.utils.data as data_utils
import torch
from torchtext.legacy import data 
from torchtext.legacy import datasets,vocab
from tqdm import tqdm
from torch import nn
1.读取数据与预处理

数据格式为csv,按逗号分隔,主要分为complain_content、label两列,其中complain_content为分词后的中文文本。

df = pd.read_csv("/home/jovyan/work/NLP/kesu_cate/data/kesu_clean_data.csv",encoding='utf-8')
df["complain_content"] = df["complain_content"].apply(lambda x : ' '.join(x.replace('[','').replace(']','').replace("'",'').replace(' ','').split(',')))  #
df["label"] = df["label"].astype(float)

#划分训练集、测试集、验证集
from sklearn.model_selection import train_test_split
train_data,test_data= train_test_split(df,test_size = 0.2,random_state = 1024)
train_data,valid_data= train_test_split(train_data,test_size = 0.2,random_state = 1024)
2.使用torchtext处理dataframe数据,并生成词典,并创建iteration
tokenize=lambda x:x.split(' ')
TEXT=data.Field(tokenize=tokenize,sequential=True)
LABEL=data.Field(sequential=False, use_vocab=False)

#数据处理类
class DatasetProcess(data.Dataset):
    def __init__(self,df,text_tield,label_field):
        fields=[('complain_content',text_tield),("label",label_field)]
        examples=[]
        for text , label in tqdm(zip(df['complain_content'], df['label'])):
            examples.append(data.Example.fromlist([text, label], fields)) 
        super(DatasetProcess,self).__init__(examples,fields)

train_data = DatasetProcess(train_data,TEXT,LABEL)
valid_data = DatasetProcess(valid_data,TEXT,LABEL)
test_data = DatasetProcess(test_data,TEXT,LABEL)

#加载腾讯NLP预训练结果 并建立词典
vectors = vocab.Vectors(name='/home/jovyan/work/NLP/pytoch/.vector_cache/tencent-ailab-embedding-zh-d100-v0.2.0-s/tencent-ailab-embedding-zh-d100-v0.2.0-s.txt')
TEXT.build_vocab(train_data,max_size=25000,vectors=vectors,unk_init=torch.Tensor.normal_)
LABEL.build_vocab(train_data)


train_iter,valid_iter,test_iter=data.BucketIterator.splits(
    (train_data,valid_data,test_data),
    batch_size=256,
    device='cpu',
    sort_key=lambda x: len(x.complain_content),
    sort_within_batch=False,
    repeat=False
)
3.构建BI-LSTM模型
#初始化参数
vocab_size = len(TEXT.vocab)
embedding_size = 100
output_size = 1
num_layers = 2 
dropout = 0.3 
pad_idx = TEXT.vocab.stoi[TEXT.pad_token]
hidden_size = 100
device = 'cpu'

#定义模型
class RNNModel(nn.Module):
    def __init__(self,vocab_size,embedding_size,output_size,hidden_size,num_layers,dropout,pad_idx):
        super(RNNModel,self).__init__()
        self.embed = nn.Embedding(vocab_size,embedding_size,padding_idx=pad_idx)
        self.lstm = nn.LSTM(embedding_size,hidden_size,bidirectional=True,num_layers=num_layers)
        self.linear = nn.Linear(hidden_size * num_layers,output_size)
        self.dropout = nn.Dropout(dropout)
        
    def forward(self,text):
        embeded = self.embed(text)
        embeded = self.dropout(embeded)
        output,(hidden,cell) = self.lstm(embeded)
        hidden = self.dropout(hidden.squeeze())
        hidden = torch.cat([hidden[-1],hidden[-2]],dim=1)
        return self.linear(hidden)

#定义评价函数和训练验证函数
def binary_accuracy(preds,y):
    rounded_preds = torch.round(torch.sigmoid(preds))
    correct = (rounded_preds == y).float()
    acc = correct.sum()/len(correct)
    return acc

def train(model,iterator,optimizer,crit):
    epoch_loss,epoch_acc = 0.,0.
    model.train()
    total_len = 0. 
    for batch in iterator:
        preds = model(batch.complain_content).squeeze()
        loss = crit(preds,batch.label.float())
        acc = binary_accuracy(preds,batch.label)
        
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        
        epoch_loss += loss.item() * len(batch.label)
        epoch_acc += acc.item() * len(batch.label)
        total_len += len(batch.label)
        print(epoch_loss,epoch_acc,len(batch.label))
    return epoch_loss / total_len,epoch_acc/total_len

def evaluate(model,iterator,crit):
    epoch_loss,epoch_acc = 0.,0.
    model.eval()
    total_len = 0. 
    for batch in iterator:
        preds = model(batch.complain_content).squeeze()
        loss = crit(preds,batch.label.float())
        acc = binary_accuracy(preds,batch.label)
        
        epoch_loss += loss.item() * len(batch.label)
        epoch_acc += acc.item() * len(batch.label)
        total_len += len(batch.label) 
    model.train()
    return epoch_loss / total_len,epoch_acc/total_len


model = RNNModel(vocab_size,embedding_size,output_size,hidden_size,num_layers,dropout,pad_idx)

#初始化模型参数
pretrained_embedding = TEXT.vocab.vectors
model.embed.weight.data.copy_(pretrained_embedding)
unk_idx = TEXT.vocab.stoi[TEXT.unk_token]
model.embed.weight.data[pad_idx] = torch.zeros(embedding_size)
model.embed.weight.data[unk_idx] = torch.zeros(embedding_size)


#训练模型
n_epoch = 10 
best_valid_acc = 0. 
for epoch in range(n_epoch):
    train_loss,train_acc = train(model,train_iter,optimizer,crit)
    valid_loss,valid_acc = evaluate(model,valid_iter,crit)
    
    if valid_acc > best_valid_acc:
        best_valid_acc = valid_acc
        torch.save(model.state_dict(),'lstm_model_cn.pth')
    print("Epoch",epoch,"Train loss",train_loss,"Train Acc",train_acc)
    print("Epoch",epoch,"valid_loss",valid_loss,"valid Acc",valid_acc)



#测试模型
def removepad(arr):
    res = []
    for x in arr:
        if x != '<pad>':
            res.append(x)
    return res

def predict(test_iter):
    with torch.no_grad():
        for batch in test_iter:
            pred = torch.sigmoid(model(batch.complain_content))
            for i in range(len(batch.label)):
                index = batch.complain_content.t()[i]
                tmp = [TEXT.vocab.itos[x] for x in index]
                seq = ' '.join(removepad(tmp))
                
                print(pred[i].item(),seq)
参考链接

1.torchtext数据预处理:https://www.jianshu.com/p/8e891bdca78a
2.腾讯预训练词向量链接:https://ai.tencent.com/ailab/nlp/zh/download.html
3.加载教程:https://blog.csdn.net/nlpuser/article/details/83627709

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
开题报告:基于PyTorch的OCR文字识别 摘要: 随着数字化时代的到来,大量的文本数据需要被处理和存储。因此,文字识别(OCR)成为一项非常重要的任务。本文将基于PyTorch实现OCR文字识别的系统,该系统将利用卷积神经网络(CNN)和长短期记忆网络(LSTM)等深度学习模型实现高效准确的文字识别。 研究目的: 本研究旨在利用深度学习技术构建一个基于PyTorch的OCR文字识别系统,能够自动识别印刷体或手写体的文本,并输出正确的文字结果。 研究内容: 本研究的主要内容包括以下几个方面: 1. 数据集准备:本研究将采用MNIST、SVHN和CIFAR-10等公开数据集以及自己收集的手写数字和字母图像作为训练集和测试集。 2. 模型设计:本研究将基于卷积神经网络和长短期记忆网络,设计一个端到端的文字识别模型。其中,卷积神经网络用于提取图像特征,长短期记忆网络则用于学习序列信息。同时,本研究还将尝试一些模型优化技巧,如批量归一化、dropout等。 3. 模型训练:本研究将使用PyTorch框架,利用GPU加速,对设计好的模型进行训练。本研究将使用交叉熵损失函数,并采用Adam优化器进行参数优化。 4. 模型评估:本研究将采用准确率、F1分数等指标来评估所设计的OCR文字识别系统的性能。 5. 实验分析:本研究将对所设计的OCR文字识别系统进行实验分析,包括不同数据集的识别效果比较、不同网络结构的性能分析等。 预期成果: 本研究预期能够设计一个高效准确的OCR文字识别系统,并通过实验验证其性能。本研究的成果将有助于解决现实生活中的文本识别问题,如自动化文字识别、图书数字化等。 参考文献: [1] Shi, B., Bai, X., & Yao, C. (2017). An end-to-end trainable neural network for image-based sequence recognition and its application to scene text recognition. IEEE Transactions on Pattern Analysis and Machine Intelligence, 39(11), 2298-2304. [2] Gao, Y., Liu, X., &

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值