上一篇文章讲了如何抓取朋友圈文本信息,这篇文章将如何将其可视化,生成词云。生成词云需要先分词,利用python的jieba包分词,然后根据tf-idf算法提取出关键词。利用python的wordcloud包可以生成词云,但是wordcloud包生成词云是单纯依据词频,而没有使用tf-idf算法。为了改进这点,将分词后的结果根据tf-idf值构建新的字符串,使得tf-idf值大的词在新字符串中词频也大,再利用wordcloud包生成新字符串的词云图
注释中讲得比较详细了,直接贴上代码

#将存储的文本分词
def cut_text(store_path):
    f=open(store_path,'r',encoding='UTF-8')
    text=f.read() #从文件读取所有字符并将它们作为字符串返回
    cutted_words=jieba.cut(text)#返回的是一个生成器
    return cutted_words

#剔除停用词
def store_cut_text(textstore_path,cut_store_path):
        cutted_words=cut_text(textstore_path)
        #下面把不在停用词表中的词语添加到这个字符串中,并用空白符分隔开;
        # 必须给个符号分隔开分词结果形成字符串,否则不能生成词云
        f=open(cut_store_path,"w",encoding="utf-8")
        for w in cutted_words:
            f.write(w+"\n")
        f.close()

def del_stopwords(stopwords_path,cut_store_path):
    stopwords_list = [line.strip() for line in open(stopwords_path, 'r', encoding='utf-8').readlines()]  # 将停用词表转换成列表
    words_str = ''
    f=open(cut_store_path,"r",encoding='utf-8')
    w=f.readline()
    words_dir={}
    while w!="":
        if w.strip() not in stopwords_list:
            if w not in words_dir.keys():
                words_dir[w]=1
            else:
                words_dir[w]+=1
            words_str+=w
            words_str+=' '
        w=f.readline()
    set_lst=sorted(words_dir.items(),key= lambda item:item[1],reverse=True)    #按字典的值排序,返回一个二元元组的列表,元组第一个元素是关键字,第二个是值
    return words_str

#生成词云
def get_wordcloud(words_str,store_path):
    background=plt.imread(r'.\res\cloud.jpg') #设定云图背景图案,参数为图片路径,不设置的话云图默认为方形
    wc=WordCloud(mask=background,font_path=r'.\res\simhei.ttf',  #指定字体路径
                 background_color='white',width=500,height=350,max_font_size=400,min_font_size=5)
    #font_path是中文字体路径,因为wordcloud库本身只支持英文,需要下载中文字体;
    # max_font_size和min_font_size分别设置云图最大词语的大小和最小词语的大小
    wc.generate(words_str)#生成词云
    wc.to_file(store_path)#将词云存储到指定路径
    plt.imshow(wc)#以图片形式显示词云
    plt.axis('off')#将图像坐标系关闭
    plt.show()

#打印关键字
def keywords_delstop(s,n):#提取tf*idf排名前n的n个关键词
    tfidf =analyse.extract_tags # 引入TF-IDF关键词抽取接口
    keywords=tfidf(s,n,withWeight=True)

    print("哈罗皮朋友圈的十大关键词是:")
    i=1
    while i<11:
        print(str(i) + "、" + keywords[i-1][0] )
        i+=1
    construct_lst=[]#根据tf*idf值构建新的字符串,使得tf*idf值大的词词频也大,以便生成词云图。因为词云会单纯依据词频来生成
    for keyword in keywords:
        num=round(keyword[1],2)*100  #根据tf-idf值确定词语在新字符串中的个数
        n=0
        while n<num:
            construct_lst.append(keyword[0])
            n+=1
    random.shuffle(construct_lst)#将原列表打乱
    construct_str=""
    for word in construct_lst:
        construct_str+=word
        construct_str+=" "
    return construct_str

if __name__=='__main__':
    store_cut_text(r'D:\词云\哈罗皮已处理.txt',r'.\temp\哈罗皮切词.txt')   #切词并存储切分的词语
    words_str=del_stopwords(r'.\res\stopwords.txt',r'.\temp\哈罗皮切词.txt')  #删除停用词
    construct_str=keywords_delstop(words_str,180)   #使用tf-idf值排名前180的词语构造新字符串
    get_wordcloud(construct_str,r'D:\词云\哈罗皮.jpg')  #用新字符串生成词云

最终的效果图

如何用python监控别人的朋友圈 python爬取其他人微信朋友圈_jieba


如何用python监控别人的朋友圈 python爬取其他人微信朋友圈_python_02


一年结束的时候可以生成自己这一年的朋友圈词云,看看自己这一年的关键词都是哪些,给自己来个年度总结,是不是挺酷的:)

本项目已上传至github:

https://github.com/moonshine57/Moments_wordCloud