分享

如何对微博推文进行情绪分析(细粒度情感分析)

 大邓的Python 2021-02-23

倒计时2天|Python&Stata数据分析课寒假工作坊 

文本的情绪分析




常见的文本分析,如情感分析,主要计算文本的积极情绪和消极情绪得分。

但是当文本中富含情绪,如喜怒哀乐等不同的情绪的时候,可以进行更细粒度的情绪分析。之前分享过 NRC词语情绪词典和词语色彩词典,但是没有教大家怎么使用。

今天使用两个数据

  • 数据集 simplifyweibo4moods.csv

  • 词典NRC词典, 包括喜怒哀乐等8种情绪

读取微博数据





simplifyweibo4moods.csv数据太大,

咱们使用小样本smallsimplifyweibo4_moods.csv

  1. import pandas as pd

  2. df = pd.read_csv('small_simplifyweibo_4_moods.csv')

  3. df.head()

查看四种情绪的分布情况

  1. import matplotlib.pyplot as plt

  2. df.label.value_counts().plot(kind='pie')

  3. plt.show()

NRC情绪词典





其中NRC词典为加拿大国家研究委员会信息技术研究所(Institute for Information Technology, National Research Council Canada. )组织制作的基于众包方式标注出的词典。

https://www./WebPages/NRC-Emotion-Lexicon.htm

参考文献

Mohammad, Saif M., and Peter D. Turney. "Crowdsourcing a word–emotion association lexicon." Computational Intelligence 29, no. 3 (2013): 436-465.

下面我们读取 NRC-Emotion-Lexicon-v0.92-InManyLanguages-web.xlsx

  1. import pandas as pd

  2. lexion_df = pd.read_excel('NRC-Emotion-Lexicon-v0.92-InManyLanguages-web.xlsx')

  3. lexion_df.head()

支持的语言





支持41种语言,包括

  • 英语

  • 法语

  • 阿拉伯语

  • 德语

  • 俄罗斯语

  • 中文(简体、繁体)

英文是标注的,其他语言是根据google tranlate将对应的英文翻译为其他语言。

  1. lexion_df.columns

  1. Index(['English Word', 'Arabic Translation (Google Translate)',

  2. 'Basque Translation (Google Translate)',

  3. 'Bengali Translation (Google Translate)',

  4. 'Catalan Translation (Google Translate)',

  5. 'Chinese (simplified) Translation (Google Translate)',

  6. 'Chinese (traditional) Translation (Google Translate)',

  7. 'Danish Translation (Google Translate)',

  8. 'Dutch Translation (Google Translate)',

  9. 'Esperanto Translation (Google Translate)',

  10. 'Finnish Translation (Google Translate)',

  11. 'French Translation (Google Translate)',

  12. 'German Translation (Google Translate)',

  13. 'Greek Translation (Google Translate)',

  14. 'Gujarati Translation (Google Translate)',

  15. 'Hebrew Translation (Google Translate)',

  16. 'Hindi Translation (Google Translate)',

  17. 'Irish Translation (Google Translate)',

  18. 'Italian Translation (Google Translate)',

  19. 'Japanese Translation (Google Translate)',

  20. 'Latin Translation (Google Translate)',

  21. 'Marathi Translation (Google Translate)',

  22. 'Persian Translation (Google Translate)',

  23. 'Portuguese Translation (Google Translate)',

  24. 'Romanian Translation (Google Translate)',

  25. 'Russian Translation (Google Translate)',

  26. 'Somali Translation (Google Translate)',

  27. 'Spanish Translation (Google Translate)',

  28. 'Sudanese Translation (Google Translate)',

  29. 'Swahili Translation (Google Translate)',

  30. 'Swedish Translation (Google Translate)',

  31. 'Tamil Translation (Google Translate)',

  32. 'Telugu Translation (Google Translate)',

  33. 'Thai Translation (Google Translate)',

  34. 'Turkish Translation (Google Translate)',

  35. 'Ukranian Translation (Google Translate)',

  36. 'Urdu Translation (Google Translate)',

  37. 'Vietnamese Translation (Google Translate)',

  38. 'Welsh Translation (Google Translate)',

  39. 'Yiddish Translation (Google Translate)',

  40. 'Zulu Translation (Google Translate)', 'Positive', 'Negative', 'Anger',

  41. 'Anticipation', 'Disgust', 'Fear', 'Joy', 'Sadness', 'Surprise',

  42. 'Trust'],

  43. dtype='object')

中文情绪词列表构建





之前的研究认为,尽管投资者一次对包含重大变化的财务报

  1. chinese_df = lexion_df[['Chinese (simplified) Translation (Google Translate)', 'Positive', 'Negative',

  2. 'Anger','Anticipation', 'Disgust', 'Fear', 'Joy', 'Sadness', 'Surprise', 'Trust']]

  3. chinese_df.head()

构建情感词列表

  1. Positive = []

  2. Negative = []

  3. Anger = []

  4. Anticipation = []

  5. Disgust = []

  6. Fear = []

  7. Joy = []

  8. Sadness = []

  9. Surprise = []

  10. Trust = []

  11. for idx, row in chinese_df.iterrows():

  12. if row['Positive']==1:

  13. Positive.append(row['Chinese (simplified) Translation (Google Translate)'])

  14. if row['Negative']==1:

  15. Negative.append(row['Chinese (simplified) Translation (Google Translate)'])

  16. if row['Anger']==1:

  17. Anger.append(row['Chinese (simplified) Translation (Google Translate)'])

  18. if row['Anticipation']==1:

  19. Anticipation.append(row['Chinese (simplified) Translation (Google Translate)'])

  20. if row['Disgust']==1:

  21. Disgust.append(row['Chinese (simplified) Translation (Google Translate)'])

  22. if row['Fear']==1:

  23. Fear.append(row['Chinese (simplified) Translation (Google Translate)'])

  24. if row['Joy']==1:

  25. Joy.append(row['Chinese (simplified) Translation (Google Translate)'])

  26. if row['Sadness']==1:

  27. Sadness.append(row['Chinese (simplified) Translation (Google Translate)'])

  28. if row['Surprise']==1:

  29. Surprise.append(row['Chinese (simplified) Translation (Google Translate)'])

  30. if row['Trust']==1:

  31. Trust.append(row['Chinese (simplified) Translation (Google Translate)'])

  32. print('词语列表构建完成')

  1. 词语列表构建完成

设计文本情绪计算函数





  1. import jieba

  2. import time

  3. def emotion_caculate(text):

  4. positive = 0

  5. negative = 0

  6. anger = 0

  7. anticipation = 0

  8. disgust = 0

  9. fear = 0

  10. joy = 0

  11. sadness = 0

  12. surprise = 0

  13. trust = 0

  14. wordlist = jieba.lcut(text)

  15. wordset = set(wordlist)

  16. wordfreq = []

  17. for word in wordset:

  18. freq = wordlist.count(word)

  19. if word in Positive:

  20. positive+=freq

  21. if word in Negative:

  22. negative+=freq

  23. if word in Anger:

  24. anger+=freq

  25. if word in Anticipation:

  26. anticipation+=freq

  27. if word in Disgust:

  28. disgust+=freq

  29. if word in Fear:

  30. fear+=freq

  31. if word in Joy:

  32. joy+=freq

  33. if word in Sadness:

  34. sadness+=freq

  35. if word in Surprise:

  36. surprise+=freq

  37. if word in Trust:

  38. trust+=freq

  39. emotion_info = {

  40. 'positive': positive,

  41. 'negative': negative,

  42. 'anger': anger,

  43. 'anticipation': anticipation,

  44. 'disgust': disgust,

  45. 'fear':fear,

  46. 'joy':joy,

  47. 'sadness':sadness,

  48. 'surprise':surprise,

  49. 'trust':trust,

  50. 'length':len(wordlist)

  51. }

  52. indexs = ['length', 'positive', 'negative', 'anger', 'anticipation','disgust','fear','joy','sadness','surprise','trust']

  53. return pd.Series(emotion_info, index=indexs)

  1. emotion_caculate(text='这个国家再对这些制造假冒伪劣食品药品的人手软的话,那后果真的会相当糟糕。坐牢?从快判个死刑')

  1. length 25

  2. positive 1

  3. negative 2

  4. anger 1

  5. anticipation 0

  6. disgust 1

  7. fear 1

  8. joy 0

  9. sadness 1

  10. surprise 0

  11. trust 2

  12. dtype: int64

  1. start = time.time()

  2. #df['review']整体为series类型。

  3. #series有apply方法

  4. emotion_df = df['review'].apply(emotion_caculate)

  5. end = time.time()

  6. print(end-start)

  7. emotion_df.head()

series数据变为dataframe,详情可了解下apply

 理解pandas中的apply和map的作用和异同   

输出分析结果





将原始数据与分析结果合并, 输出到新的csv中。

  1. output_df = pd.concat([df, emotion_df], axis=1)

  2. output_df.to_csv('output.csv', index=False)

  3. output_df.head()

检查





我们查看一下随机抽查一下,看看

  • 最fear

  • 最positive

  • 最negative 的分别是什么内容

  1. fear = output_df.sort_values(by='fear',ascending=False)

  2. fear.head()

  1. #这是什么鬼

  2. fear = output_df.sort_values(by='fear',ascending=False)

  3. print(fear.iloc[0, :]['review'])

Run

  1. 神哪,为什么咧~ ~ ~ 难道我要一辈子工作狂下去么。。。

  2. 12星座内心依赖症】★白羊—工作依赖★金牛—味觉依赖★

  3. 双子—用脑依赖★巨蟹—收藏依赖★狮子—争夺依赖★处女—清洁依赖

  4. ★天秤—交友依赖★天蝎—身体依赖★射手—跳槽依赖★魔羯

  5. —自我批评依赖★水瓶—友情依赖★双鱼—伤情依赖

  1. negative = output_df.sort_values(by='negative',ascending=False)

  2. print(negative.iloc[0, :]['review'])

Run

  1. 这个图原来这么熟悉!我一条都没有。原来有一种病叫“恋爱恐惧症”,你有吗?

  2. 症状一:怕爱上别人

  3. 症状二:怕爱上别人后会深陷

  4. 症状三:怕受伤

  5. 症状四:怕被拒绝

  6. 症状五:怕在最爱的当下失去

  7. 症状六:怕恋爱让人失去自我

  8. 症状七:怕伤害别人

  9. 症状八:怕自己丢失一颗爱自由的心

  10. 症状九:怕恋爱后再也回不到以前

  11. 症状十:怕自己爱对方比对方爱自己还多

  1. positive = output_df.sort_values(by='positive',ascending=False)

  2. print(positive.iloc[0, :]['review'])

Run

  1. 《劳动合同法》确有荒诞之处,但就此认为中国经济必须继续依靠廉价劳动力,就更荒诞了。

  2. 提高劳动力价格,会使不少企业不堪成本破产,继而减少工作岗位,最终对劳动者不利。

  3. 但关键不在继续压低劳动力价格,而在减轻企业别的负担:沉重税收各项收费政策不公承担本该ZF

  4. 承担的责“《劳动合同法》实施之前,集团公司请了一位劳动法专家给我们讲课,这位专家自己也有一家小公司。

  5. 专家痛心疾首地说,劳动力价格便宜是中国最大的核心竞争力,都像劳动合同法这样瞎搞,

  6. 这个优势很快就会不复存在,中国的经济发展必将受到阻碍。”

最正面的不太对啊,再看看第二最positive的

  1. positive = output_df.sort_values(by='positive',ascending=False)

  2. print(positive.iloc[1, :]['review'])

Run

  1. 真正懂得欣赏美味的人,一定是懂得生活的人。谢谢老师的分享,遇见一本优雅诚恳的好书是我们的幸运,

  2. 也欢迎你多分享旅途中的精神食粮给大家!中信书店正策划一系列美味文化的活动,有机会真诚邀请叶老师一起合作哦!

  3. 呵~發 有書 店微博今天選 我的《極 致之味》。感謝 了!美味。

  4. 葡萄酒要伊甘酒庄还是玛歌酒庄?火腿是西班牙的伊比利火腿,还是意大利吉贝罗火腿?

  5. 盐用布列塔尼盖朗地区的盐之花,还是冲绳的粟国之盐?

  6. 《极致之味》中会告诉你如何一层层抽丝剥茧地追索视觉嗅觉味觉触觉上每一分毫的微妙变化。

分析结束

Tips





使用这个NRC,最好是英文数据,毕竟是用英文数据英文场景英语母语者标注的情绪词典。其他语言虽然能进行情绪分析,但因为是从英文中翻译过来的,存在一定的问题

近期文章





Python数据采集与文本分析(学术)

2020年B站跨年晚会弹幕内容分析

综述:文本分析在市场营销研究中的应用

Lazy Prices公司年报内容变动碰上股价偷懒

使用pandas做数据可视化

用statsmodels库做计量分析

YelpDaset: 酒店管理类数据集10+G

NRC词语情绪词典和词语色彩词典

Loughran&McDonald金融文本情感分析库

股评师分析报告文本情感分析预测股价

使用分析师报告中含有的情感信息预测上市公司股价变动

【公开视频课】Python语法快速入门

【公开视频课】Python爬虫快速入门

一行pandas代码生成哑变量

使用Python读取图片中的文本数据

代码不到40行的超燃动态排序图

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多