热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python爬完评论只会做词云?情感分析了解一下

Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者:叶庭云CSD

Python实战社群

Java实战社群

长按识别下方二维码,按需求添加

扫码关注添加客服

进Python社群▲

扫码关注添加客服

进Java社群

作者:叶庭云

CSDN:https://blog.csdn.net/fyfugoyfa

爬到的评论不要只做词云嘛,情感分析了解一下

一、SnowNLP 简介

SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode编码。

SnowNLP github地址:https://github.com/isnowfy/SnowNLP

# 安装
pip install SnowNLP

当然,我们也可以采用豆瓣源加速

pip install SnowNLP -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

二、SnowNLP 特性

简单说一下SnowNLP 的特性

  • 中文分词(Character-Based Generative Model)

  • 词性标注(TnT 3-gram 隐马)

  • 情感分析(官网没有介绍具体原理,但是指明购物类的评论的准确率较高,其实是因为它的语料库主要是购物方面的)

  • 文本分类(原理是朴素贝叶斯)

  • 转换成拼音 (Trie树实现的最大匹配)

  • 繁体转简体 (Trie树实现的最大匹配)

  • 提取文本关键词(TextRank算法)

  • 提取文本摘要(TextRank算法)

  • tf,idf

  • Tokenization(分割成句子)

  • 文本相似(BM25)

三、SnowNLP库的基本使用

from SnowNLP import SnowNLPword = u'这个姑娘真好看'
s = SnowNLP(word)
print(s.words)        # 分词
print(list(s.tags))   # 词性标注
print(s.sentiments)   # 情感分数
print(s.pinyin)       # 拼音
print(SnowNLP(u'蒹葭蒼蒼,白露為霜。所謂伊人,在水一方。').han)  # 繁体字转简体

运行结果如下:

['这个', '姑娘', '真', '好看']
[('这个', 'r'), ('姑娘', 'n'), ('真', 'd'), ('好看', 'a')]
0.9002381975487243
['zhe', 'ge', 'gu', 'niang', 'zhen', 'hao', 'kan']
蒹葭苍苍,白露为霜。所谓伊人,在水一方。

from SnowNLP import SnowNLPtext = u'''
自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。
它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。
自然语言处理是一门融语言学、计算机科学、数学于一体的科学。
因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,
所以它与语言学的研究有着密切的联系,但又有重要的区别。
自然语言处理并不是一般地研究自然语言,
而在于研制能有效地实现自然语言通信的计算机系统,
特别是其中的软件系统。因而它是计算机科学的一部分。
'''s = SnowNLP(text)print(s.keywords(limit=3))        # 关键词提取
print('--------------------------------')
summary = s.summary(limit=4)      # 文本概括
for i in summary:print(i)print('--------------------------------')print(s.sentences)        # 句子

运行结果如下:

['语言', '自然', '计算机']
--------------------------------
因而它是计算机科学的一部分
自然语言处理是计算机科学领域与人工智能领域中的一个重要方向
自然语言处理是一门融语言学、计算机科学、数学于一体的科学
所以它与语言学的研究有着密切的联系
--------------------------------
['自然语言处理是计算机科学领域与人工智能领域中的一个重要方向', '它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法', '自然语言处理是一门融语言学、计算机科学、数学于一体的科学', '因此', '这一领域的研究将涉及自然语言', '即人们日常使用的语言', '所以它与语言学的研究有着密切的联系', '但又有重要的区别', '自然语言处理并不是一般地研究自然语言', '而在于研制能有效地实现自然语言通信的计算机系统', '特别是其中的软件系统', '因而它是计算机科学的一部分']Process finished with exit code 0

# 评价词语对文本的重要程度
# TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
# TF词频越大越重要,但是文中会的“的”,“你”等无意义词频很大,却信息量几乎为0,这种情况导致单纯看词频评价词语重要性是不准确的。因此加入了idf
# IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t越重要
# TF-IDF综合起来,才能准确的综合的评价一词对文本的重要性。from SnowNLP import SnowNLPs = SnowNLP([[u'这篇', u'文章', u'写得', u'不错'],[u'那篇', u'论文', u'好'],[u'这个', u'东西', u'好吃']])
print(s.tf)     # tf 意思是词频(Term Frequency)
print('---------------------------------------------------')
print(s.idf)    # idf 意思是逆文本频率指数(Inverse Document Frequency)
print('-----------------------------------------------------')
# 文本相似度
print(s.sim([u'文章']))
print(s.sim([u'好']))

运行结果如下:

[{'这篇': 1, '文章': 1, '写得': 1, '不错': 1}, {'那篇': 1, '论文': 1, '好': 1}, {'这个': 1, '东西': 1, '好吃': 1}]
---------------------------------------------------
{'这篇': 0.5108256237659907, '文章': 0.5108256237659907, '写得': 0.5108256237659907, '不错': 0.5108256237659907, '那篇': 0.5108256237659907, '论文': 0.5108256237659907, '好': 0.5108256237659907, '这个': 0.5108256237659907, '东西': 0.5108256237659907, '好吃': 0.5108256237659907}
-----------------------------------------------------
[0.4686473612532025, 0, 0]
[0, 0.5348959411162205, 0]

# 关于训练
# 现在提供训练的包括分词,词性标注,情感分析,都是用的SnowNLP库自带的原始文件 以分词为例 分词在SnowNLP/seg目录下from SnowNLP import segsentiment.train('neg.txt', 'pos.txt')
seg.save('seg.marshal')# 这样训练好的文件就保存为seg.marshal了,之后修改SnowNLP/seg/__init__.py里的data_path指向刚训练好的文件即可

四、NLP测试

1. 获取数据

URL:https://item.jd.com/100000499657.html#none

爬取部分好评、中评和差评数据,分别保存到三个txt里。

import asyncio
import aiohttp
import re
import logging
import datetimelogging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
start = datetime.datetime.now()class Spider(object):def __init__(self):# 设置最大信号量self.semaphore = asyncio.Semaphore(6)# 伪装请求头self.header = {"Host": "club.jd.com","COOKIE": "shshshfpa=c003ed54-a640-d73d-ba32-67b4db85fd3e-1594895561; shshshfpb=i5%20TzLvWAV56AeaK%20C9q5ew%3D%3D; __jdu=629096461; unpl=V2_ZzNtbUVRFkZ8DUddfRxcBGIEE1hKXhBGIQEVVnNLD1IwBkBeclRCFnQUR1JnGloUZwEZXkZcQxVFCEdkeR1ZAmYBEV1yZ0IXJQ4SXS9NVAZiChAJQAdGFnJfRFQrGlUAMFdACUtVcxZ1OEdkfBpUBG8EF1pCZ3MVfQ92ZDBMAGshQlBtQldEEXAKTlZyGGwEVwMTWUFXQxZ1DkFkMHddSGAAGlxKUEYSdThGVXoYXQVkBBVeclQ%3d; __jdv=122270672|baidu|-|organic|not set|1596847892017; areaId=0; ipLoc-djd=1-72-55653-0; PCSYCityID=CN_0_0_0; __jda=122270672.629096461.1595821561.1596847892.1597148792.3; __jdc=122270672; shshshfp=4866c0c0f31ebd5547336a334ca1ef1d; 3AB9D23F7A4B3C9B=DNFMQBTRNFJAYXVX2JODGAGXZBU3L2TIVL3I36BT56BKFQR3CNHE5ZTVA76S56HSJ2TX62VY7ZJ2TPKNIEQOE7RUGY; jwotest_product=99; shshshsID=ba4014acbd1aea969254534eef9cf0cc_5_1597149339335; __jdb=122270672.5.629096461|3.1597148792; JSESSIONID=99A8EA65B8D93A7F7E8DAEE494D345BE.s1","Connection": "keep-alive","Referer": "https://item.jd.com/4803334.html","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"}async def scrape(self, url):async with self.semaphore:session = aiohttp.ClientSession(headers=self.header)response = await session.get(url)result = await response.text()await session.close()return resultasync def scrape_page(self, page):# 分别手动改变score参数 score=3 score=2 score=1  爬取好评 中评 差评数据url = f'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100000499657&score=3&sortType=6&page={page}&pageSize=10&isShadowSku=0&fold=1'text = await self.scrape(url)await self.parse(text)async def parse(self, text):# 正则匹配提取数据content = re.findall('"guid":".*?","content":"(.*?)"', text)# 保存到txtwith open('好评.txt', 'a+') as f:for con in content:f.write(con + '\n')logging.info(con)def main(self):# 爬取50页的数据scrape_index_tasks = [asyncio.ensure_future(self.scrape_page(page)) for page in range(0, 50)]loop = asyncio.get_event_loop()tasks = asyncio.gather(*scrape_index_tasks)loop.run_until_complete(tasks)if __name__ == '__main__':spider = Spider()spider.main()delta = (datetime.datetime.now() - start).total_seconds()print("用时:{:.3f}s".format(delta))

2. 处理数据

from pathlib import Path
import pandas as pd# 获取当前目录下 有好评 中评 差评数据的txt
p = Path(r'D:\python\pycharm2020\program\数据分析\中文情感分析')
review_txt = list(p.glob('**/*.txt'))
all_data = pd.DataFrame()
for item in review_txt:emotion = item.stem     # 获取文件名 除后缀的部分with Path(item).open(mode='r') as f:con = f.read().split('\n')data = pd.DataFrame({'评论内容': con, '标签': [emotion] * len(con)})all_data = all_data.append(data)all_data.to_excel('评论数据.xlsx', index=False)

3. NLP测试

from SnowNLP import SnowNLP
import pandas as pd
import re# 读取数据
df = pd.read_excel('评论数据.xlsx', encoding='utf-8')
# print(df.info())
# 去掉空值的列
df = df.dropna(axis=0)
content = df['评论内容']# 去除一些无用的字符   只提取出中文出来
content = [' '.join(re.findall('[\u4e00-\u9fa5]+', item, re.S)) for item in content]
scores = [SnowNLP(i).sentiments for i in content]
emotions = []
for i in scores:if i >&#61; 0.75:emotions.append(&#39;好评&#39;)elif 0.45 <&#61; i < 0.75:emotions.append(&#39;中评&#39;)else:emotions.append(&#39;差评&#39;)df[&#39;情感分数&#39;] &#61; scores
df[&#39;情感&#39;] &#61; emotions
df.to_excel(&#39;NLP测试后数据.xlsx&#39;)

import pandas as pddf &#61; pd.read_excel(&#39;NLP测试后数据.xlsx&#39;)
# 看准确率   通过SnowNLP情感打分 设置梯度得出的情感 好评 中评 差评 与实际标签相比较
data &#61; df[df[&#39;标签&#39;] &#61;&#61; df[&#39;情感&#39;]]
print(&#39;准确率为&#xff1a;{:.2%}&#39;.format(len(data) / len(df)))

运行结果

运行结果如下&#xff1a;
准确率为&#xff1a;71.56%Process finished with exit code 0

  • 准确率还可以&#xff0c;但还不算高&#xff0c;分析原因可能为如下方面&#xff1a;

  • 因为只是做练习、熟悉SnowNLP库的基本使用&#xff0c;通过情感打分和设置梯度来判断情感&#xff0c;没有自己构建该领域的语料库&#xff0c;如果构建了相关语料库&#xff0c;替换默认语料库&#xff0c;准确率会高很多。所以语料库是非常关键的&#xff0c;如果要正式进行文本挖掘&#xff0c;建议要构建自己的语料库。

  • 这个商品下的评论&#xff0c;中评、差评的界限比较模糊&#xff0c;每条评论的标签用的是爬取时默认标签&#xff1a;属于什么评论&#xff0c;没有人工去看&#xff0c;会有相当的误差&#xff0c;并且用于测试的数据量较小。

  • 对文本的处理也只是简单滤掉其他字符&#xff0c;提取中文。

作者&#xff1a;叶庭云
CSDN&#xff1a;https://blog.csdn.net/fyfugoyfa

本文相关源码&#43;数据下载

https://alltodata.cowtransfer.com/s/bf3dc2f3792144

程序员专栏 扫码关注填加客服 长按识别下方二维码进群

近期精彩内容推荐&#xff1a;  

 955.WLB不加班公司名单新增6家公司

 2020年10月程序员工资最新统计&#xff01;

 面试官问我创建线程有几种方式&#xff1f;我笑了

 python itchat库的使用


在看点这里好文分享给更多人↓↓


推荐阅读
  • 在 CentOS 7 系统中安装 Scrapy 时遇到了一些挑战。尽管 Scrapy 在 Ubuntu 上安装简便,但在 CentOS 7 上需要额外的配置和步骤。本文总结了常见问题及其解决方案,帮助用户顺利安装并使用 Scrapy 进行网络爬虫开发。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 如何使用mysql_nd:Python连接MySQL数据库的优雅指南
    无论是进行机器学习、Web开发还是爬虫项目,数据库操作都是必不可少的一环。本文将详细介绍如何使用Python通过 `mysql_nd` 库与 MySQL 数据库进行高效连接和数据交互。内容涵盖以下几个方面: ... [详细]
  • 掌握PHP编程必备知识与技巧——全面教程在当今的PHP开发中,了解并运用最新的技术和最佳实践至关重要。本教程将详细介绍PHP编程的核心知识与实用技巧。首先,确保你正在使用PHP 5.3或更高版本,最好是最新版本,以充分利用其性能优化和新特性。此外,我们还将探讨代码结构、安全性和性能优化等方面的内容,帮助你成为一名更高效的PHP开发者。 ... [详细]
  • 本文探讨了BERT模型在自然语言处理领域的应用与实践。详细介绍了Transformers库(曾用名pytorch-transformers和pytorch-pretrained-bert)的使用方法,涵盖了从模型加载到微调的各个环节。此外,还分析了BERT在文本分类、情感分析和命名实体识别等任务中的性能表现,并讨论了其在实际项目中的优势和局限性。 ... [详细]
  • 2019年斯坦福大学CS224n课程笔记:深度学习在自然语言处理中的应用——Word2Vec与GloVe模型解析
    本文详细解析了2019年斯坦福大学CS224n课程中关于深度学习在自然语言处理(NLP)领域的应用,重点探讨了Word2Vec和GloVe两种词嵌入模型的原理与实现方法。通过具体案例分析,深入阐述了这两种模型在提升NLP任务性能方面的优势与应用场景。 ... [详细]
  • 在Django中提交表单时遇到值错误问题如何解决?
    在Django项目中,当用户提交包含多个选择目标的表单时,可能会遇到值错误问题。本文将探讨如何通过优化表单处理逻辑和验证机制来有效解决这一问题,确保表单数据的准确性和完整性。 ... [详细]
  • Python默认字符解析:深入理解Python中的字符串处理
    在Python中,字符串是编程中最基本且常用的数据类型之一。尽管许多初学者是从C语言开始接触字符串,通常通过经典的“Hello, World!”程序入门,但Python对字符串的处理方式更为灵活和强大。本文将深入探讨Python中的字符串处理机制,包括字符串的创建、操作、格式化以及编码解码等方面,帮助读者全面理解Python字符串的特性和应用。 ... [详细]
  • 在探讨 MySQL 正则表达式 REGEXP 的功能与应用之前,我们先通过一个小实验来对比 REGEXP 和 LIKE 的性能。通过具体的代码示例,我们将评估这两种查询方式的效率,以确定 REGEXP 是否值得深入研究。实验结果将为后续的详细解析提供基础。 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • 通过使用七牛云存储服务,本文详细介绍了如何将本地图片高效上传至云端,并实现了内容的便捷管理。借助七牛云的 Python SDK,文章提供了从认证到文件上传的具体代码示例,包括导入必要的库、生成上传凭证以及处理文件路径等关键步骤。此外,还探讨了如何利用七牛云的 URL 安全编码功能,确保数据传输的安全性和可靠性。 ... [详细]
  • 点互信息在自然语言处理中的应用与优化
    点互信息(Pointwise Mutual Information, PMI)是一种用于评估两个事件之间关联强度的统计量,在自然语言处理领域具有广泛应用。本文探讨了 PMI 在词共现分析、语义关系提取和情感分析等任务中的具体应用,并提出了几种优化方法,以提高其在大规模数据集上的计算效率和准确性。通过实验验证,这些优化策略显著提升了模型的性能。 ... [详细]
  • 视觉图像的生成机制与英文术语解析
    近期,Google Brain、牛津大学和清华大学等多家研究机构相继发布了关于多层感知机(MLP)在视觉图像分类中的应用成果。这些研究深入探讨了MLP在视觉任务中的工作机制,并解析了相关技术术语,为理解视觉图像生成提供了新的视角和方法。 ... [详细]
  • 本文将深入探讨MySQL存储引擎的特性及其选择策略。在MySQL 5.1之前的版本中,存储引擎必须与MySQL一同编译和安装。自5.1版本起,存储引擎通过插件化接口实现,显著提升了灵活性和扩展性。文中详细分析了不同存储引擎的特点,如InnoDB、MyISAM等,并提供了针对具体应用场景的优化建议,帮助读者更好地理解和选择适合的存储引擎,以提升数据库的整体性能。 ... [详细]
author-avatar
温倩0918
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有