二十、文本情感分类

1. 文本情感倾向性分析

1.1 情感分析的概念

  • 简单的说,我们可以将情感分析(sentiment classification)任务定义为一个分类问题,即指定一个文本输入,机器通过对文本进行分析、处理、归纳和推理后自动输出结论,如下图所示:
    在这里插入图片描述

1.2 情感分析的任务

  • 通常情况下,人们把情感分析任务看成一个三分类问题。
    • 正向: 表示正面积极的情感,如高兴,幸福,惊喜,期待等。
    • 负向: 表示负面消极的情感,如难过,伤心,愤怒,惊恐等。
    • 其他: 其他类型的情感。

在这里插入图片描述

1.3 情感分析的作用

  • 利用机器自动分析这些情感倾向,不但有助于帮助企业了解消费者对其产品的感受,为产品改进提供依据;同时还有助于企业分析商业伙伴们的态度,以便更好地进行商业决策

2. 情感分析的数据预处理

2.1 数据集介绍

  • IMDB电影评论数据,地址:http://ai.stanford.edu/~amaas/data/sentiment/,这是一份包含了5万条流行电影的评论数据,其中训练集25000条,测试集25000条。
    在这里插入图片描述

2.2 思路分析

  • 根据上述的样本,需要使用pytorch完成模型,实现对评论情感进行预测。首先可以把上述问题定义为分类问题,情感评分分为1-10,10个类别。那么根据之前的经验,我们的大致流程如下:准备数据集、模型构建、模型训练、模型评估。

2.3 代码实现

  • 步骤一:定义tokenize的方法
def tokenize(text):
    fileters = ['!', '"', '#', '$', '%', '&', '\(', '\)', '\*', '\+', ',', '-', '\.', '/', ':', ';', '<', '=', '>',
                '\?', '@'
        , '\[', '\\', '\]', '^', '_', '`', '\{', '\|', '\}', '~', '\t', '\n', '\x97', '\x96', '”', '“', ]
    text = re.sub("<.*?>", " ", text, flags=re.S)
    text = re.sub("|".join(fileters), " ", text, flags=re.S)
    return [i.strip() for i in text.split()]
  • 步骤二:准备dataset
# 2. 准备dataset
class ImdbDataset(Dataset):
    def __init__(self, mode):
        # 调用父类初始化方法初始化继承的属性
        super(ImdbDataset, self).__init__()
        if mode == "train":
            text_path = [os.path.join(data_base_path, i) for i in ["train/neg", "train/pos"]]
        else:
            text_path = [os.path.join(data_base_path, i) for i in ["test/neg", "test/pos"]]

        self.total_file_path_list = []
        for i in text_path:
            self.total_file_path_list.extend([os.path.join(i, j) for j in os.listdir(i)])

    def __getitem__(self, idx):
        cur_path = self.total_file_path_list[idx]

        cur_filename = os.path.basename(cur_path)
        label = int(cur_filename.split("_")[-1].split(".")[0]) - 1  # 处理标题,获取label,转化为从[0-9]
        text = tokenize(open(cur_path).read().strip())  # 直接按照空格进行分词
        return label, text

    def __len__(self):
        return len(self.total_file_path_list)
  • 步骤三:实例化 DataLoader
dataset = ImdbDataset(mode="train")


def collate_fn(batch):
    # batch是list,其中是一个一个元组,每个元组是dataset中__getitem__的结果
    content,label = list(zip(*batch))
    return content,label


dataloader = DataLoader(dataset=dataset, batch_size=10, shuffle=True,collate_fn=collate_fn)
  • 步骤四:查看数据结果
count = 0
for idx, (label, text) in enumerate(dataloader):
    print("idx:", idx)
    print("table:", label)
    print("text:", text)
    count += 1
    if count == 1:
        break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值