klearn 文本分类_文本分类 - hichens - 博客园

文本情感分类文本分类是自然语言处理的一个常见任务,它把一段不定长的文本序列变换为文本的类别。本节关注它的一个子问题:使用文本情感分类来分析文本作者的情绪。这个问题也叫情感分析,并有着广泛的应用。同搜索近义词和类比词一样,文本分类也属于词嵌入的下游应用。在本节中,我们将应用预训练的词向量和含多个隐藏层的双向循环神经网络与卷积神经网络,来判断一段不定长的文本序列中包含的是正面还是负面的情绪。后续内容将...
摘要由CSDN通过智能技术生成

文本情感分类

文本分类是自然语言处理的一个常见任务,它把一段不定长的文本序列变换为文本的类别。本节关注它的一个子问题:使用文本情感分类来分析文本作者的情绪。这个问题也叫情感分析,并有着广泛的应用。

同搜索近义词和类比词一样,文本分类也属于词嵌入的下游应用。在本节中,我们将应用预训练的词向量和含多个隐藏层的双向循环神经网络与卷积神经网络,来判断一段不定长的文本序列中包含的是正面还是负面的情绪。后续内容将从以下几个方面展开:

文本情感分类数据集

使用循环神经网络进行情感分类

使用卷积神经网络进行情感分类

import collections

import os

import random

import time

from tqdm import tqdm

import torch

from torch import nn

import torchtext.vocab as Vocab

import torch.utils.data as Data

import torch.nn.functional as F

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

文本情感分类数据

读取数据

数据集文件夹结构:

| aclImdb_v1

| train

| | pos

| | | 0_9.txt

| | | 1_7.txt

| | | ...

| | neg

| | | 0_3.txt

| | | 1_1.txt

| | ...

| test

| | pos

| | neg

| | ...

| ...

def read_imdb(folder='train', data_root="/home/kesci/input/IMDB2578/aclImdb_v1/aclImdb"):

data = []

for label in ['pos', 'neg']:

folder_name = os.path.join(data_root, folder, label)

for file in tqdm(os.listdir(folder_name)):

with open(os.path.join(folder_name, file), 'rb') as f:

review = f.read().decode('utf-8').replace('\n', '').lower()

data.append([review, 1 if label == 'pos' else 0])

random.shuffle(data)

return data

DATA_ROOT = "/home/kesci/input/IMDB2578/aclImdb_v1/"

data_root = os.path.join(DATA_ROOT, "aclImdb")

train_data, test_data = read_imdb('train', data_root), read_imdb('test', data_root)

# 打印训练数据中的前五个sample

for sample in train_data[:5]:

print(sample[1], '\t', sample[0][:50])

100%|██████████| 12500/12500 [00:00<00:00, 15484.71it/s]

100%|██████████| 12500/12500 [00:00<00:00, 53658.60it/s]

100%|██████████| 12500/12500 [00:00<00:00, 53187.52it/s]

100%|██████████| 12500/12500 [00:00<00:00, 52966.52it/s]

1 i'm 60 years old, a guitarist, (lead/rhythm), and

0 it's the worst movie i've ever seen. the action is

1 i have seen the movie holes and say that it has to

1 i just saw this last night, it was broadcast on th

0 ...well, pop this into the dvd, waste an hour and

预处理数据

读取数据后,我们先根据文本的格式进行单词的切分,再利用 torchtext.vocab.Vocab 创建词典。

def get_tokenized_imdb(data):

'''

@params:

data: 数据的列表,列表中的每个元素为 [文本字符串,0/1标签] 二元组

@return: 切分词后的文本的列表,列表中的每个元素为切分后的词序列

'''

def tokenizer(text):

return [tok.lower() for tok in text.split(' ')]

return [tokenizer(review) for review, _ in data]

def get_vocab_imdb(data):

'''

@params:

data: 同上

@return: 数据集上的词典,Vocab 的实例(freqs, stoi, itos)

'''

tokenized_data = get_tokenized_imdb(data)

counter = collections.Counter([tk for st in tokenized_data for tk in st])

return Vocab.Vocab(counter, min_freq=5)

vocab = get_vocab_imdb(train_data)

print('# words in vocab:', len(vocab))

# words in vocab: 46152

词典和词语的索引创建好后,就可以将数据集的文本从字符串的形式转换为单词下标序列的形式,以待之后的使用。

def preprocess_imdb(data, vocab):

'''

@params:

data: 同上,原始的读入数据

vocab: 训练集上生成的词典

@return:

features: 单词下标序列,形状为 (n, max_l) 的整数张量

labels: 情感标签,形状为 (n,) 的0/1整数张量

'''

max_l = 500 # 将每条评论通过截断或者补0,使得长度变成500

def pad(x):

return x[:max_l] if len(x) > max_l else x + [0] * (max_l - len(x))

tokenized_data = get_tokenized_imdb(data)

features = torch.tensor([pad([vocab.stoi[word] for word in words]) for words in tokenized_data])

labels = torch.tensor([score for _, score in data])

return features, labels

创建数据迭代器

利用 torch.utils.da

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值