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

基于词频生成词云图

背景目的

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

基于词频生成词云步骤

为什么中文需要分词

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

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

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

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

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

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

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

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

文本预处理

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

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

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

数据处理函数

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

import redef 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 psgdef 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] += 1else:words_dict[word] = 1return words_dictif __name__ == "__main__":sentences = getText("../百度百科-黄河.txt")# pprint(sentences)words_dict = getWordFrequency(sentences)pprint(words_dict)

输出结果

image-20240618103345980

由词频生成词云

完整代码

import re
from pprint import pprint
import jieba.posseg as psg
from wordcloud import WordCloud
import matplotlib.pyplot as pltdef data_process(str_data):"""卫星号: Wusp1994企鹅号: 812190146"""# 定义正则表达式模式# 去除换行、空格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()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 sentencesdef 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] += 1else:words_dict[word] = 1return words_dictif __name__ == "__main__":sentences = getText("../百度百科-黄河.txt")# pprint(sentences)words_dict = getWordFrequency(sentences)# 创建 wordcloud 对象,背景图片为 graph,背景色为白色wc = WordCloud(font_path='../Hiragino.ttf', width=800, height=600, mode='RGBA', background_color=None)# 生成词云wc.generate_from_frequencies(words_dict)# 显示词云plt.imshow(wc, interpolation='bilinear')plt.axis('off')plt.show()

词云结果

image-20240618104121953

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

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

相关文章

Einops 张量操作快速入门

张量,即多维数组,是现代机器学习框架的支柱。操纵这些张量可能会变得冗长且难以阅读,尤其是在处理高维数据时。Einops 使用简洁的符号简化了这些操作。 Einops (Einstein-Inspired Notation for operations)&#xff…

温度传感器NST175手册阅读

温度传感器NST175手册阅读 首先看芯片的输入和输出:主要关注IIC接口,毕竟是要驱动这个芯片读取温度。在编写此博客时还未对改温度传感器进行调试,只是阅读手册,把需要重点关注的地方标记出来。 一、芯片管脚 二、温度输出格式 …

618大促背后:优秀制造企业如何精准备货?

618这场年中购物盛宴点燃了消费者的热情。而在背后,是许许多多的制造企业在默默发力,对于他们来说,这不仅仅是一个促销的机会,更是一个检验供应链响应速度、库存管理能力以及市场洞察力的关键时刻。那么,优秀的制造企业…

WACV2024检测Detection论文49篇速览

WACV2024 Detection论文摘要速览49篇 Paper1 CLRerNet: Improving Confidence of Lane Detection With LaneIoU 摘要小结: 车道线检测是自动驾驶和驾驶辅助系统中的关键组成部分。现代基于锚点的深度车道检测方法在车道检测基准测试中表现出色。通过初步的实验,我们…

macbook屏幕录制技巧,这2个方法请你收好

在当今数字化时代,屏幕录制成为了一项不可或缺的技能,无论是教学演示、游戏直播,还是软件操作教程,屏幕录制都能帮助我们更直观地传达信息。MacBook作为苹果公司的标志性产品,其屏幕录制功能也备受用户关注。本文将详细…

区区微服务,何足挂齿?

背景 睿哥前天吩咐我去了解一下微服务,我本来想周末看的,结果周末没带电脑,所以只能周一看了。刚刚我就去慕课网看了相关的视频,然后写一篇文章总结一下。这篇文章算是基础理论版,等我之后进行更多的实践,…

帕金森患者在饮食上需要注意什么

帕金森病患者在饮食上应该遵循以下几个基本原则: 饮食清淡:应多吃新鲜的水果和蔬菜,如苹果、芹菜、菠菜等,以补充维生素和促进胃肠道蠕动。营养均衡:应多吃富含优质蛋白的食物,如鸡蛋、牛奶,以…

Swift开发——元组

Swift语言的数据类型包括整型、浮点型、字符串、布尔型、数组、元组、集合和字典等,本文将详细介绍元组。 01、元组 严格意义上,元组不属于数据类型,而属于数据结构。元组将一些变量或常量或字面量组织成一个有序的序列,索引号从0开始,用圆括号“()”括起来,各个元素间用…

hive 安装 嵌入模式 笔记

$ hive $ HIVE_HOME/bin/schematool -dbType derby –initSchema $ schematool -verbose -validate -dbType derby $HIVE_HOME/bin/hiveserver2 这个启动了先不要关闭,再打开一个终端进行下面的步骤 Beeline -u (用自己的名字和密码) show d…

毕业答辩PPT:如何在短时间内高效准备?

提起PPT,大家的第一反应就是痛苦。经常接触PPT的学生党和打工人,光看到这3个字母,就已经开始头痛了: 1、PPT内容框架与文案挑战重重,任务艰巨,耗费大量精力。 2、PPT的排版技能要求高,并非易事…

眼镜片怎么洗?眼镜清洗有哪些方法?超声波清洗机能洗眼镜吗?

现在戴眼镜的人有很多,但是所谓的戴眼镜容易,清洗眼镜却是比较难的一件事!不要以为眼镜好像看着不脏,然后随便用眼镜布擦一下就完事了……其实不是的! 眼镜片上面有细小的灰尘颗粒,而随着我们用眼镜布擦眼…

css之sprite

css之sprite 图片整合 sprite 优势 整合的方法 ps 新建图层(名字为英文、给定宽高、选择像素、背景内容设置透明、创建)ctrlc复制小图 ctrlv 粘贴 选择工具移动位置裁剪工具,剪掉下方多余的位置 enter导出(PNG) 精灵…

MySQL多表查询操作

一对多SQL表创建 -- 创建部门表(父表) create table dept(id int auto_increment comment ID primary key,name varchar(50) not null comment 部门名称 ) comment 部门表;-- 给部门表插入数据 insert into dept (name) values (研发部),(市场部),(财务部),(销售部),(总经办);-…

【Linux】进程间通信2——命名管道

1. 命名管道(FIFO) 1.1. 基本概念 简单,给匿名管道起个名字就变成了命名管道 那么如何给 匿名管道 起名字呢? 结合文件系统,给匿名管道这个纯纯的内存文件分配 inode,将文件名与之构建联系,关键点在于不给它分配 D…

2024 年最新 Python 基于 LangChain 框架基础案例详细教程(更新中)

LangChain 框架搭建 安装 langchain pip install langchain -i https://mirrors.aliyun.com/pypi/simple/安装 langchain-openai pip install langchain-openai -i https://mirrors.aliyun.com/pypi/simple/ChatOpenAI 配置环境变量 环境变量 OPENAI_API_KEYOpenAI API 密钥…

生成式人工智能如何改变客户服务

生成式人工智能不仅重新定义了品牌与客户的互动方式,还重新定义了品牌如何优化内部资源,以提供更加个性化和高效的服务。 了解在就业和效率方面的挑战和机遇,使用生成式人工智能工具进行客户服务和支持任务。 生成式人工智能不仅重新定义了品…

【Quartus 13.0】EP1C3144I7 部署4*6矩阵键盘

仿照 正点原子 的 Sample 修改 V2手册 P266 没有用这个 给出的手动按键控制的矩阵模块 为 4*6 矩阵键盘外接模块 每一个按键自带led,所以对应的接口是合并在一起的一个引脚 按下后 LED 亮,vice versa 底部 LED*8 目前不清楚有什么用 或许可以变成 16进…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 02 Clos拓扑

本章回答以下问题: 什么是 Clos 拓扑,它与“接入 - 汇聚 - 核心”拓扑有何不同?Clos 拓扑的特征是什么?Clos 拓扑对数据中心网络的影响是什么? Clos拓扑 云原生数据中心基础设施的先行者们想要构建一种支持大规模水平扩展网络。 基本的Clos拓扑如图…

记录一下 Chrome浏览器打印时崩溃问题

问题描述: 为了查看页面内存占用情况,按F2,打开Memory chrome浏览器点击“打印”按钮,或Ctrl P 时出现如下页面 一直以为是页面问题,每次打印的时候遇到这种 崩溃现象 就是重新刷新页面 但今天刚开一个页面,内存 …

【2024最新精简版】RabbitMQ面试篇

文章目录 Kafka和RabbitMQ什么区别惰性队列(Lazy Queues)是怎么实现的?RabbitMQ工作模式有哪些 ?你们项目中哪里用到了RabbitMQ ?为什么会选择使用RabbitMQ ? 有什么好处 ?使用RabbitMQ如何保证消息不丢失 ?消息的重复消费问题如何解决的…