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

简介: 背景目的有一篇中文文章,或者一本小说。想要根据词频来生成词云图。

背景目的

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

为什么中文需要分词

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

  • 无明显单词分隔:中文文本不像英文那样使用空格来分隔单词,中文字符通常连续书写,没有明显的单词边界。
  • 语言单位:中文的基本语言单位是字,但单独的字往往不能表达完整的意思。中文的表达往往需要由多个字组成的词语来实现。
  • 语境依赖性:中文词语的意义很大程度上依赖于语境,相同的字在不同的词语中可能有不同的意义。
  • 词义丰富性:中文中的词语往往比单个的字具有更丰富的语义信息,分词有助于更准确地理解文本内容。
  • 语法复杂性:中文的语法结构相对复杂,词语的顺序、搭配和使用习惯对句子意义的影响很大。
  • 自然语言处理:在自然语言处理领域,分词是中文文本分析的基础步骤,无论是进行词性标注、命名实体识别还是句法分析,都需要先进行分词。
  • 信息检索和文本挖掘:分词可以提高中文信息检索和文本挖掘的准确性,有助于提取关键词和短语,从而更好地理解文本内容。

文本预处理

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

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

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

数据处理函数

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

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文件生成句子数组

1718688956454.jpg

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

输出结果

1718689014356.jpg

分词和词频统计

jieba分词

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

  • 什么是Jieba分词:一个用于中文文本分词的库。
  • 做了什么:识别中文文本中的单词边界,将连续的文本切分成单独的词语。
  • 得到什么:提供分词后的结果,即文本中各个词语的列表。

1718689058981.jpg

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)

输出结果

1718689106621.jpg

由词频生成词云

完整代码

import re
 from pprint import pprint
 import jieba.posseg as psg
 from wordcloud import WordCloud
 import matplotlib.pyplot as plt

 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()
 
 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
 
 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)
 
     # 创建 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()

词云结果

1718689217705.jpg

作者:Wusp1994

链接:https://juejin.cn/post/7381423581018243112

相关文章
|
1月前
|
自然语言处理 数据可视化 Python
利用Python爬取百度百科词条并生成词云图
本文介绍如何使用Python爬取百度百科词条内容并生成词云图,涉及`requests`、`BeautifulSoup`、`jieba`、`wordcloud`等库的使用,从环境准备、数据爬取、中文分词到词云图生成,详细展示了整个流程。
66 0
|
2月前
|
机器学习/深度学习 数据采集 算法
一个 python + 数据预处理+随机森林模型 (案列)
本文介绍了一个使用Python进行数据预处理和构建随机森林模型的实际案例。首先,作者通过删除不必要的列和特征编码对数据进行了预处理,然后应用随机森林算法进行模型训练,通过GridSearchCV优化参数,最后展示了模型的评估结果。
55 0
|
3月前
|
数据采集 机器学习/深度学习 算法
利用Python进行数据预处理的实用指南
【9月更文挑战第15天】在探索数据科学之旅时,数据预处理是不可或缺的一环。本文将引导你通过Python实现数据清洗、转换和归一化等关键步骤,确保你的数据集为后续分析做好准备。我们将一起学习如何去除空值、异常值,以及如何标准化数据格式,从而让数据变得更加“乖巧”。让我们开始吧,将原始数据转化为洞察力量的旅程!
|
4月前
|
自然语言处理 数据可视化 搜索推荐
用Python制作酷炫词云图,原来这么简单!
用Python制作酷炫词云图,原来这么简单!
|
5月前
|
数据采集 自然语言处理 大数据
​「Python大数据」词频数据渲染词云图导出HTML
使用Python,本文展示数据聚类和办公自动化,焦点在于通过jieba分词处理VOC数据,构建词云图并以HTML保存。`wordCloud.py`脚本中,借助pyecharts生成词云,如图所示,关键词如"Python"、"词云"等。示例代码创建了词云图实例,添加词频数据,并输出到"wordCloud.html"。
103 1
​「Python大数据」词频数据渲染词云图导出HTML
|
5月前
|
数据采集 机器学习/深度学习 数据可视化
关于Python数据分析项目的简要概述:从CSV加载数据,执行数据预处理,进行数据探索,选择线性回归模型进行训练,评估模型性能并优化,最后结果解释与可视化。
【7月更文挑战第5天】这是一个关于Python数据分析项目的简要概述:从CSV加载数据,执行数据预处理(填充缺失值,处理异常值),进行数据探索(可视化和统计分析),选择线性回归模型进行训练,评估模型性能并优化,最后结果解释与可视化。此案例展示了数据科学的典型流程。
89 2
|
6月前
|
数据采集 自然语言处理 数据可视化
拿来及用的Python词云图代码 | wordcloud生成词云详解
词云也叫文字云,是一种可视化的结果呈现,常用在爬虫数据分析中,原理就是统计文本中高频出现的词,过滤掉某些干扰词,将结果生成一张图片,直观的获取数据的重点信息。今天,我们就来学习一下Python生成词云的常用库wordcloud。
|
20天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
19天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
7天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
101 80