Python下基于Jieba和WordCloud的词云生成(从数据库中直取文本)

    技术2025-10-23  13

    整体思路 1.从数据库中取出文本内容,放进列表 2.遍历列表,使用Jieba对文本内容进行关键词抽取 3.使用WordCloud生成词云图片

    一、使用SQL语句获取文本内容列表

    def getText(): # 连接数据库 db = pymysql.connect("175.24.32.214", "sa", "123456", "weibo", charset='utf8') try: # 使用cursor()方法获取操作游标 cursor = db.cursor() # 获取微博内容数据 sql = 'select text from weibo where user_id="2730402964";' cursor.execute(sql) # 直接通过数据库查询获取的是((1,张三,男),(2,李四,女))这样的元组格式: # 每条记录通过元组记录属性值,同时每条记录作为一个元组元素组成查询结果元组 results = cursor.fetchall() # 将微博内容放入contents列表 contents = [] for re in results: #只取了text属性值,可直接extend contents.extend(re) # 关闭数据库连接 db.close() # 返回微博内容列表contents return contents except Exception as e: print("出错:") db.rollback() print(e)

    二、使用Jieba抽取关键词

    使用Jieba中基于 TF-IDF 算法的关键词抽取

    TF-IDF 算法简介:

    (1)简单讲,TF(词频)和IDF(逆文档频率)的计算公式如下:

    (2)TF为关键词在文章中的出现频率,IDF为关键词在语料库中的常见程度。 (分母+1是为防止关键词在语料库文档中出现次数为0;分母越小,IDF越大,关键词在语料库中越不常见)

    (3)最终TF-IDF权重值 = IF * TDF,即关键词在文章中出现次数越多,且在语料库中越不常见,则权重值越高。

    在Jieba中使用TF-IDF算法: 为去除一些分析意义不大但出现频率很高的词,可设置停用词表来对取消对相应词汇的统计,代码如下: jieba.analyse.set_stop_words(file_name) # file_name为自定义停用词表路径,每行一个词

    提取文本关键词代码:

    jieba.analyse.extract_tags(text, topK=20, withWeight=False, allowPOS=())

    各参数含义如下:

    参数名作用text要分析的文本内容topK返回权重最大的关键词个数,默认 20withWeight是否返回关键词权重值,默认值为 FalseallowPOS是否返回仅包括指定词性的词,默认值为空

    其中allowPOS常用的词性有:

    缩写词性a形容词d副词e叹词i成语m数词n名词nr人名ns地名nt机构名o拟声词v动词

    详细可参考 => 词性标注表

    附上项目中使用代码:

    # 从数据库获取微博内容列表 text = getText() # 存放分词结果列表 words = [] # 使用jieba获取微博内容分词结果 for content in text: jieba.analyse.set_stop_words("stopwords.txt") ##设置停用词表,这些词便不会加入统计计算。 word = list(jieba.analyse.extract_tags(content)) words.extend(word)

    三、使用WordCloud生成词云

    这部分比较简单,直接附代码:

    #参数words为关键词列表,img_file为背景图片文件路径 def generate_img(words, img_file): data = ' '.join(word[0] for word in words) # 将图片作为词云背景 image_coloring = imread(img_file) wc = WordCloud( background_color='white', mask=image_coloring, font_path='C:\Windows\Fonts\msyh.ttc', collocations=False, max_words=150, min_font_size=5, max_font_size=40 ) wc.generate(data) wc.to_file('test.png')

    结果图如下: 词云生成结果的效果可以根据参数来进行调整,词云生成参数网上一大堆,就不再搬运了。

    代码链接先占个坑,项目全部完成后传到github上。

    Processed: 0.009, SQL: 9