免费、绿色、专业的手机游戏中心下载安装平台-游家吧

当前位置: 首页 > 教程攻略 > 【智情洞察】PaddlePaddle 3.0驱动的售后评价分析与优化系统

【智情洞察】PaddlePaddle 3.0驱动的售后评价分析与优化系统

更新时间:2026-08-14 09:50:27

【智情洞察】PaddlePaddle 3.0驱动的售后评价分析与优化系统

文本情感分析的目标在于识别并提取文本中的倾向、立场、评价和观点等主观信息,主要包括两大任务:情感分类和观点抽取;该技术在消费决策、舆情分析与个性化推荐等方面展现出显著的商业价值。情感分类是用于检测主观文本中的情感倾向的技术。

0 项目说明

情感分析旨在通过识别文本中的情绪、态度和立场来理解文本的情感倾向,主要包括两类任务:情感分类和观点抽取;它在消费决策、舆情分析和个人化推荐等领域有着重要的应用,并且具有很高的商业价值。情感分类是用于判断主观文本中的情感倾向的技术。

售后评价情感分类是通过对购买后留下的评论进行分析,来识别和分类消费者的情感倾向的一项重要技术。这对于企业来说至关重要,因为它可以从客户反馈中提取有价值的信息,通过分析顾客的产品评价文本来识别其情感倾向,帮助企业提升产品质量和服务水平,从而优化客户体验。

在本次项目中,我们使用了最新的PaddlePaddle 架,成功实现了对售后评论的情感分类。这种技术能够帮助提升产品销售和客户满意度。情感倾向分为积极与消极两极,使得系统可以适应各种场景进行多类别的预测。通过调整特定数据集,模型可应用于任何实际情境中。

PaddlePaddle 具有诸多优势特性:# 动静统一自动并行技术: 此技术能大幅提升模型效率,使大型图像识别任务得以快速处理。# 神经网络编译器优化能力: 通过神经网络编译器自动优化代码,大幅度提升了模型运行速度和精度。# 大模型训练与部署一体化: PaddlePaddle 持无缝集成多种硬件资源,实现从训练到部署的一体化解决方案。# 强大的多硬件适配能力: 无论使用GPU、CPU还是TPU等,均可轻松完成模型的高效执行,进一步提升了整体性能和灵活性。

1 函数库导入

本部分导入整个模型训练过程所需要的函数库,做好事先的导入,方便后续快速调用; In [4]

import jiebaimport jieba.posseg as pseg #去除无关词性的词import csvfrom sklearn.preprocessing import LabelEncoder #标签规格化处理import pandas as pdimport reimport stringimport paddlefrom paddle.nn import Conv2D, Linear, Embeddingfrom paddle import to_tensorimport paddle.nn.functional as Fimport os, zipfileimport io, random, jsonimport numpy as npimport matplotlib.pyplot as plt登录后复制

2 数据集读取

本项目使用了来自京东的商品评论数据集。为了提高预测准确性,我们将原本的二分类任务调整为多分类方案,从而更加全面地分析商品评价。

部分数据集呈现如下图所示,前面为对应的类型,后面为所对应的文字;

数据预处理流程主要包含两个关键步骤:标签编码和评论提取。

使用Pandas从CSV文件中加载数据,并应用自定义的`encodeLabel`函数,借助LabelEncoder将文本标签转换成数值形式,以优化模型训练。

- 定义getComment函数来收集数据集中的所有评论;

此代码使用迭代方法处理数据,首先提取指定列的原始文本,然后对每个元素应用预定义的编码规则,最终显示转换后的首个标签与评论。

1 非常喜欢相机真#登录后复制 In [5]

我们首先加载了一个名为`work/alldata.csv`的工作表CSV文件: ```python data = pd.read_csv('work/alldata.csv') ``` 接下来,我们定义了一个名为`encodeLabel`的函数,这个函数用于将数据集中标签列进行编码: ```python def encodeLabel(data): listLabel = [] for label in data['label']: listLabel.append(label) le = LabelEncoder resultLabel = le.fit_transform(listLabel) return resultLabel ``` 然后,我们调用`encodeLabel`函数将数据集中的标签进行编码: ```python Label = encodeLabel(data) print(Label[) ``` 接下来,我们定义了一个名为`getComment`的函数,这个函数用于获取数据集中所有评论: ```python def getComment(data): listComment = [] for comment in data['Comment']: listComment.append(comment) return listComment ``` 然后,我们调用`getComment`函数将数据集中的所有评论提取出来: ```python Comment = getComment(data) print(Comment[) ``` 最后,我们打印出编码后的第一个标签以及获取的列表中第一个元素的评论。

1 非常喜欢相机真#登录后复制

3 数据预处理

首先,我们对原始数据进行预处理。这包括加载停用词,去除停用词,分词,词性标注以及将处理过的数据存入文件里等一系列步骤。

在进行数据字典的生成,在进行花费,得到模型训练所需要的数据集的规范形式;

3.1 文本预处理

- 定义处理文本数据,包括加载停用词、去除停用词、分词和词性标注函数来

- 将处理后的数据与标签合并,并保存到文件中;

- 用jieba库进行中文分词,re库进行正则表达式匹配,以及string库来处理字符串;

- 将处理后的数据写入到一个文本文件中,每个样本由标签和分词结果组成,用*号隔开; In [6]

文章摘要这篇文章提供了一套中文文本处理的工具函数,涵盖了停用词去除、分词和词性标注的基本功能。这些技术是自然语言处理中常见的步骤,可以帮助我们在处理包含大量文本数据时提高效率并减少噪声。# 停用词表定义在中文文献中,“停用词”是指那些在语料库中出现频率较高的但对理解全文意义帮助较小的词语,例如“了、是”等。这些词汇通常被排除在外,因为它们没有提供额外的信息,并且会引入不必要的噪音。为了实现这一功能,文章首先定义了一个函数 `stopwordslist`,它通过读取一个名为 `stopwords.txt` 的文件来获取停用词列表。这一步骤需要确保该文件包含所有可能的停用词,如英文标点符号、括号和标点等。接着,我们使用 `deleteStop` 函数将输入的句子中的停用词去除,这样只留下有意义的词语。# 词汇分词与标注接下来,文章讨论了如何处理原始文本并提取更具体的语义信息。首先,通过调用 `jieba` 库对每个评论进行分词和词性标注。该库允许我们不仅识别出单词,还能够标注它们的词性(例如动词、形容词等)。然后,使用 `deleteStop` 函数进一步去除停用词,并且最终将结果存储在一个列表中返回。# 处理后的数据输出最后,文章介绍了一个函数 `wordCut`,该函数可以用于整个文本处理中的分词和词性标注。在实际应用中,我们需要一个包含多个评论的列表,并通过这个函数提取出每个评论的分词结果以及它们相应的词性标注。然后,我们将其转换为一个元组形式以便于进一步处理。# 结束语本文提供了一个简单但全面的工具包来应对文本数据的基本处理任务。通过对停用词、词汇分割和词性标注等关键步骤的实现,可以有效地清理和分析大量的中文文本数据。

3.2 生成数据字典函数

以下是伪原创后的本部分旨在生成一个数据字典,将文本数据中的每个唯一词汇映射到一个唯一的索引。主要操作如下: 首先读取包含分词结果的列表 `olist`,并创建一个集合 `dict_set` 来存储所有不重复的词汇。 遍历这个集合,为每个词汇分配一个索引,并创建字典 `dict_txt` 以实现词汇和索引之间的映射关系。 在生成过程中添加了两个特殊的标记:(未知字符)和(填充字符),并将整个字典写入到一个文件中。

定义创建数据字典的函数在Python中,我们可以通过定义一个`create_dict`函数来创建数据字典。此函数接收两个参数:`olist`和`dict_path`。首先,它打开指定路径的文件,并清空其内容以确保每次运行时都从头开始写入。```python def create_dict(olist, dict_path): # 打开并清空目标文件 with open(dict_path, 'w', encoding='utf-) as f: f.seek( f.truncate # 初始化一个空集合,用于存储不重复的词汇 dict_set = set # 遍历olist中的每行数据,即每个样本的分词结果 for line in olist: for s in line: dict_set.add(s) # 每个词汇自动去重 # 初始化一个空列表,用于存储字典项(词汇和对应的索引) dict_list = [] i = # 遍历集合中的每个词汇 for s in dict_set: dict_list.append([s, i]) i += # 将列表转换成字典,一个词对应一个数字 dict_txt = dict(dict_list) end_dict = {'': i} # 添加未知字符的索引 dict_txt.update(end_dict) # 更新字典,将未知字符的索引添加到字典中 # 将填充字符的索引 end_dict = {'': i} dict_txt.update(end_dict) # 转换并写入最终的字典 with open(dict_path, 'w', encoding='utf-) as f: f.write(str(dict_txt)) print('数据字典生成完成!') ```以上代码片段展示了如何创建和保存一个数据字典。该字典可以用于词汇识别或模型训练中的索引转换,其中的``表示未知词汇,而``表示填充词。

3.3 划分数据集

load_vocab用于加载字典文件,f_write_txt用于将单词序列和标签转换为序列化表示;

首先,读取原始数据文件。接着,利用预设的词汇表将每个单词转换为对应的数字序列表示。然后,按照指定的比例(例如,每样本中选择一个作为训练集)对数据进行随机抽取以构建训练集和测试集。

最后将序列化的数据写入到指定的训练集和测试集文件中; In [8]

# 定义加载字典的函数def load_vocab(file_path): # 打开字典文件并读取内容 fr = open(file_path, 'r', encoding='utf) # 使用eval函数将读取的字符串转换为字典 vocab = eval(fr.read) # 关闭文件 fr.close # 返回字典 return vocab# 定义将单词序列化为数字序列的函数def f_write_txt(words, dict_txt, label): # 初始化标签字符串 labs = "" # 遍历单词列表 for s in words: # 将单词转换为对应的数字索引 lab = str(dict_txt[s]) # 将数字索引添加到标签字符串 labs = labs + lab + ',' # 去掉最后一个逗号 labs = labs[:- # 将标签添加到标签字符串并换行 labs = labs + '\t' + label + '\n' # 返回序列化后的标签和单词序列 return labs# 定义创建数据列表并划分训练集和测试集的函数def create_data_list(data_path, train_path, test_path, dict_path): # 加载字典 dict_txt = load_vocab(dict_path) # 打开数据文件并读取所有行 with open(data_path, 'r', encoding='utf-) as f_data: lines = f_data.readlines # 初始化最大序列长度计数器 i = 0 maxlen = 0 # 打开训练集和测试集文件准备写入 with open(test_path, 'a', encoding='utf-) as f_test, open(train_path, 'a', encoding='utf-) as f_train: # 遍历数据文件的每一行 for line in lines: # 分割标签和单词序列 words = line.split('*')[-.replace(' ', '').strip # 更新最大序列长度 maxlen = max(maxlen, len(words)) # 提取标签 label = line.split('*')[ # 分割单词序列 wordcut = line.strip('\n').split(' ') # 将单词序列和标签序列化 labs = f_write_txt(wordcut, dict_txt, label) # 每样本抽取一个作为测试集,其余作为训练集 if i % == f_test.write(labs) else: f_train.write(labs) # 递增样本计数器 print("数据列表生成完成!")登录后复制

# 创建数据字典 create_dict(wordCut, dict_path) # 清空test_list.txt和train_list.txt中的内容 with open(test_path, 'w', encoding='utf-) as f_test: f_test.seek( f_test.truncate with open(train_path, 'w', encoding='utf-) as f_train: f_train.seek( f_train.truncatecreate_data_list(data_path, train_path, test_path, dict_path)

数据字典生成完成! 数据列表生成完成!登录后复制 In [10]

# 打印前2条训练数据vocab = load_vocab(dict_path)def ids_to_str(ids): words = [] for k in ids: w = list(vocab.keys())[list(vocab.values()).index(int(k))] words.append(w if isinstance(w, str) else w.decode('ASCII')) return " ".join(words)with io.open(train_path, "r", encoding='utf8') as fin: i = 0 for line in fin: i += 1 cols = line.strip().split("\t") if len(cols) != 2: sys.stderr.write("[NOTICE] Error Format Line!") continue label = int(cols[1]) wids = cols[0].split(",") print(str(i)+":") print('sentence list id is:', wids) print('sentence list is: ', ids_to_str(wids)) print('sentence label id is:', label) print('---------------------------------') if i == 2: break登录后复制

- 真的喜欢超出期望值的发货速度,包装仔细严实,运送速度快。商品质量很好,价格也合适。网购真的很愉快,购买的理想产品。

4 数据集加载

本部分代码设计了数据集类。它从文本文件中读取数据并进行格式处理,然后将其转化为用于模型训练和测试的批量加载器。

首先初始化数据集路径,读取数据,对数据进行预处理,如分割、过滤和填充;

然后将处理后的数据封装成一个可迭代的数据加载器,用于模型的训练和测试; In [11]

class Dataset(paddle.io.Dataset): def __init__(self, data_dir): self.data_dir = data_dir self.all_data = [] with io.open(self.data_dir, "r", encoding='utf8') as fin: for line in fin: cols = line.strip().split("\t") if len(cols) != 2: sys.stderr.write("[NOTICE] Error Format Line!") continue label = [] label.append(int(cols[1])) wids = cols[0].split(",") if len(wids)>=150: wids = np.array(wids[:150]).astype('int64') else: wids = np.concatenate([wids, [vocab["<pad>"]]*(150-len(wids))]).astype('int64') label = np.array(label).astype('int64') self.all_data.append((wids, label)) def __getitem__(self, index): data, label = self.all_data[index] return data, label def __len__(self): return len(self.all_data) batch_size = 32train_dataset = Dataset(train_path) test_dataset = Dataset(test_path) train_loader = paddle.io.DataLoader(train_dataset, places=paddle.CPUPlace(), return_list=True, shuffle=True, batch_size=batch_size, drop_last=True) test_loader = paddle.io.DataLoader(test_dataset, places=paddle.CPUPlace(), return_list=True, shuffle=True, batch_size=batch_size, drop_last=True)登录后复制

5 模型训练

5.1 网络定义

CNN,即卷积神经网络,是一种深度学习模型,广泛应用于图像和文本数据的特征提取,通过卷积层、激活函数、池化层等结构,能够自动学习数据中的局部特征和层次表示,适用于图像识别、自然语言处理等多种任务。

我正在使用的模型是CNN,它非常适合处理序列化的文本数据。通过卷积层和池化层来提取文本的特征,最后使用全连接层来进行分类。这种方法能有效提高文本分类的准确率。

该模型广泛应用于自然语言处理的文本分类领域,有效捕获文本局部特征。

使用因为它能高效地捕捉文本的局部信息,并自动构建有效的表示,显著减少了参数量且提升了模型的泛化性能。

CNN的这些特性使其在处理文本数据和捕捉情感倾向方面表现出色; In [12]

#定义卷积网络class CNN(paddle.nn.Layer): def __init__(self): super(CNN,self).__init__() self.dict_dim = vocab["<pad>"] self.emb_dim = 128 self.hid_dim = 128 self.fc_hid_dim = 96 self.class_dim = 2 self.channels = 1 self.win_size = [3, self.hid_dim] self.batch_size = 32 self.seq_len = 150 self.embedding = Embedding(self.dict_dim + 1, self.emb_dim, sparse=False) self.hidden1 = paddle.nn.Conv2D(in_channels=1, #通道数 out_channels=self.hid_dim, #卷积核个数 kernel_size=self.win_size, #卷积核大小 padding=[1, 1] ) self.relu1 = paddle.nn.ReLU() self.hidden3 = paddle.nn.MaxPool2D(kernel_size=2, #池化核大小 stride=2) #池化步长2 self.hidden4 = paddle.nn.Linear(128*75, 2) #网络的前向计算过程 def forward(self,input): #print('输入维度:', input.shape) x = self.embedding(input) x = paddle.reshape(x, [32, 1, 150, 128]) x = self.hidden1(x) x = self.relu1(x) #print('第一层卷积输出维度:', x.shape) x = self.hidden3(x) #print('池化后输出维度:', x.shape) #在输入全连接层时,需将特征图拉平会自动将数据拉平. x = paddle.reshape(x, shape=[self.batch_size, -1]) out = self.hidden4(x) return out登录后复制

5.2 模型训练

本部分采用定制的train函数进行模型训练,涵盖前向传播、损失计算、反向传播及参数调整。

在训练过程中,每隔批次会记录损失和准确率,供后续分析之用。每次epoch结束时,模型将被验证在测试集上的表现,以此来评估其泛化能力。

完成训练后,模型参数被保存,并通过draw_process函数绘制出训练与验证过程中损失和准确率的变化曲线。

训练七轮,最终为验证集准确度为91.5%,可根据实际需求,进行不断优化;

epoch: 7, batch_id: 1350, loss is: 0.0669107735157013 epoch: 7, batch_id: 1400, loss is: 0.06557288765907288 epoch: 7, batch_id: 1450, loss is: 0.028300032019615173 epoch: 7, batch_id: 1500, loss is: 0.011290575377643108 epoch: 7, batch_id: 1550, loss is: 0.004456622991710901 epoch: 7, batch_id: 1600, loss is: 0.037060000002384186 [validation] accuracy: 0.9157458543777466, loss: 0.6306926012039185登录后复制

训练过程Loss下降和准确度变化如下图所示

In []

# 定义绘制训练过程的函数def draw_process(title, color, iters, data, label): plt.title(title, fontsize=24) # 设置图表标题和字体大小 plt.xlabel("iter", fontsize=20) # 设置x轴标签和字体大小 plt.ylabel(label, fontsize=20) # 设置y轴标签和字体大小 plt.plot(iters, data, color=color, label=label) # 绘制数据曲线 plt.legend() # 显示图例 plt.grid() # 显示网格 plt.show() # 显示图表# 定义训练模型的函数def train(model): model.train() # 设置模型为训练模式 opt = paddle.optimizer.Adam(learning_rate=0.002, parameters=model.parameters()) # 定义优化器 steps = 0 # 初始化步骤计数器 Iters, total_loss, total_acc = [], [], [] # 初始化迭代次数、损失和准确率的列表 # 进行多个epoch的训练 for epoch in range(8): # 遍历训练数据集 for batch_id, data in enumerate(train_loader): steps += 1 # 更新步骤计数器 sent = data[0] # 获取输入数据 label = data[1] # 获取标签 logits = model(sent) # 模型前向计算 loss = paddle.nn.functional.cross_entropy(logits, label) # 计算损失 acc = paddle.metric.accuracy(logits, label) # 计算准确率 if batch_id % 50 == 0: # 每50个batch记录一次 Iters.append(steps) total_loss.append(loss.item()) # 记录损失 total_acc.append(acc.item()) # 记录准确率 print("epoch: {}, batch_id: {}, loss is: {}".format(epoch, batch_id, loss.numpy())) # 打印损失信息 loss.backward() # 反向传播 opt.step() # 更新模型参数 opt.clear_grad() # 清除梯度 # 每个epoch结束后评估模型 model.eval() # 设置模型为评估模式 accuracies = [] losses = [] for batch_id, data in enumerate(test_loader): sent = data[0] label = data[1] logits = model(sent) loss = paddle.nn.functional.cross_entropy(logits, label) acc = paddle.metric.accuracy(logits, label) accuracies.append(acc.numpy()) losses.append(loss.numpy()) avg_acc, avg_loss = np.mean(accuracies), np.mean(losses) # 计算平均准确率和损失 print("[validation] accuracy: {}, loss: {}".format(avg_acc, avg_loss)) # 打印评估信息 model.train() # 切换回训练模式 # 保存模型参数 paddle.save(model.state_dict(), "model_final.pdparams") # 绘制训练过程中的损失和准确率 draw_process("trainning loss", "red", Iters, total_loss, "trainning loss") draw_process("trainning acc", "green", Iters, total_acc, "trainning acc") # 创建CNN模型实例model = CNN()# 调用训练函数开始训练train(model)登录后复制

6 模型评估

6.1 整体评估

最终评估准确度为:[validation] accuracy: 0.9159185290336609, loss: 0.6325207352638245

显然数字是可以提高的,可以尝试增大Epoch进行更多轮的训练,去调优本模型识别效果; In [14]

''' 模型评估 '''model_state_dict = paddle.load('model_final.pdparams') model = CNN() model.set_state_dict(model_state_dict) model.eval() accuracies = [] losses = []for batch_id, data in enumerate(test_loader): sent = data[0] label = data[1] logits = model(sent) loss = paddle.nn.functional.cross_entropy(logits, label) acc = paddle.metric.accuracy(logits, label) accuracies.append(acc.numpy()) losses.append(loss.numpy()) avg_acc, avg_loss = np.mean(accuracies), np.mean(losses)print("[validation] accuracy: {}, loss: {}".format(avg_acc, avg_loss))登录后复制

[validation] accuracy: 0.9174723625183105, loss: 0.7229368090629578登录后复制

6.2 单例评估

本部分使用预训练的CNN模型对测试数据进行了情感分类预测,并比较了预测结果与真实标签,以此评价模型的性能。

使用映射策略识别最可能的索引,并将其转换为预先定义的标签。接着,输出预测、真实标签及清理后的原始文本片段,评估模型性能。

label_map = {0:"negative", 1:"positive"} model_state_dict = paddle.load('model_final.pdparams') model = CNN() model.set_state_dict(model_state_dict) model.eval()for batch_id, data in enumerate(test_loader): sent = data[0] gt_labels = data[1].numpy() results = model(sent) predictions = [] for probs in results: # 映射分类label idx = np.argmax(probs) labels = label_map[idx] predictions.append(labels) print() for i,pre in enumerate(predictions): print('数据: {} \n\n预测: {} \n原始标签:{}'.format(ids_to_str(sent[0]).replace(" ", "").replace("<pad>",""), pre, label_map[gt_labels[0][0]])) break break登录后复制

数据: 收到质量不错挺手机挺漂亮动画挺大屏值得信赖声音挺大外观挺好看感谢商家感谢快递支持感谢商家感谢 预测: positive 原始标签:positive登录后复制

以上就是【智情洞察】PaddlePaddle 3.0驱动的售后评价分析与优化系统的详细内容,更多请关注其它相关文章!

精品推荐

相关文章

最新资讯

热门文章

更多