首页 游戏 软件 资讯 排行榜 专题
首页
AI
主流互联网游戏评论情感态势分析

主流互联网游戏评论情感态势分析

热心网友
34
转载
2025-07-24
随着游戏市场的崛起,游戏相关从业人员急需了解玩家对游戏的实际体验,以便有针对性地指导游戏运营和开发。因此可基于深度学习模型对玩家评论进行情感分析,做网络游戏舆情态势分析项目。

主流互联网游戏评论情感态势分析 - 游乐网

主流互联网游戏评论情感态势分析项目

应用场景:随着游戏市场的崛起,游戏相关从业人员急需了解玩家对游戏的实际体验,以便有针对性地指导游戏运营和开发。与此同时,在舆情信息监测的实际业务中,也存在着信息处理效率过低以及分析结果过于主观等问题。因此,为了解决游戏评论体量大、更新快、含义不清的问题,可基于深度学习模型对玩家评论进行情感分析,做网络游戏舆情态势分析项目。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

项目简介:本次项目利用情感分析预训练模型SKEP完成模型训练与预测,利用爬虫程序爬取3个主流平台(TapTap、bilibili、豆瓣)的三个主流互联网游戏(《原神》、《王者荣耀》、《和平精英》)的用户评论进行数据分析,最后利用pyqt5的qtdeisgner进行ui设计,完成数据可视化。

In [15]
!tree
登录后复制        
.├── 4340075.ipynb├── data│   └── data109273│       └── taptap_review_ready.csv├── __pycache__│   ├── photo.cpython-38.pyc│   └── utils.cpython-37.pyc├── pyqt5│   ├── 5.ui│   ├── a1.py│   ├── a1.spec│   ├── ciyun│   │   ├── cb.webp│   │   ├── cd.webp│   │   ├── ct.webp│   │   ├── logo.ico│   │   ├── wb.webp│   │   ├── wd.webp│   │   ├── wt.webp│   │   ├── yb.webp│   │   ├── yd.webp│   │   ├── yt.webp│   │   ├── 原神.webp│   │   ├── 和平精英.webp│   │   ├── 新建文本文档.txt│   │   └── 王者.webp│   ├── dist│   │   └── 游戏平台情感分析.exe│   ├── photo.py│   └── photo.qrc├── skep_ckpt│   ├── model_0│   ├── model_100│   │   ├── model_config.json│   │   ├── model_state.pdparams│   │   ├── tokenizer_config.json│   │   └── vocab.txt│   └── model_200│       ├── model_config.json│       ├── model_state.pdparams│       ├── tokenizer_config.json│       └── vocab.txt├── spider│   ├── data│   │   ├── bilibili_chiji.csv│   │   ├── bilibili_wangzhe.csv│   │   ├── bilibili_yuanshen.csv│   │   ├── douban_chiji.csv│   │   ├── douban_wangzhe.csv│   │   ├── douban_yuanshen.csv│   │   ├── TapTap_chiji.csv│   │   ├── TapTap_wangzhe.csv│   │   └── TapTap_yuanshen.csv│   └── work│       ├── bilibili_spider.py│       ├── douban_spider.py│       └── TapTap_spider.py├── utils.py├── wordcloud│   ├── bilibili_chiji.webp│   ├── bilibili_wangzhe.webp│   ├── bilibili_yuanshen.webp│   ├── douban_chiji.webp│   ├── douban_wangzhe.webp│   ├── douban_yuanshen.webp│   ├── TapTap_chiji.webp│   ├── TapTap_wangzhe.webp│   ├── TapTap_yuanshen.webp│   └── wordcloud.py├── work└── 情感分析结果.xlsx15 directories, 56 files
登录后复制        

项目文件:

主流互联网游戏评论情感态势分析 - 游乐网        

In [3]
#引入需要的库import paddlenlp as ppnlpimport paddlefrom paddlenlp.datasets import load_datasetfrom paddlenlp.datasets import MapDatasetfrom paddlenlp.data import Stack, Pad, Tupleimport paddle.nn.functional as Fimport numpy as npimport pandas as pdfrom functools import partialimport os
登录后复制    

采用数据集为aistdio上“TapTap游戏评论”数据集,链接:https://aistudio.baidu.com/aistudio/datasetdetail/101119

包含TapTap上约300款游戏的标签评论,可用于情感分析的应用,共4888个数据示例

采用该数据集优点:涉及游戏种类较多,训练数据样本较多

缺点:缺乏目前主流互联网游戏相关评论,网络热词较少覆盖,无阴阳怪气评论

In [4]
#读取数据集并划分训练集与验证集df=pd.read_csv('data/data109273/taptap_review_ready.csv')#读取数据集的评论内容review = df.review.tolist()#读取数据集的情感指数sentiment = df.sentiment.tolist()full_data=[]for i in range(len(review)):    #将每条评论内容与情感指数形成字典并添加到full_data列表    dic = {'text':review[i],'label':sentiment[i]}    full_data.append(dic)print(len(full_data))#数据集切分train_ds = MapDataset(full_data[:4400])dev_ds = MapDataset(full_data[4400:4880])label_list = ['0', '1']print(len(train_ds))print(train_ds[3])
登录后复制        
48884400{'text': '对我来说,这种游戏让我感觉很好。刚开始是因为同学推荐我玩,我玩了一下,哇,真的很好,然后,最近没怎么登录游戏,怎么关服了?这就很难受。希望反斗联盟快速上架,我想玩。等待这种事。对我来说度日如年。我就是觉得那个空投好像有点问题。每次那个空投差不多都在对面基地附近。对面英雄又有点难对付。抢又抢不着。这就特别难受了。', 'label': 1}
登录后复制        In [5]
from paddlenlp.transformers import SkepForSequenceClassification, SkepTokenizer# 加载skep模型model = SkepForSequenceClassification.from_pretrained(pretrained_model_name_or_path="skep_ernie_1.0_large_ch", num_classes=len(label_list))# 加载模型对应的Tokenizer,用于数据预处理tokenizer = SkepTokenizer.from_pretrained(pretrained_model_name_or_path="skep_ernie_1.0_large_ch")
登录后复制        
[2024-07-16 15:24:57,173] [    INFO] - Downloading https://paddlenlp.bj.bcebos.com/models/transformers/skep/skep_ernie_1.0_large_ch.pdparams and saved to /home/aistudio/.paddlenlp/models/skep_ernie_1.0_large_ch[2024-07-16 15:24:57,176] [    INFO] - Downloading skep_ernie_1.0_large_ch.pdparams from https://paddlenlp.bj.bcebos.com/models/transformers/skep/skep_ernie_1.0_large_ch.pdparams100%|██████████| 1238309/1238309 [00:17<00:00, 71093.85it/s]W0716 15:25:14.762745   151 device_context.cc:404] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 10.1W0716 15:25:14.766620   151 device_context.cc:422] device: 0, cuDNN Version: 7.6.[2024-07-16 15:25:22,647] [    INFO] - Downloading skep_ernie_1.0_large_ch.vocab.txt from https://paddlenlp.bj.bcebos.com/models/transformers/skep/skep_ernie_1.0_large_ch.vocab.txt100%|██████████| 55/55 [00:00<00:00, 10636.12it/s]
登录后复制        In [6]
#数据预处理def convert_example(example,tokenizer,label_list,max_seq_length=128,is_test=False):    if is_test:        text = example['text']    else:        text = example['text']        label = example['label']    #tokenizer.encode方法实现切分token,映射token ID以及拼接特殊token    encoded_inputs = tokenizer.encode(text=text, max_seq_len=max_seq_length)    input_ids = encoded_inputs["input_ids"]    token_type_ids = encoded_inputs["token_type_ids"]    if not is_test:        label_map = {}        for (i, l) in enumerate(label_list):            label_map[l] = i        # label:情感极性类别            label = np.array([label], dtype="int64")        return input_ids, token_type_ids, label    else:        return input_ids, token_type_ids#数据迭代器def create_dataloader(dataset, trans_fn=None, mode='train', batch_size=1, use_gpu=False, pad_token_id=0, batchify_fn=None):    if trans_fn:        dataset = dataset.map(trans_fn, lazy=True)    if mode == 'train' and use_gpu:        sampler = paddle.io.DistributedBatchSampler(dataset=dataset, batch_size=batch_size, shuffle=True)    else:        shuffle = True if mode == 'train' else False         sampler = paddle.io.BatchSampler(dataset=dataset, batch_size=batch_size, shuffle=shuffle) #生成一个取样器    dataloader = paddle.io.DataLoader(dataset, batch_sampler=sampler, return_list=True, collate_fn=batchify_fn)    return dataloader#将数据处理成模型可读入的数据格式trans_fn = partial(convert_example, tokenizer=tokenizer, label_list=label_list, max_seq_length=128, is_test=False)# 将数据组成批量式数据batchify_fn = lambda samples, fn=Tuple(Pad(axis=0,pad_val=tokenizer.pad_token_id), Pad(axis=0, pad_val=tokenizer.pad_token_id), Stack(dtype="int64")):[data for data in fn(samples)]#batch_size批量数据大小batch_size=64#训练集迭代器train_loader = create_dataloader(train_ds, mode='train', batch_size=batch_size, batchify_fn=batchify_fn, trans_fn=trans_fn)#验证集迭代器dev_loader = create_dataloader(dev_ds, mode='dev', batch_size=batch_size, batchify_fn=batchify_fn, trans_fn=trans_fn)
登录后复制    In [7]
#设置训练参数import timefrom utils import evaluate# 训练轮次epochs = 3# 训练过程中保存模型参数的文件夹ckpt_dir = "skep_ckpt"# len(train_loader)一轮训练所需要的step数num_training_steps = len(train_loader) * epochs# Adam优化器optimizer = paddle.optimizer.AdamW(    learning_rate=2e-5,    parameters=model.parameters())# 交叉熵损失函数criterion = paddle.nn.loss.CrossEntropyLoss()# accuracy评价指标metric = paddle.metric.Accuracy()
登录后复制    In [12]
#模型训练global_step = 0tic_train = time.time()for epoch in range(1, epochs + 1):    for step, batch in enumerate(train_loader, start=1):        input_ids, token_type_ids, labels = batch        # 喂数据给model        logits = model(input_ids, token_type_ids)        # 计算损失函数值        loss = criterion(logits, labels)        # 预测分类概率值        probs = F.softmax(logits, axis=1)        # 计算acc        correct = metric.compute(probs, labels)        metric.update(correct)        acc = metric.accumulate()        global_step += 1        if global_step % 10 == 0:            print(                "global step %d, epoch: %d, batch: %d, loss: %.5f, accu: %.5f, speed: %.2f step/s"                % (global_step, epoch, step, loss, acc,                    10 / (time.time() - tic_train)))            tic_train = time.time()                # 反向梯度回传,更新参数        loss.backward()        optimizer.step()        optimizer.clear_grad()        if global_step % 100 == 0:            save_dir = os.path.join(ckpt_dir, "model_%d" % global_step)            if not os.path.exists(save_dir):                os.makedirs(save_dir)            # 评估当前训练的模型            evaluate(model, criterion, metric, dev_loader)            # 保存当前模型参数等            model.save_pretrained(save_dir)            # 保存tokenizer的词表等            tokenizer.save_pretrained(save_dir)
登录后复制        
WARNING:root:DataLoader reader thread raised an exception.Exception in thread Thread-5:Traceback (most recent call last):  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/threading.py", line 926, in _bootstrap_inner    self.run()  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/threading.py", line 870, in run    self._target(*self._args, **self._kwargs)  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dataloader/dataloader_iter.py", line 192, in _thread_loop    six.reraise(*sys.exc_info())  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/six.py", line 719, in reraise    raise value  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dataloader/dataloader_iter.py", line 160, in _thread_loop    batch = self._dataset_fetcher.fetch(indices)  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dataloader/fetcher.py", line 106, in fetch    data = [self.dataset[idx] for idx in batch_indices]  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dataloader/fetcher.py", line 106, in     data = [self.dataset[idx] for idx in batch_indices]  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddlenlp/datasets/dataset.py", line 181, in __getitem__    idx]) if self._transform_pipline else self.new_data[idx]  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddlenlp/datasets/dataset.py", line 172, in _transform    data = fn(data)  File "/tmp/ipykernel_3624/1567443302.py", line 6, in convert_example    text = example['text']TypeError: tuple indices must be integers or slices, not str
登录后复制        ---------------------------------------------------------------------------SystemError Traceback (most recent call last)/tmp/ipykernel_3624/864604143.py in  2 tic_train = time.time() 3 for epoch in range(1, epochs + 1): ----> 4for step, batch in enumerate(train_loader, start=1): 5 input_ids, token_type_ids, labels = batch 6  # 喂数据给model /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dataloader/dataloader_iter.py in __next__(self) 195  try: 196  if in_dygraph_mode(): --> 197 data = self._reader.read_next_var_list() 198 data = _restore_batch(data, self._structure_infos.pop(0)) 199 else: SystemError: (Fatal) Blocking queue is killed because the data reader raises an exception. [Hint: Expected killed_ != true, but received killed_:1 == true:1.] (at /paddle/paddle/fluid/operators/reader/blocking_queue.h:166)In [8]
# 加载训练好的模型参数params_path = save_dir+'/model_state.pdparams'if params_path and os.path.isfile(params_path):    # 加载模型参数    state_dict = paddle.load(params_path)    model.set_dict(state_dict)    print("Loaded parameters from %s" % params_path)
登录后复制        
Loaded parameters from skep_ckpt/model_200/model_state.pdparams
登录后复制        In [9]
#定义测试集数据的处理函数def convert_example(example,tokenizer,label_list,max_seq_length=512,is_test=False):    encoded_inputs = tokenizer(text=example, max_seq_len=max_seq_length)    input_ids = np.array(encoded_inputs["input_ids"], dtype="int64")    token_type_ids = np.array(encoded_inputs["token_type_ids"], dtype="int64")    return input_ids, token_type_ids
登录后复制    In [10]
#定义预测函数def predict(model, data, tokenizer, label_map, batch_size=1):    examples = []    for text in data:        input_ids, token_type_ids = convert_example(text,tokenizer,label_list=label_map.values(),max_seq_length=512,is_test=True)        examples.append((input_ids, token_type_ids))    #划分数据    batches = [        examples[idx:idx + batch_size]        for idx in range(0, len(examples), batch_size)    ]    batchify_fn = lambda samples, fn=Tuple(        Pad(axis=0, pad_val=tokenizer.pad_token_id),  # input ids        Pad(axis=0, pad_val=tokenizer.pad_token_type_id),  # token type ids    ): [data for data in fn(samples)]        #返回结果集    results = []    model.eval()    for batch in batches:        input_ids, token_type_ids = batchify_fn(batch)        input_ids = paddle.to_tensor(input_ids)        token_type_ids = paddle.to_tensor(token_type_ids)        logits = model(input_ids, token_type_ids)        probs = F.softmax(logits, axis=1)        idx = paddle.argmax(probs, axis=1).numpy()        idx = idx.tolist()        labels = [label_map[i] for i in idx]        results.extend(labels)    return results
登录后复制    

测试集数据:

爬虫程序获取游戏评论,也是本次项目分析数据的来源

爬虫程序放在spider文件夹下:py文件为爬虫源代码,csv文件为平台内游戏评论数据

主流互联网游戏评论情感态势分析 - 游乐网        

爬取数据

主流互联网游戏评论情感态势分析 - 游乐网        

In [11]
#加载测试集import csvwith open('spider/data/bilibili_yuanshen.csv','r',encoding='gbk',errors='ignore')as f:    cs =list(csv.reader(f))#定义存储评论列表comments=[]#csv文件含有表头,故i初始化为1#评论文本在csv文件第三列,故选择cs[i][2]for i in range(1,len(cs)):    comments.append(cs[i][2])print(len(comments))print(comments[1])
登录后复制        
997还一起冒险呢?你有本事放??进去啊?不公测又不给内测资格,??梦中去冒险啊?
登录后复制        In [12]
#对测试集数据情感分析label_map = {0: '0', 1: '1'}results = predict(model,comments,tokenizer,label_map,batch_size=1)#统计积极评论数量count = 0for result in results:    if result == '1':        count =count + 1print(count)#计算积极评论比例positive_ratio = count / len(results)print(positive_ratio)
登录后复制        
5020.5035105315947843
登录后复制        

情感分析结果:

主流互联网游戏评论情感态势分析 - 游乐网        

封装为exe文件:

使用pytrhon的pyinstaller直接生成exe文件,需要的相关文件

主流互联网游戏评论情感态势分析 - 游乐网        

效果展示:

主流互联网游戏评论情感态势分析 - 游乐网        

主流互联网游戏评论情感态势分析 - 游乐网        

来源:https://www.php.cn/faq/1425663.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

Pywinrm,一个 Python 管理利器!
科技数码
Pywinrm,一个 Python 管理利器!

Pywinrm 通过Windows远程管理(WinRM)协议,让Python能够像操作本地一样执行远程Windows命令,真正打通了跨平台管理的最后一公里。 在混合IT环境中,Linux机器管理Wi

热心网友
04.07
全网炸了!5亿人用的Axios竟被投毒,你的密钥还保得住吗?
科技数码
全网炸了!5亿人用的Axios竟被投毒,你的密钥还保得住吗?

早些时候,聊过 Python 领域那场惊心动魄的供应链攻击。当时我就感叹,虽然我们 JavaScript 开发者对这类套路烂熟于心,但亲眼目睹这种规模的“投毒”还是头一次。 早些时候,聊过 Pyth

热心网友
04.07
Toga,一个超精简的 Python 项目!
科技数码
Toga,一个超精简的 Python 项目!

Toga 是 BeeWare 家族的核心成员,号称“写一次,跑遍所有平台”,而且用的是系统原生控件,不是那种一看就是网页套壳的界面 。 写了这么多年 Python,你是不是也想过:要是能一套代码跑

热心网友
04.07
Python 异常处理:别再用裸奔的 try 了
科技数码
Python 异常处理:别再用裸奔的 try 了

异常处理的核心:让错误在正确的地方被有效处理。正确的地方,就是别在底层就把异常吞了,也别在顶层还抛裸奔的 Exception。 异常处理写得好,半夜不用起来改 bug。1 你是不是也这么干过?tr

热心网友
04.07
OpenClaw如何自定义SKILL
AI
OpenClaw如何自定义SKILL

1 Skills机制概述 提起OpenClaw的Skills机制,不少人可能会把它想象成传统意义上的可执行插件。其实,它的内涵要更精妙一些。 简单说,Skills本质上是一套基于提示驱动的能力扩展机制。它并不是一个可以独立“跑”起来的程序模块,而是通过一份结构化描述文件(核心就是那个SKILL m

热心网友
04.07

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

美国SEC主席Paul Atkins证实:加密货币安全港提案已送交白宫审查
web3.0
美国SEC主席Paul Atkins证实:加密货币安全港提案已送交白宫审查

加密货币行业翘首以盼的监管里程碑,终于有了实质性进展。美国证券交易委员会(SEC)主席保罗·阿特金斯(Paul Atkins)近日证实,那份允许加密项目在早期获得注册豁免权的“安全港”框架提案,已经正式送抵白宫,进入了最终审查阶段。 在范德堡大学与区块链协会联合举办的数字资产峰会上,阿特金斯透露了这

热心网友
04.08
微策略Strategy报告:第一季录得144.6亿美元浮亏 再斥资约3.3亿美元买进4871枚比特币
web3.0
微策略Strategy报告:第一季录得144.6亿美元浮亏 再斥资约3.3亿美元买进4871枚比特币

微策略Strategy报告:第一季录得144 6亿美元浮亏 再斥资约3 3亿美元买进4871枚比特币 市场震荡的威力有多大?看看Strategy的最新季报就明白了。根据其最新向美国证管会(SEC)提交的8-K报告,受市场剧烈波动影响,这家公司所持的比特币在第一季度录得了一笔惊人的数字——144 6亿

热心网友
04.08
稳定币发行商Tether再扩Web3版图!Paolo Ardoino:正开发去中心化搜索引擎Hypersearch
web3.0
稳定币发行商Tether再扩Web3版图!Paolo Ardoino:正开发去中心化搜索引擎Hypersearch

稳定币巨头Tether的动向,向来是加密世界的风向标。这不,它向Web3基础设施的版图扩张,又迈出了关键一步。公司执行长Paolo Ardoino在社交平台X上透露,其工程团队正在全力“烹制”一个新项目——去中心化搜索引擎 “Hypersearch”。这个消息一出,立刻引发了行业的广泛猜想。 采用D

热心网友
04.08
Base链首个原生DeFi借贷协议Seamless Protocol倒闭 将于2026年6月30日下线
web3.0
Base链首个原生DeFi借贷协议Seamless Protocol倒闭 将于2026年6月30日下线

基地位于Coinbase旗下以太坊Layer2网络Base的Seamless Protocol,日前正式宣告了服务的终结。这个曾经吸引了超过20万用户的原生DeFi借贷协议,在运营不到三年后,终究没能跑赢时间。它主打的核心产品是Integrated Leverage Markets(ILMs)——一

热心网友
04.08
PAAL代币如何参与治理?社区投票能决定哪些事项?
web3.0
PAAL代币如何参与治理?社区投票能决定哪些事项?

PAAL代币揭秘:深度解析Web3社区治理的核心钥匙 在去中心化自治组织的浪潮中,谁真正掌握了项目的话语权?PAAL代币提供了一套系统化的答案。它不仅是生态内流转的价值媒介,更是开启链上治理大门的核心凭证。通过持有并质押PAAL代币,用户能够对协议升级、资金分配乃至战略方向等关键事务投出决定性的一票

热心网友
04.08