python 【包含数据预处理】基于词频生成词云图

news2024/12/29 11:09:16

基于词频生成词云图

背景目的

有一篇中文文章,或者一本小说。想要根据词频来生成词云图。

基于词频生成词云步骤

为什么中文需要分词

中文分词是理解和处理中文文本的关键步骤,它直接影响到后续的文本分析和信息提取的准确性和有效性。

  • 无明显单词分隔:中文文本不像英文那样使用空格来分隔单词,中文字符通常连续书写,没有明显的单词边界。

  • 语言单位:中文的基本语言单位是字,但单独的字往往不能表达完整的意思。中文的表达往往需要由多个字组成的词语来实现。

  • 语境依赖性:中文词语的意义很大程度上依赖于语境,相同的字在不同的词语中可能有不同的意义。

  • 词义丰富性:中文中的词语往往比单个的字具有更丰富的语义信息,分词有助于更准确地理解文本内容。

  • 语法复杂性:中文的语法结构相对复杂,词语的顺序、搭配和使用习惯对句子意义的影响很大。

  • 自然语言处理:在自然语言处理领域,分词是中文文本分析的基础步骤,无论是进行词性标注、命名实体识别还是句法分析,都需要先进行分词。

  • 信息检索和文本挖掘:分词可以提高中文信息检索和文本挖掘的准确性,有助于提取关键词和短语,从而更好地理解文本内容。

文本预处理

最终目的是,生成句子数组。

在进行中文文本分析前,必须执行数据预处理步骤,以提升后续处理的准确性和效率。这包括:

  • 移除文本中的特殊符号,因为它们通常不携带有用信息,且可能干扰分词算法。
  • 统一替换空格、换行符、制表符等空白字符为中文逗号,以保持句子的连贯性。
  • 删除无意义的英文字母,因为它们对于中文文本分析不是必要的。
  • 清除文本中的网址、图片链接、日期等信息,这些通常与文本的主题无关,可能会影响分析结果。

数据处理函数

处理文本,过滤不需要无意义的字符。

import re

def data_process(str_data):
    # 定义正则表达式模式
    # 去除换行、空格
    str_data = re.sub(r'[\n\s]+', '', str_data)
    # 匹配网址
    url_pattern = r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
    # 匹配日期格式如 YYYY/MM/DD, YYYY-MM-DD, YYYY年MM月DD日
    date_pattern = r'\d{4}[/\\-]?\d{1,2}[/\\-]?\d{1,2}'
    # 匹配邮箱地址
    email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
    # 匹配数字
    number_pattern = r'\d+'
    # 匹配英文字母
    english_letter_pattern = r'[a-zA-Z]'

    # 替换空白字符为空格
    str_data = re.sub(r'\s', ',', str_data)

    # 删除特殊符号、网址、日期、邮箱、数字和英文字母
    str_data = re.sub(url_pattern, '', str_data)
    str_data = re.sub(date_pattern, '', str_data)
    str_data = re.sub(email_pattern, '', str_data)
    str_data = re.sub(number_pattern, '', str_data)
    str_data = re.sub(english_letter_pattern, '', str_data)

    # 删除标点符号
    punctuation = r""""!!??#$%&'()()*+-/:;▪³/<=>@[\]^_`●{|}~⦅⦆「」、、〃》「」『』【】[]〔〕〖〗〘〙{}〚〛*°▽〜〝〞〟〰〾〿–—‘'‛“”„‟…‧﹏"""
    str_data = re.sub(f"[{re.escape(punctuation)}]+", '', str_data)

    return str_data.strip()

sample_text = "这是一个例子。\n包含网址 http://example.com,参考文献[1]{,日期2024-06-18。"
processed_text = data_process(sample_text)
print(processed_text)

句子数组函数封装

读取txt文件生成句子数组

image-20240618101358125
def getText(filename):
    sentences = []
    with open(filename, 'r', encoding='utf-8') as fp:
        for line in fp:
            processed_line = data_process(line)
            if processed_line:  # 检查处理后的句子是否为空或只包含空白字符
                sentences.extend(re.split(r'[。!?]', processed_line))  # 使用更复杂的句子划分规则
        # 去除列表中的空字符串
    sentences = [sentence for sentence in sentences if sentence.strip()]
    return sentences

输出结果

image-20240618101500347

分词和词频统计

jieba分词

Jieba分词是一个流行的中文分词Python库,它的主要特点和作用可以简单概括为:

什么是Jieba分词:一个用于中文文本分词的库。

做了什么:识别中文文本中的单词边界,将连续的文本切分成单独的词语。

得到什么:提供分词后的结果,即文本中各个词语的列表。

img

Jieba 分词器属于概率语言模型分词,基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况构建成有向无环图,然后采用动态规划寻找最大概率路径,找出基于词频的最大切分组合。对于不存在与前缀词典中的词,采用了汉字成词能力的 HMM 模型,使用了 Viterbi 算法。Jieba 的切分模式有全模式、精确模式、搜索引擎模式,更多详细信息可以查看 github 仓库。

以下是 Jieba 分词器中一些常用函数的:

函数名描述
jieba.cut对输入文本进行分词,返回一个可迭代的分词结果
jieba.cut_for_search在搜索引擎模式下对输入文本进行分词,返回一个可迭代的分词结果
jieba.lcut对输入文本进行分词,返回一个列表形式的分词结果
jieba.lcut_for_search在搜索引擎模式下对输入文本进行分词,返回一个列表形式的分词结果
jieba.add_word向分词词典中添加新词
jieba.del_word从分词词典中删除指定词
jieba.load_userdict加载用户自定义词典
jieba.analyse.extract_tags提取文本中的关键词,返回一个列表形式的关键词结果

词频函数封装

统计句子列表中名词(‘n’, ‘nr’, ‘nz’)的词频, 返回一个字典

import jieba.posseg as psg

def getWordFrequency(sentences):
    """
    统计句子列表中名词('n', 'nr', 'nz')的词频
    :param sentences: 包含多个句子的列表
    :return: 包含名词词频的字典
    """
    words_dict = {}  # 用于存储词频的字典
    for text in sentences:
        # 去掉标点符号
        text = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+", "", text)
        
        # 使用结巴分词进行词性标注
        wordGen = psg.cut(text)
        
        # 遍历分词结果,统计名词词频
        for word, attr in wordGen:
            if attr in ['n', 'nr', 'nz']:  # 判断词性是否为名词
                if word in words_dict.keys():
                    words_dict[word] += 1
                else:
                    words_dict[word] = 1
    return words_dict

if __name__ == "__main__":
    sentences = getText("../百度百科-黄河.txt")
    # pprint(sentences)
    words_dict = getWordFrequency(sentences)
    pprint(words_dict)

输出结果

image-20240618103345980

由词频生成词云

完整代码

点我下载代码和依赖

词云结果

image-20240618104121953

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1837278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML5基本语法

文章目录 HTML5基本语法一、基础标签1、分级标题2、段标签3、换行及水平线标签4、文本格式标签 二、图片标签1、格式2、属性介绍 三、音频标签1、格式2、属性介绍 四、视频标签1、格式2、属性介绍 五、链接标签1、格式2、显示特点3、属性介绍4、补充(空链接&#xf…

【C++】Template模板

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

Boom3D软件下载-Boom3D音效增强工具下载附加详细安装步骤

Boom3D音效增强工具是一款便捷的为用户们进行音频处理和编辑的软件&#xff0c;支持用户们轻松的进行音频的使用&#xff0c;支持超多的音频格式让你可以轻松的进行使用&#xff0c;Boom3D音效增强工具拥有多种音频特效的功能&#xff0c;让你可以在Boom3D音效增强工具轻松的进…

Python办公自动化实例--照片挑选

实例背景 学院举行毕业晚会&#xff0c;要制作照片墙&#xff0c;让学生自己上传一直没有多少回应&#xff0c;上传的没有几张&#xff08;学院的号召力是真的拉&#xff09;&#xff0c;需要从整个学校的学生证件照中挑选出外面学院的同学&#xff0c;于是这个“艰巨”的任务…

Avalonia:一个.NET跨平台UI框架

概述 Avalonia是一个强大的框架&#xff0c;使开发人员能够使用. NET创建跨平台应用程序。它使用自己的渲染引擎来绘制UI控件&#xff0c;确保在各种平台上保持一致的外观和行为&#xff0c;包括Windows&#xff0c;macOS&#xff0c;Linux&#xff0c;Android&#xff0c;iOS…

轻轻松松上手的LangChain学习说明书

本文为笔者学习LangChain时对官方文档以及一系列资料进行一些总结&#xff5e;覆盖对Langchain的核心六大模块的理解与核心使用方法&#xff0c;全文篇幅较长&#xff0c;共计50000字&#xff0c;可先码住辅助用于学习Langchain。 一、Langchain是什么&#xff1f; 如今各类AI…

大模型面试指南:掌握关键技术与策略,成功应对面试挑战

随着人工智能技术的快速发展&#xff0c;大型预训练模型在自然语言处理、计算机视觉、语音识别等领域取得了显著成果。这些模型通过在海量数据上进行预训练&#xff0c;能够捕捉到丰富的特征信息&#xff0c;为各种下游任务提供强大的支持。在求职面试中&#xff0c;掌握大模型…

OpenAI新开放了这些好用的API功能(附AI学习指南)

OpenAI近期召开了开发者大会&#xff0c;同时也发布和开放了一些新的功能特性&#xff0c;比如新版本GPT-4 Turbo&#xff0c;支持128k上下文&#xff0c;知识截止更新到2023年4月&#xff0c;视觉能力、DALLE3&#xff0c;文字转语音TTS等等全都对API开放&#xff0c;GPTs商店…

【Unity拖拽物体】实现对点中的3D物体进行拖拽的功能

场景结构&#xff0c;两个普通模型 第一种 脚本所挂载的物体才可以被拖拽 【PC鼠标版本】 using UnityEngine;// 这个脚本实现了&#xff0c;本脚本所在的游戏物体能够被拖拽 public class DragObjectT : MonoBehaviour {private Vector3 screenPoint; // 存储物体在屏幕上的位…

多行文本的文字展示全部和收起功能

组件代码&#xff1a; <template><!-- 外层容器&#xff0c;使用相对定位 --><div class"relative"><!-- 文本容器&#xff0c;根据 expanded 状态决定是否应用 line-clamp-4 类 --><div :class"{ line-clamp-4: !expanded }"…

没有二十年功力,写不出这一行代码!

这篇文章要从一个奇怪的注释说起&#xff0c;就是下面这张图&#xff1a; 我们可以不用管具体的代码逻辑&#xff0c;只是单单看这个 for 循环。 在循环里面&#xff0c;专门有个变量 j&#xff0c;来记录当前循环次数。 第一次循环以及往后每 1000 次循环之后&#xff0c;进…

阻力支撑相对强度(RSRS)选股系列报告之三

https://download.csdn.net/download/SuiZuoZhuLiu/89447699?spm1001.2014.3001.5503https://download.csdn.net/download/SuiZuoZhuLiu/89447699?spm1001.2014.3001.5503

电脑密码忘记了怎么办?3步教你找回密码!

在日常使用电脑的过程中&#xff0c;忘记密码是一件令人头痛的事情。如果您不慎忘记了电脑的登录密码&#xff0c;无法进入系统进行工作和娱乐&#xff0c;这时需要找到合适的解决方案来恢复对电脑的访问权限。那么电脑密码忘记了怎么办呢&#xff1f;本文将介绍三种解决方法&a…

Uncaught TypeError: Cannot read properties of null (reading ‘isCE‘)

问题描述 使用 view-ui-plus 加 vue3 开发项目&#xff0c;本地启动项目正常&#xff0c;但其他人将代码拉下来&#xff0c;启动项目时报错 Uncaught TypeError: Cannot read properties of null (reading isCE)&#xff1a; 原因分析&#xff1a; 尝试将 mode_nodules 文件删…

C++实时检测耳机的插入与拔出(附源码)

目录 1、实现继承于IMMNotificationClient接口类的CMMNotificationClient类,实时感知音频设备变化的通知事件 2、在CMMNotificationClient的构造函数中初始化多媒体设备COM接口,设置回调类指针 3、通过获取音频设备接口下外设的KSJACK_DESCRIPTION 信息判断耳机的连接状态…

ArcGIS arcpy代码工具——关于工具使用的软件环境说明

系列文章目录 ArcGIS arcpy代码工具——批量对MXD文件的页面布局设置修改 ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片 ArcGIS arcpy代码工具——将要素属性表字段及要素截图插入word模板 ArcGIS arcpy代码工具——定制属性表字段输出表格 ArcGIS arc…

鸿蒙实现自定义Tabbar样式,显示数字红点提示

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 Tabs的链接参考&#xff1a;OpenHarmony Tabs TabContent的链接参考&#xff1a;OpenHarmony TabContent 通过查看链接参考我们知道可以通过TabContent的tabBar来实现自定义TabBar样式&#xff08;CustomBuilder&…

“运动过量”?想多了,普通骑友没那能力和意志力,好好骑车吧

最近听到“运动过量”这个词挺多的&#xff0c;身为骑行爱好者的校长&#xff0c;感觉又好笑又无奈&#xff0c;所以想写点东西&#xff0c;这篇文通过分析普通骑友的运动习惯、能力和意志力&#xff0c;探讨了“运动过量”这一概念在骑行领域中的适用性。文章指出&#xff0c;…

基于PHP的民宿管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的民宿管理系统 一 介绍 此民宿管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端jquery.js和echarts.js。系统角色分为用户和管理员。用户可以在线浏览和预订民宿&#xff0c;管理员登录后台进行相关管理等。(在系统…

精度丢失引起的支付失败问题

问题描述 在提交订单时候&#xff0c;输入充值金额和优惠码&#xff0c;后台会返回具体的订单信息&#xff0c;如下图&#xff0c;支付金额应该是1 * (1 - 0.09) 0.91&#xff08;这个是理想状态&#xff09;&#xff0c;但是表单显示的是0.90999997&#xff0c; 然后点击确…