查看原文
其他

可视化 | 睡前消息的社会化抚养、科学技术话题可视化

大邓 大邓和他的Python
2024-09-09


我的信仰是科学的唯物史观,虽然一直觉得爷爷是伟人,但是没有系统钻研小本本,所以似懂非懂,好在有睡前消息这个节目,可以时不时的聆听到半个世纪前的伟人智慧。


一、读取数据

睡前消息是我最喜欢看的节目, 基本上隔两天不看睡不踏实。本次分享,不涉及观点之争,纯属技术玩乐。  数据集下载请点击 | 将睡前消息文稿整理至一个csv中

import pandas as pd


bed_df = pd.read_csv('bedtime_news.csv', converters={'date': str})
bed_df.date = pd.to_datetime(bed_df.date)
bed_df.head()


#数据集起始日期
print(str(bed_df['date'].min())[:10])
print(str(bed_df['date'].max())[:10])

Run

2019-07-12
2022-11-29

#数据集含有的节目数
len(bed_df)

Run

522


二、准备工作

2.1 自定义词典

  • 科学、技术
  • 社会化抚养
  • 债务、独山县
  • 中医、以岭药业

将感兴趣的词加入到jieba自定义词典中,防止被错分。

import jieba

diywords = ['科学''技术''社会化抚养''债务''独山县''毛选''唯物''社会实验']
for word in diywords:
    jieba.add_word(word)

2.2 word_in_context

在这里定义了一个word_in_context函数,可以查看某些关键词上下文环境。

import jieba
import re
from nltk.tokenize import word_tokenize
import pandas as pd
import warnings


def word_in_context(text, keywords, window=3, lang='chinese'):
    if lang=='chinese':
        words = jieba.lcut(text.lower())
    else:
        try:
            words = word_tokenize(text.lower())
        except:
            warnings.warn("你应该安装nltk和对应的nltk_data, 请看B站https://www.bilibili.com/video/BV14A411i7DB")
            words = text.lower().split(' ')
    keywords = [w.lower() for w in keywords]
    kw_idxss = [[i for i, x in enumerate(words) if x == keyword] for keyword in keywords]
    rows = []
    for keyword, kw_idxs in zip(keywords, kw_idxss):
        for idx in kw_idxs:
            half = int((window-1)/2)
            start = max(0, idx - half)
            end = min(len(words), idx + half + 1)
            row = {'keyword': keyword, 
                   'context'''.join(words[start: end]) if lang=='chinese' else ' '.join(words[start: end])
                      }
            rows.append(row)
    df = pd.DataFrame(rows)
    return df


#测试【打算】前后上下文5个单词
word_in_context(text='根本没打算过真抓到人,当然也不打算付钱。转发推送:还有一个话题'
                keywords=['打算'], 
                window=5
                lang='chinese')

2.3 词云图

pip install pyecharts==2.0.1

def plot_wordcloud(df, title):
    import pyecharts.options as opts
    from pyecharts.charts import WordCloud
    text = ''.join(df['context'])
    text = ''.join(re.findall('[\u4e00-\u9fa5]+', text))
    words = jieba.lcut(text)
    words = [w for w in words if len(w)>=2]
    wordfreqs = []
    for word in set(words):
        freq = words.count(word)
        wordfreqs.append((word, freq))
    wordfreqs = sorted(wordfreqs, key=lambda k:k[1], reverse=True)
    wordfreqs = [(w, str(f)) for w,f in wordfreqs]
    cloud = WordCloud()
    cloud.add(series_name="", data_pair=wordfreqs, word_size_range=[20100])
    cloud.set_global_opts(title_opts=opts.TitleOpts(title=title, 
                                                    title_textstyle_opts=opts.TextStyleOpts(font_size=23)),
                          tooltip_opts=opts.TooltipOpts(is_show=True))
    cloud.render('{}.html'.format(title))
    return cloud.render_notebook()



三、话题分析

相比LDA机器学习算法的晦涩难懂,其实可以用word_in_context对指定关键词进行定位和分析,数据处理的过程清晰透明。

3.1 Topic-社会化抚养

dfs = []
for idx, row in bed_df.iterrows():
    df = word_in_context(text=row['text'], 
                            keywords=['社会化抚养'], 
                            window=50)
    df['date'] = row['date']
    dfs.append(df)
    
topic_df = pd.concat(dfs, axis=0)
topic_df


#涉及该主题的节目数
len(topic_df['date'].unique())

Run

65

#占比
len(topic_df['date'].unique())/len(bed_df)

Run

0.12452107279693486

在咱们这个数据集中,睡前消息500多期节目中,有65期谈及社会化抚养的,比例12%。


plot_wordcloud(df=topic_df, title='社会化抚养')


3.2 Topic-科学技术

dfs2 = []
for idx, row in bed_df.iterrows():
    df = word_in_context(text=row['text'], 
                            keywords=['科学''技术'], 
                            window=50)
    df['date'] = row['date']
    dfs2.append(df)
    
topic_df2 = pd.concat(dfs2, axis=0)
topic_df2


#涉及该主题的节目数
len(topic_df2['date'].unique())

Run

411

#占比
len(topic_df2['date'].unique())/len(bed_df)

Run

0.7873563218390804

在咱们这个数据集中,睡前消息500多期节目中,有411期谈及社会化抚养的,比例79%。


plot_wordcloud(df=topic_df, title='科学技术')


3.3 科学社会

面对社会问题,睡前消息倡导科学社会实验, 也喜欢讲毛选语录, 两者所涉及的是唯物的观点,科学社会的观点。放在一起试试

dfs3 = []
for idx, row in bed_df.iterrows():
    df = word_in_context(text=row['text'], 
                            keywords=['毛选''唯物''社会实验'], 
                            window=100)
    df['date'] = row['date']
    dfs3.append(df)
    
topic_df3 = pd.concat(dfs3, axis=0)
topic_df3


#涉及该主题的节目数
len(topic_df3['date'].unique())

Run

14

len(topic_df3['date'].unique())/len(bed_df)

Run

0.02681992337164751

plot_wordcloud(df=topic_df3, title='科学社会')



精选文章

管理世界 | 使用文本分析词构建并测量短视主义

管理世界 | 使用 经营讨论与分析 测量 企业数字化指标

管理世界 | 用正则表达式、文本向量化、线性回归算法从md&a数据中计算 「企业融资约束指标

可视化 | 词嵌入模型用于计算社科领域刻板印象等信息(含代码)

可视化 | 绘制《三体》人物关系网络图

可视化 | 使用决策树分析小红书帖子数据(含代码)

可视化99-21年地方政府报告关键词变化趋势

转载 | 基于词嵌入技术的心理学研究: 方法及应用

赶快收藏 | 社会科学文本挖掘技术资料汇总

B站社会科学文本分析视频合集

词嵌入技术在社会科学领域进行数据挖掘常见39个FAQ汇总

文本分析 | 中国企业高管团队创新注意力(含代码)

文本分析 | MD&A 信息含量指标构建代码实现

金融研究 | 使用Python构建「关键审计事项信息含量」

金融研究 | 文本相似度计算与可视化

转载 | 社会计算驱动的社会科学研究方法

推荐 | 社科(经管)文本分析快速指南

视频分享 | 文本分析在经管研究中的应用

转载 | 金融学文本大数据挖掘方法与研究进展

转载 | 大数据驱动的「社会经济地位」分析研究综述

使用 Word2Vec 和 TF-IDF 计算五类企业文化

如何用「图嵌入」将企业、高管职业经历表征为向量数据

JM2022综述 | 黄金领域: 为营销研究(新洞察)采集网络数据

MS | 使用网络算法识别创新的颠覆性与否

认知的测量 | 向量距离vs语义投影

Asent库 | 英文文本数据情感分析

PNAS | 文本网络分析&文化桥梁Python代码实现

PNAS | 使用语义距离测量一个人的创新力(发散思维)得分

PNAS | 历史文本中的语言积极性反映了动态的环境和心理因素(含Python代码)

Nature | 通用中英文六维语义情感词典

正念爱好者的 twitter 语言风格有何不同?

tomotopy | 速度最快的LDA主题模型

数据集 | cctv新闻联播文稿数据

数据集 | 睡前消息文稿数据集

EDGAR | 25年数据的预训练词向量模型(含代码)

2G数据集 | 80w知乎用户问答数据

采购合同数据集 | 政府采购何以牵动企业创新

借助chatGPT更高效地学习Python文本分析

word_in_context | 查看某类词的上下文,更好的理解文本数据


继续滑动看下一个
大邓和他的Python
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存