ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

微博爬虫及舆情分析-3.文本清理与制作词云

2019-09-15 15:01:50  阅读:431  来源: 互联网

标签:keyword created text frame 爬虫 mblog raw 微博 词云


1、文本清理

import pandas as pd
import pymysql
from sqlalchemy import create_engine
import re
import jieba
import jieba.analyse
#1.从数据库导入微博数据并查看
mblog_frame = pd.read_csv('mblog.csv',index_col=None)
mblog_frame.head(2)

在这里插入图片描述

# 2.清除text中的非微博正文字符并抽取关键词
# 自定义函数
def clean_text(raw):
    """
    清除text中的非微博正文字符
    返回值类型为元组
    """
    if raw['raw_text']:
        text=re.sub('<[^<]*>','',raw['raw_text']) # 清除多余的html语句
        text=re.sub('[#\n]*','',text) # 清除换行符与#符号
        text=re.sub('(http://.*)$','',text) # 清除文末的网址
        return text 
    else:
        return None
def get_chinese_text(raw):
    """
    清除text中的非中文字符
    只能提取中文字符,微博中的数字以及英文均会丢失
    """
    if raw['text']:
        res_text=''.join(re.findall(r"[\u4e00-\u9fff]{2,}",raw['text']))
        return (raw['mid'],res_text)
    else:
        return None

def get_keywords(raw):
    """
    使用jieba从中文text抽取关键词
    默认抽取20个关键词
    longtext 提取40个关键词
    """
    if raw['chinese_text']:
        if raw['isLongText'] == 1:
            # 当text为长文本时,提取50个关键词
            keywords = jieba.analyse.extract_tags(raw['chinese_text'],topK=50)
        else:
            # 当text为非长文本时,默认提取20个关键词
            keywords = jieba.analyse.extract_tags(raw['chinese_text'])
        return (raw['mid'],keywords)
    else:
        return None

def clean_created_date(raw):
    created_date = raw['created_at']
    if created_date.endswith('前'):
        created_date = '09-15'
    elif created_date.startswith('昨天'):
        created_date = '09-14'
    return created_date
#获取清理后的created_date
mblog_frame['created_date'] = mblog_frame.apply(clean_created_date,axis=1)
# 获取清理后的text
mblog_frame['chinese_text'] = mblog_frame.apply(clean_text,axis=1)

# 以传入字典items()的形式生成DataFrame,指定列名
res_mblog = pd.DataFrame(mblog_frame,columns=['mid','chinese_text','like_count','comments_count','reposts_count','created_date','user_id'])
# 写入csv文件便于查看数据清洗结果
res_mblog.to_csv('clean_mblog.csv', encoding='utf_8_sig',index=False)
# 获取关键字并转换为分散存储的DataFrame
mid_with_keyword = list(mblog_frame.apply(get_keywords,axis=1))
# 这里要把keywords列表存储到数据库,因此需要将keywords列表分开,并与mid对应
keywords_list = [(raw[0],w) for raw in mid_with_keyword for w in raw[1]]
mid_with_keyword = pd.DataFrame(keywords_list,columns=['mid','keyword'])
# 写入csv文件便于查看结果
mid_with_keyword.to_csv('keyword.csv', encoding='utf_8_sig',index=False)

2、制作词云

# 从数据库读取微博数据
keyword_frame = pd.read_csv('keyword.csv',index_col=False)
# 取出全部的关键词,并生成一个列表
all_keyword = list(keyword_frame.keyword)

# 使用collections模块中的Counter统计每个关键词出现的次数,Counter返回一个字典,keyword:count
from collections import Counter
word_freq_frame = pd.DataFrame(Counter(all_keyword).items())
word_freq_frame.columns=['word','count']
top100_freq_word = word_freq_frame.sort_values('count',ascending=0).head(100)
top100_freq_word_dict=dict(list(top100_freq_word.apply(lambda w:(w['word'],w['count']),axis=1)))

from wordcloud import WordCloud,STOPWORDS
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#用来显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来显示负号
%matplotlib inline
plt.rcParams['figure.dpi'] = 100 #分辨率
wc = WordCloud(background_color="white",max_words=2000,font_path='simhei.ttf')
wc.generate_from_frequencies(top100_freq_word_dict)
plt.imshow(wc)
plt.axis('off')
plt.show()

在这里插入图片描述

标签:keyword,created,text,frame,爬虫,mblog,raw,微博,词云
来源: https://blog.csdn.net/Spratumn/article/details/100854411

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有