tidytextpy包 | 对《三体》进行情感分析

2024-01-04 01:20

本文主要是介绍tidytextpy包 | 对《三体》进行情感分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

腾讯课堂 | Python网络爬虫与文本分析

TidyTextPy

前天我分享了 tidytext | 耳目一新的R-style文本分析库 

但是tidytext不够完善,我在tidytext基础上增加了情感词典,可以进行情感计算,为了区别前者,将其命名为tidytextpy。

大家有时间又有兴趣,可以多接触下R语言,在文本分析及可视化方面,R的能力也不弱。

安装

pip install tidytextpy

实验数据

这里使用中文科幻小说《三体》为例子,含注释共213章,使用正则表达式构建三体小说数据集,该数据集涵

  • chapterid 第几章

  • title 章(节)标题

  • text 每章节的文本内容(分词后以空格间隔的文本,形态类似英文)

import pandas as pd
import jieba
import re
pd.set_option('display.max_rows', 6)raw_texts = open('三体.txt', encoding='utf-8').read()
texts = re.split('第\d+章', raw_texts)
texts = [text for text in texts if text]
#中文多了下面一行代码(构造用空格间隔的字符串)
texts = [' '.join(jieba.lcut(text)) for text in texts if text]
titles = re.findall('第\d+章 (.*?)\n', raw_texts)data = {'chapterid': list(range(1, len(titles)+1)),'title': titles,'text': texts}
df = pd.DataFrame(data)
df

tidytextpy库

  • get_stopwords 停用词表

  • get_sentiments 情感词典

  • unnest_tokens 分词函数

  • bind_tf_idf 计算tf-idf

停用词表

get_stopwords(language) 获取对应语言的停用词表,目前仅支持chinese和english两种语言

from tidytextpy import get_stopwordscn_stps = get_stopwords('chinese')
#前20个中文的停用词
cn_stps[:20]
['、','。','〈','〉','《','》','一','一些','一何','一切','一则','一方面','一旦','一来','一样','一般','一转眼','七','万一','三']
en_stps = get_stopwords()
#前20个英文文的停用词
en_stps[:20]
['i',
'me','my','myself','we','our','ours','ourselves','you','your','yours','yourself','yourselves','he','him','his','himself','she','her','hers']

情感词典

get_sentiments('词典名') 调用词典,返回词典的dataframe数据。

  • afinn sentiment取值-5到5

  • bing sentiment取值为positive或negative

  • nrc sentiment取值为positive或negative,及细粒度的情绪分类信息

  • dutir sentiment为中文七种情绪类别(细粒度情绪分类信息)

  • hownet sentiment为positive或negative

其中hownet和dutir为中文情感词典

from tidytextpy import get_sentiments#大连理工大学情感本体库,共七种情绪(sentiment)
get_sentiments('dutir')

sentimentword
0冷不防
1惊动
2珍闻
.........
27411匆猝
27412忧心仲忡
27413面面厮觑

27414 rows × 2 columns

get_sentiments('nrc')

wordsentiment
0abacustrust
1abandonfear
2abandonnegative
.........
13898zestpositive
13899zesttrust
13900zipnegative

13901 rows × 2 columns

分词

unnest_tokens(__data, output, input)

  • __data 待处理的dataframe数据

  • output 新生成的dataframe中,用于存储分词结果的字段名

  • input 待分词数据的字段名(待处理的dataframe数据)

from tidytextpy import unnest_tokenstokens = unnest_tokens(df, output='word', input='text')
tokens

chapteridtitleword
01科学边界(1)科学
01科学边界(1)边界
01科学边界(1)1
............
212213注释想到
212213注释暗物质
212213注释

556595 rows × 3 columns

各章节用词量

从这里开始会用到plydata的管道符>> 和相关的常用函数,建议大家遇到不懂的地方查阅plydata文档

from plydata import count, group_by, ungroupwordfreq = (df >> unnest_tokens(output='word', input='text') #分词>> group_by('chapterid')  #按章节分组>> count() #对每章用词量进行统计>> ungroup() #去除分组)wordfreq

chapteridn
012549
122666
231726
.........
2102112505
2112122646
2122132477

213 rows × 2 columns

章节用词量可视化

使用plotnine进行可视化

from plotnine import ggplot, aes, theme, geom_line, labs, theme, element_text
from plotnine.options import figure_size(ggplot(wordfreq, aes(x='chapterid', y='n'))+geom_line()+labs(title='三体章节用词量折线图',x='章节', y='用词量')+theme(figure_size=(12, 8),title=element_text(family='Kai', size=15), axis_text_x=element_text(family='Kai'),axis_text_y=element_text(family='Kai'))
)


情感分析

重要的事情多重复一遍o( ̄︶ ̄)o

get_sentiments('词典名') 调用词典,返回词典的dataframe数据。

  • afinn sentiment取值-5到5

  • bing sentiment取值为positive或negative

  • nrc sentiment取值为positive或negative,及细粒度的情绪分类信息

  • dutir sentiment为中文七种情绪类别(细粒度情绪分类信息)

  • hownet sentiment为positive或negative

其中hownet和dutir为中文情感词典

情感计算

这里会用到plydata的很多知识点,大家可以查看https://plydata.readthedocs.io/en/latest/index.html 相关函数的文档。

from plydata import inner_join, count, define, call
from plydata.tidy import spreadchapter_sentiment_score = (df #分词>> unnest_tokens(output='word', input='text') >> inner_join(get_sentiments('hownet')) #让分词结果与hownet词表交集,给每个词分配sentiment>> count('chapterid', 'sentiment')#统计每章中每类sentiment的个数>> spread('sentiment', 'n') #将sentiment中的positive和negative转化为两列>> call('.fillna', 0) #将缺失值替换为0>> define(score = '(positive-negative)/(positive+negative)') #计算每一章的情感分score
)chapter_sentiment_score

chapteridnegativepositivescore
0193.056.0-0.248322
1298.083.0-0.082873
2354.037.0-0.186813
...............
21021156.073.00.131783
21121271.067.0-0.028986
21221375.074.0-0.006711

213 rows × 4 columns

三体小说情感走势

我记得看完《三体》后,很悲观,觉得人类似乎永远逃不过宇宙的时空规律,心情十分压抑。如果对照小说进行章节的情感分析,应该整体情感分的走势大多在0以下。

from plotnine import ggplot, aes, geom_line, element_text, labs, theme(ggplot(chapter_sentiment_score, aes('chapterid', 'score'))+geom_line()+labs(x='章节', y='情感值score', title='《三体》小说情感走势图')+theme(title=element_text(family='Kai'))
)


tf-idf

相比之前的代码,bind_tf_idf运行起来很慢很慢,《三体》数据量大,所以这里用别的数据做实验。

tf-idf实验数据

import pandas as pd
pd.set_option('display.max_rows', 6)zen = """
The Zen of Python, by Tim PetersBeautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
"""zen_split = zen.splitlines()df = pd.DataFrame({'docid': list(range(len(zen_split))),'text': zen_split})df

docidtext
00
11The Zen of Python, by Tim Peters
22
.........
1919If the implementation is hard to explain, it's...
2020If the implementation is easy to explain, it m...
2121Namespaces are one honking great idea -- let's...

22 rows × 2 columns

bind_tf_idf

tf表示词频,idf表示词语在文本中的稀缺性,两者的结合体现了一个词的信息量。找出小说中tf-idf最大的词。

bind_tf_idf(_data, term, document, n)

  • _data 传入的df

  • term df中词语对应的字段名

  • document df中文档id的字段名

  • n df中词频数对应的字段名

from tidytextpy import bind_tf_idf
from plydata import count, group_by, ungrouptfidfs = (df>> unnest_tokens(output='word', input='text')>> count('docid', 'word')>> bind_tf_idf(term='word', document='docid', n='n'))tfidfs

docidwordntfidftf_idf
01the10.1428571.3862940.198042
11zen10.1428572.9957320.427962
21of10.1428571.8971200.271017
.....................
13721more10.0909092.9957320.272339
13821of10.0909091.8971200.172465
13921those10.0909092.9957320.272339

140 rows × 6 columns

近期文章

[更新] Python网络爬虫与文本数据分析 
tidytext | 耳目一新的R-style文本分析库rpy2库 | 在jupyter中调用R语言代码
plydata库 | 数据操作管道操作符>>
plotnine: Python版的ggplot2作图库七夕礼物 | 全网最火的钉子绕线图制作教程读完本文你就了解什么是文本分析文本分析在经管领域中的应用概述  
综述:文本分析在市场营销研究中的应用plotnine: Python版的ggplot2作图库
小案例: Pandas的apply方法  
stylecloud:简洁易用的词云库 
用Python绘制近20年地方财政收入变迁史视频  
Wow~70G上市公司定期报告数据集漂亮~pandas可以无缝衔接Bokeh  
YelpDaset: 酒店管理类数据集10+G  
后台回复关键词【20200822】获取本文代码
  • 分享”和“在看”是更好的支持!


这篇关于tidytextpy包 | 对《三体》进行情感分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/567713

相关文章

Pandas使用AdaBoost进行分类的实现

《Pandas使用AdaBoost进行分类的实现》Pandas和AdaBoost分类算法,可以高效地进行数据预处理和分类任务,本文主要介绍了Pandas使用AdaBoost进行分类的实现,具有一定的参... 目录什么是 AdaBoost?使用 AdaBoost 的步骤安装必要的库步骤一:数据准备步骤二:模型

使用Pandas进行均值填充的实现

《使用Pandas进行均值填充的实现》缺失数据(NaN值)是一个常见的问题,我们可以通过多种方法来处理缺失数据,其中一种常用的方法是均值填充,本文主要介绍了使用Pandas进行均值填充的实现,感兴趣的... 目录什么是均值填充?为什么选择均值填充?均值填充的步骤实际代码示例总结在数据分析和处理过程中,缺失数

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Java中使用Hutool进行AES加密解密的方法举例

《Java中使用Hutool进行AES加密解密的方法举例》AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个,下面:本文主要介绍Java中使用Hutool进行AES加密解密的相关资料... 目录前言一、Hutool简介与引入1.1 Hutool简介1.2 引入Hutool二、AES加密解密基础

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

SpringSecurity6.0 如何通过JWTtoken进行认证授权

《SpringSecurity6.0如何通过JWTtoken进行认证授权》:本文主要介绍SpringSecurity6.0通过JWTtoken进行认证授权的过程,本文给大家介绍的非常详细,感兴趣... 目录项目依赖认证UserDetailService生成JWT token权限控制小结之前写过一个文章,从S