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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
大数据开发治理平台 DataWorks,不限时长
简介: 这段文本是关于如何使用Python基于词频生成词云图的教程。内容包括:1) 中文分词的必要性,因中文无明显单词边界及语言单位特性;2) 文本预处理步骤,如移除特殊符号、网址、日期等;3) 使用`data_process`函数清除无用字符;4) `getText`函数读取并处理文本为句子数组;5) 使用jieba分词库进行分词和词频统计;6) 示例代码展示了从分词到生成词云的完整流程,最后展示生成的词云图。整个过程旨在从中文文本中提取关键词并可视化。

基于词频生成词云图

背景目的

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

基于词频生成词云步骤

为什么中文需要分词

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

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

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

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

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

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

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

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

文本预处理

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

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

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

数据处理函数

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

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

目录
相关文章
|
1月前
|
数据采集 自然语言处理 搜索推荐
python【包含数据预处理】基于词频生成词云图
背景目的 有一篇中文文章,或者一本小说。想要根据词频来生成词云图。
|
12天前
|
数据采集 自然语言处理 大数据
​「Python大数据」词频数据渲染词云图导出HTML
使用Python,本文展示数据聚类和办公自动化,焦点在于通过jieba分词处理VOC数据,构建词云图并以HTML保存。`wordCloud.py`脚本中,借助pyecharts生成词云,如图所示,关键词如"Python"、"词云"等。示例代码创建了词云图实例,添加词频数据,并输出到"wordCloud.html"。
36 1
​「Python大数据」词频数据渲染词云图导出HTML
|
15天前
|
数据采集 机器学习/深度学习 数据可视化
关于Python数据分析项目的简要概述:从CSV加载数据,执行数据预处理,进行数据探索,选择线性回归模型进行训练,评估模型性能并优化,最后结果解释与可视化。
【7月更文挑战第5天】这是一个关于Python数据分析项目的简要概述:从CSV加载数据,执行数据预处理(填充缺失值,处理异常值),进行数据探索(可视化和统计分析),选择线性回归模型进行训练,评估模型性能并优化,最后结果解释与可视化。此案例展示了数据科学的典型流程。
34 2
|
26天前
|
数据采集 自然语言处理 数据可视化
拿来及用的Python词云图代码 | wordcloud生成词云详解
词云也叫文字云,是一种可视化的结果呈现,常用在爬虫数据分析中,原理就是统计文本中高频出现的词,过滤掉某些干扰词,将结果生成一张图片,直观的获取数据的重点信息。今天,我们就来学习一下Python生成词云的常用库wordcloud。
|
11天前
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
26 3
|
13天前
|
开发者 Python
Python元类实战:打造你的专属编程魔法,让代码随心所欲变化
【7月更文挑战第7天】Python的元类是编程的变形师,用于创建类的“类”,赋予代码在构建时的变形能力。
34 1
|
11天前
|
数据采集 大数据 数据安全/隐私保护
Python编程:如何有效等待套接字的读取与关闭
Python网络编程中,套接字事件处理至关重要。利用`selectors`模块和代理IP能增强程序的稳定性和可靠性。代码示例展示了如何通过代理连接目标服务器,注册套接字的读写事件并高效处理。在代理IP配置、连接创建、事件循环及回调函数中,实现了数据收发与连接管理,有效应对网络爬虫或聊天应用的需求,同时保护了真实IP。
Python编程:如何有效等待套接字的读取与关闭
|
2天前
|
Python
告别低效!Python并查集:数据结构界的超级英雄,拯救你的编程人生!
【7月更文挑战第18天】并查集,数据结构超级英雄,用于不相交集合的合并与查询。Python实现包括初始化、查找根节点和合并操作。应用广泛,如社交网络分析、图论问题、集合划分等。示例代码展示了解决岛屿数量问题,统计连通的“1”单元格数。掌握并查集,提升编程效率,解决复杂问题。
16 6
|
1天前
|
存储 开发者 Python
从理论到实践:Python中Trie树与Suffix Tree的完美结合,开启编程新篇章!
【7月更文挑战第19天】在编程实践中,Trie树和Suffix Tree优化了字符串处理。Trie树用于快速拼写检查,如在构建词库后,能高效判断单词是否存在。Suffix Tree则助力文本相似度检测,找寻共同子串。通过Python示例展示了Trie树插入和搜索方法,并指出Suffix Tree虽复杂但能提升性能。结合两者,实现复杂功能,展现数据结构的强大。
16 3
|
6天前
|
数据挖掘 开发者 Python
如何自学Python编程?
【7月更文挑战第14天】如何自学Python编程?
19 4