實體詞典 情感詞典_tidytextpy包 | 對三體進行情感分析

騰訊課堂 |?Python網絡爬蟲與文本分析

TidyTextPy

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

但是tidytext不夠完善,我在tidytext基礎上增加了情感詞典,可以進行情感計算,為了區別前者,將其命名為tidytextpy。

大家有時間又有興趣,可以多接觸下R語言,在文本分析及可視化方面,R的能力也不弱。

6b6d06a66f43dc05d141ae7c6a184dd8.png

安裝

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

fad131cdf1b1cb9afc374907aa8454b5.png

a0a15b3270cb50a3808dad9fca7cb012.png

tidytextpy庫

  • get_stopwords 停用詞表
  • get_sentiments 情感詞典
  • unnest_tokens 分詞函數
  • bind_tf_idf 計算tf-idf

停用詞表

get_stopwords(language) 獲取對應語言的停用詞表,目前僅支持chinese和english兩種語言

from?tidytextpy?import?get_stopwords

cn_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_tokens

tokens?=?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,?ungroup


wordfreq?=?(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'))
)

1cdf07b636d51d1de87d43e3e17fd3be.png


情感分析

重要的事情多重復一遍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 相關函數的文檔。

b87476ae998d7c62584dcf592c487bb2.gif

from?plydata?import?inner_join,?count,?define,?call
from?plydata.tidy?import?spread

chapter_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'))
)

bbababccdee8b4807ac940ea83e4615b.png


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?Peters
Beautiful?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,?ungroup

tfidfs?=?(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】獲取本文代碼
分享”和“在看”是更好的支持!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453916.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453916.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453916.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TensorFlow實現LeNet5模型

# -*- coding: utf-8 -*-import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data# 獲取mnist數據mnist input_data.read_data_sets("MNIST_data/", one_hotTrue)# 注冊默認session 后面操作無需指定session 不同sesson之間的數據是獨立…

Python基礎第一天

一、內容 二、練習 練習1 題目&#xff1a;使用while循環輸出1 2 3 4 5 6 8 9 10 方法一&#xff1a; 圖示&#xff1a; 代碼&#xff1a; count 1 while count < 11:if count ! 7:print(count)count 1輸出結果&#xff1a; 1 2 3 4 5 6 8 9 10 View Code方法二&#xff1…

python flask 上傳下載 api_Flask 文件下載API

給前端提供一個文件下載接口時, 遇到了文件名亂碼的問題, 幾經折騰總算實現效果, 代碼如下:import requestsfrom flask import Response, jsonify, request, stream_with_contextfrom flask_login import login_requiredfrom . import bpfrom .models import Coursewarebp.rout…

OpenGL實用開源代碼列表

有了網絡的最大好處就是可以資源共享。網絡是最大的知識庫&#xff0c;也是最好的老師&#xff0c;正所謂“沒有你想不到的&#xff0c;只有你找不到的”。以下是我收集的以游戲編程&#xff0c;OpenGL 3D編程相關的免費擴展庫資料。不斷更新中&#xff0c;如果你有好的建義&am…

vaOJ10369 - Arctic Network

1 /*2 The first line of each test case contains 1 < S < 100, the number of satellite channels!3 注意&#xff1a;S表示一共有多少個衛星&#xff0c;那么就是有 最多有S-1個通道&#xff01; 然后將最小生成樹中的后邊的 S-1通道去掉就行了&#xff01; 4…

python-kafka 常用 api 匯總

簡介 python連接kafka的標準庫&#xff0c;kafka-python和pykafka。kafka-python使用的人多是比較成熟的庫&#xff0c;kafka-python并沒有zk的支持。pykafka是Samsa的升級版本&#xff0c;使用samsa連接zookeeper&#xff0c;生產者直接連接kafka服務器列表&#xff0c;消費者…

scp選擇二進制_二進制傳輸與文本傳輸區別

Ftp&#xff0c;winscp等工具下載文件時候有選項&#xff0c;可選的有二進制方式和文本方式。文本方式又稱為ASCII方式兩者區別如下。ASCII 方式和BINARY方式的區別是回車換行的處理&#xff0c;binary方式不對數據執行任何處理&#xff0c;ASCII 方式將回車換行轉換為本機的回…

在ffmpeg中加入x264模塊

引言&#xff1a;最近一直致力于多媒體應用開發&#xff0c;一說起編碼解碼就不得不說下FFmpeg。FFmpeg是一個集錄制、轉換、音/視頻編碼解碼功能為一體的完整的開源解決方案。FFmpeg的開發是基于Linux操作系統&#xff0c;但是可以在大多數操作系統中編譯和使用。下面就詳細介…

RabbitMQ實例教程:發布/訂閱者消息隊列

消息交換機&#xff08;Exchange&#xff09; RabbitMQ消息模型的核心理念是生產者永遠不會直接發送任何消息給隊列&#xff0c;一般的情況生產者甚至不知道消息應該發送到哪些隊列。 相反的&#xff0c;生產者只能發送消息給交換機&#xff08;Exchange&#xff09;。交換機的…

OAuth 2.0(網轉)

&#xff08;一&#xff09;背景知識 OAuth 2.0很可能是下一代的“用戶驗證和授權”標準&#xff0c;目前在國內還沒有很靠譜的技術資料。為了弘揚“開放精神”&#xff0c;讓業內的人更容易理解“開放平臺”相關技術&#xff0c;進而長遠地促進國內開放平臺領域的發展&#xf…

kafka 自動提交 和 手動提交

Consumer 需要向 Kafka 匯報自己的位移數據&#xff0c;這個匯報過程被稱為提交位移&#xff08;Committing Offsets&#xff09;。因為 Consumer 能夠同時消費多個分區的數據&#xff0c;所以位移的提交實際上是在分區粒度上進行的&#xff0c;即 Consumer 需要為分配給它的每…

axios vue 回調函數_vue中ajax請求與axios包完美處理

這次給大家帶來vue中ajax請求與axios包完美處理&#xff0c;vue中ajax請求與axios包處理的注意事項有哪些&#xff0c;下面就是實戰案例&#xff0c;一起來看一下。在vue中&#xff0c;經常會用到數據請求&#xff0c;常用的有&#xff1a;vue-resourse、axios今天我說的是axio…

用int還是用Integer?

昨天例行code review時大家有討論到int和Integer的比較和使用。 這里做個整理&#xff0c;發表一下個人的看法。【int和Integer的區別】int是java提供的8種原始類型之一&#xff0c;java為每個原始類型提供了封裝類&#xff0c;Integer是int的封裝類。int默認值是0&#xff0c;…

前端之 JavaScript 常用數據類型和操作

JavaScript 常用數據類型有&#xff1a;數字、字符串、布爾、Null、Undefined、對象 JavaScript 擁有動態類型 JavaScript 擁有動態類型。這意味著相同的變量可用作不同的類型 var x; // 此時x是undefined var x 1; // 此時x是數字 var x "Alex" …

mysql備份還原(視圖、存儲過程)

最近在備份還原mysql的時候發現&#xff0c;視圖還原報錯&#xff0c;無法創建視圖&#xff0c;在網上查了下資料&#xff0c;找到以下信息&#xff1a;1、如果備份的數據庫含有視圖,還原時需要把my.ini中的character-set改為latin1,才能夠還原視圖。2、還原后,需要把latin1改為…

有關javabean的說法不正確的是_關于 JavaBean, 下列敘述中不正確的是 ( ) 。_學小易找答案...

【填空題】在使用 URL 傳值時傳輸的數據只能是 類型。【簡答題】陶器是人類最偉大的發明,比四大發明更有意義,你如何認為?(手機上直接回答提交)【單選題】對于 ( ) 作用范圍的 Bean, 當客戶離開這個頁面時 JSP 引擎取消為客戶的該頁 面分配的 Bean, 釋放他所占的內存空間。【填…

Postgres中tuple的組裝與插入

1.相關的數據類型 我們先看相關的數據類型&#xff1a; HeapTupleData(src/include/access/htup.h) typedef struct HeapTupleData {uint32 t_len; /* length of *t_data */ItemPointerData t_self; /* SelfItemPointer */Oid t_tableOid; /* ta…

Python 自動生成環境依賴包 requirements

一、生成當前 python 環境 安裝的所有依賴包 1、命令 # cd 到項目路徑下&#xff0c;執行以下命令 pip freeze > requirements.txt# 或者使用如下命令 pip list --formatfreeze > requirements.txt 2、常見問題 1、中使用 pip freeze > requirements.txt 命令導出…

DenyHosts 加固centos系統安全

DenyHosts是Python語言寫的一個程序&#xff0c;它會分析sshd的日志文件&#xff08;/var/log/secure&#xff09;&#xff0c;當發現重 復的攻擊時就會記錄IP到/etc/hosts.deny文件&#xff0c;從而達到自動屏IP的功能 DenyHosts官方網站 http://denyhosts.sourceforge.net 下…

在windows xp下編譯出ffmpeg.exe

找了好多資料&#xff0c;把自己的編譯成功過程詳細敘述&#xff0c;以避免后來者可以少浪費點時間。 1.安裝MSys 到http://sourceforge.net/project/showfiles.php?group_id2435下載文件&#xff1a;   bash-3.1-MSYS-1.0.11-tar.bz2   msysCORE-1.0.11-2007.01.19-1.ta…