大数据分析 | 用 Python 做文本词频分析

Posted Enovo_飞鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据分析 | 用 Python 做文本词频分析相关的知识,希望对你有一定的参考价值。

老师教给我,要学骆驼,沉得住气的动物。看它从不着急,慢慢地走,慢慢地嚼,总会走到的,总会吃饱的。

———《城南旧事


目录

一、前言

Python 简介

Python 特点

二、基本环境配置

三、分析

Part1介绍

Part2词频分析对象——《“十四五”规划》

Part3文本预处理

Part4中文分词——全都是“干货”

1添加自定义词库(特色词库)

2进行分词

3去除停用词

4按需处理其他词语

Part5生成词频统计表

1统计词频

2将词频统计结果保存为表格

Part6全部代码

Part7总结

获取源码?私信?关注?点赞?收藏?

 


一、前言

 

Python 简介

Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。

Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。

  • Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于php和Perl语言。

  • Python 是交互式语言: 这意味着,您可以在一个 Python 提示符 >>> 后直接执行代码。

  • Python 是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。

  • Python 是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发,从简单的文字处理到 WWW 浏览器再到游戏。

Python 特点

  • 1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。

  • 2.易于阅读:Python代码定义的更清晰。

  • 3.易于维护:Python的成功在于它的源代码是相当容易维护的。

  • 4.一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好。

  • 5.互动模式:互动模式的支持,您可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片断。

  • 6.可移植:基于其开放源代码的特性,Python已经被移植(也就是使其工作)到许多平台。

  • 7.可扩展:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那部分程序,然后从你的Python程序中调用。

  • 8.数据库:Python提供所有主要的商业数据库的接口。

  • 9.GUI编程:Python支持GUI可以创建和移植到许多系统调用。

  • 10.可嵌入: 你可以将Python嵌入到C/C++程序,让你的程序的用户获得"脚本化"的能力。

 


二、基本环境配置


版本:Python3

系统:Windows

相关库:requests,lxml,numpy,Counter,pandas,re,jieba

开发工具:Pycharm

在这里我使用的是 anaconda ,众所周知这是一个大软件,但是它的环境是比较全面的,在之前的学习中,我们用的是这个软件。

anconda,可以理解成运输车,每当下载anconda的时候,里面不仅包含了python,还有180多个库(武器)一同被打包下载下来

下载完anconda之后,再也不用一个个下载那些库了。

 


 

三、分析

Part1介绍

文本分析一直都是数据分析的重要组成,研究方向众多,包括但不限于词频分析、情感分析、文本分类、文本可视化等。其中一些方向研究难度不小,存在一定的技术门槛,但在中文文本分析中,大多数的研究方向都和词语息息相关,所以文本词频分析往往是文本分析的“第一步”。

 

在技术资源和数据资源丰饶的现代,人人都可以自建炉灶,进行自己的文本研究。一些读者可能在技术操作上存在困难,故而本文就来为大家在词频分析方面提供一些微小的帮助。

 

本文中所有 Python 代码均在集成开发环境 PyCharm 中以及使用交互式开发环境 Jupyter Notebook 编写和运行,使用到的 Python 库有 re(用于文本预处理)、jieba(用于中文分词)、collections(用于词频统计)、pandas (用于词频统计表的制作和保存)。

 


 

Part2词频分析对象——《“十四五”规划》

我们以国家指导文件《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》(下文简称为《“十四五”规划》)中的文本内容作为此次词频分析的文本对象。

首先将文本保存为文本文件(txt 文件),正文部分如下图所示。

 


 

Part3文本预处理

首先使用 Python 读取文本,代码如下:

with open('十四五规划.txt', 'r', encoding='utf-8') as f:
    # encoding 参数需要根据文本文件实际的编码来设置
    Text = f.read()  # 读取全部内容
f.close()            # 关闭文件,必要的操作
# 输出正文的前 200 个字符
Text[2024:2224]

Python 读取文本文件时,会加载所有文本,包括空格和换行符。在文章正文的书写中,我们难以避免地使用换行来让文字连续。这有利于阅读,但使用 Python 读取文档时会读到很多换行符以及其他的空白字符,这严重影响了文本中词语的连续性,所以将换行符和空白符全部去除是一个不错的解决方案,操作代码如下:

import re
# 使用正则表达式去除文本中所有的换行符和空白符
Text = re.sub('\\s+', '', Text) 

下图是去除换行符后正文(不含目录)的一部分:

💡小贴士

 文本经过预处理后,在后续的分词过程中不会受到干扰字符(换行符,空格)的影响,分词效果更好。


 

Part4中文分词——全都是“干货”

分词是词频分析最重要的一步,分词的效果和准确性直接影响词频统计的结果,所以在分词方面,需要多做一些工作。

jieba 是 Python 的一个第三方库,可以用于分词,筛选关键词等。Python 有不少分词工具,jieba 的分词效果不一定是最好的,但是它的普适性、易用性、可扩展性一定是非常优秀的,本文就用它作为分词的工具。

1添加自定义词库(特色词库)

jieba 分词以基本词库为标准,一般词语的颗粒度比较小,鲜有某专业领域的特色词。因此我们可以将一些字数较多的词语和专业领域的特色词,添加到我们的特色词库。将特色词库导入后,这些词语的权重要比常规词语高一些,jieba 会优先将他们视作词语进行分词。

添加自定义词语有两种方式,一种是使用 jieba.add_word 添加,代码如下:

import jieba
jieba.add_word('特色词')

另一种是将所有词语存入 txt(编码为UTF-8)中,使用 jieba.load_userdict 添加,我们随意从《“十四五”规划》文本中选取 50 个词语作为特色词保存到 txt 中,词库格式如下图所示:

发展
建设
制度
安全
产业
创新
经济
保障
改革
文化

将此 txt 加载到 jieba 特色词库的代码如下:

# Special_words.txt 是特色词语的路径
jieba.load_userdict('Special_words.txt')

2进行分词

使用jieba.lcut 对文章进行分词,所有词语保存为一个列表,代码如下:

Words_list = jieba.lcut(Text)  # 进行分词,结果为词语列表
print(len(Words_list)) # 输出词语总数量,结果为 32789
Words_list[:10]  # 输出前 10 个词语

3去除停用词

停用词一般指文本中一些无实际意义的语气词,助词等用处不大的词语,因此需要在对分解结果进行处理,去除其中的停用词。有许多机构已经收录了很多常见的停用词,我们使用百度收录的停用词库来去除停用词,停用词库(txt 文件)如下图所示:

自身
至
于
若是
莫若
获得
虽
虽则
虽然

去除停用词的原理其实很简单,就是将停用词库加载为一个词语列表,再将分词列表中出现在停用词库中的词语去除即可。将停用词库加载为词列表的代码如下:

Stopwords = open('./停用词/baidu_stopwords.txt', 'r', encoding='utf-8').readlines()
Stopwords = [word.strip() for word in Stopwords]

去除分词列表中停用词的代码如下:

Words_list = [word for word in Words_list if word not in Stopwords]
# 输出去停用词后的总词数
print(len(Words_list)) # 输出:28337, 较去除之前减少了 4452 个词语

4按需处理其他词语

在去除停用词后,词语列表中仍有一些我们不需要的词语,如“”、“”、“13” 、“/” 等实际不需要的词语,我们编写代码去除所有不含中文的词语和字数为1的词语,代码如下:

# 去除不含中文的词语
Words_list = [word for word in Words_list if bool(re.search('[\\u4e00-\\u9fa5]', word)) == True]
# 去除字数为 1 的词语
Words_list = [word for word in Words_list if len(word) != 1]
# 输出剩余词语的数量
print(len(Words_list))    # 输出:21913

经过两轮清洗,词语总数量已经从 32789 减少到 21913 个词语,一共去除 10876 个不需要的词语,剩余的词语均是有意义的词语,对清洗后的结果做词频统计才更加有意义。也可见数据预处理的重要性。


 

Part5生成词频统计表

1统计词频

对分词结果进行清理后,可以开始对剩余的词语做词频统计了。Counter 是 Python  中 collections 库中的一个函数,可以用于统计列表元素出现频率,词频统计的代码如下:

from collections import Counter # 导入频率统计函数
Word_count = Counter(Words_list) # 统计词频,所得结果为 Counter 对象
Word_count = dict(Word_count) # 将结果转为字典对象
Word_count

2将词频统计结果保存为表格

可以使用 pandas 将所有词语及其频率保存到 excel 表中,方便查看,生成以及保存到表的代码如下:

import pandas as pd
Table = pd.DataFrame(columns=['词语', '词频']) # 生成空表
Table['词语'] = list(Word_count.keys())   # 词语字段保存词语
Table['词频'] = list(Word_count.values()) # 词频字段保存词语对应的词频
Table = Table.sort_values(by=['词频'], ascending=False) # 按照词频降序排序
Table.to_excel('十四五规划词频统计表.xlsx', index=False) # 将结果保存为 excel 表

 

另外我们也可以提取我们添加的特色词,获取一个只包含特色词的词频统计表,代码如下:

# 读取特色词库为词列表
Specialwords = open('Special_words.txt', 'r', encoding='utf-8').readlines()
Specialwords = [word.strip() for word in Stopwords]
# 获取分词处理结果中所有的特色词,这个结果可以直接用来制作词云图
Special_words = [word for word in Words_list if word in Specialwords]
# 对特色词做词频统计
Special_count = dict(Counter(Special_words))
# 生成词频统计表并保存
Table_special = pd.DataFrame(columns=['特色词语', '词频'])
Table_special['特色词语'] = list(Special_count.keys())
Table_special['词频'] = list(Special_count.values())
Table_special = Table_special.sort_values(by=['词频'], ascending=False)
Table_special.to_excel('十四五规划特色词语词频统计表.xlsx', index=False)

 

我们还可以根据特色词语列表(不去重)来制作词云图,也就是文章顶部的那张词云图了。

 


Part6全部代码

# 导入工具包
import re, jieba
import pandas as pd
from collections import Counter

# 读取文本
with open('十四五规划.txt', 'r', encoding='utf-8') as f:
    # encoding 参数需要根据文本文件实际的编码来设置,也可以
    # 事先对 txt 进行转码
    Text = f.read()  # 读取全部内容
f.close()            # 关闭文件,必要的操作

# 使用正则表达式去除文本中所有的换行符和空白符
Text = re.sub('\\s+', '', Text)

# 导入特色词库
jieba.load_userdict('Special_words.txt')

# 进行分词,所得结果为词语列表
Words_list = jieba.lcut(Text)

# 加载停用词、去除停用词
Stopwords = open('./停用词/baidu_stopwords.txt', 'r', encoding='utf-8').readlines()
Stopwords = [word.strip() for word in Stopwords]
Words_list = [word for word in Words_list if word not in Stopwords]
# 去除不含中文的词语
Words_list = [word for word in Words_list if bool(re.search('[\\u4e00-\\u9fa5]', word)) == True]
# 去除字数为 1 的词语
Words_list = [word for word in Words_list if len(word) != 1]

# 统计词频 
Word_count = dict(Counter(Words_list))

# 生成词频统计表
Table = pd.DataFrame(columns=['词语', '词频']) # 生成空表
Table['词语'] = list(Word_count.keys())   # 词语字段保存词语
Table['词频'] = list(Word_count.values()) # 词频字段保存词语对应的词频
Table = Table.sort_values(by=['词频'], ascending=False) # 按照词频降序排序
Table.to_excel('十四五规划词频统计表.xlsx', index=False) # 将结果保存为 excel 表

 

Part7总结

本文为大家介绍了如何使用 Python 进行文本分分析中的词频分析。从文本读取,到词频统计表的生成,讲解了每一步的代码和作用。

最后,希望大家可以提出宝贵的建议和意见,我会认真聆听,并努力实现。

在我之前的博客中,有一些关于Python程序设计的博客,感兴趣的同学们可以看一看,感谢支持🙇‍!!!


以上就是本篇文章的全部内容了

 ~ 关注我,点赞博文~ 每天带你涨知识!

1.看到这里了就 [点赞+好评+收藏] 三连 支持下吧,你的「点赞,好评,收藏」是我创作的动力。

2.关注我 ~ 每天带你学习 :各种前端插件、3D炫酷效果、图片展示、文字效果、以及整站模板 、html模板 、C++、数据结构、Python程序设计、Java程序设计、爬虫等! 「在这里有好多 开发者,一起探讨 前端 开发 知识,互相学习」!

3.以上内容技术相关问题可以相互学习,可 关 注 ↓公 Z 号 获取更多源码 !
 

获取源码?私信?关注?点赞?收藏?

👍+✏️+⭐️+🙇‍

有需要源码的小伙伴可以 关注下方微信公众号 " Enovo开发工厂 ",回复 关键词 " a-python1" 


 

 

 

用python对modern family 摩登家庭 1~11季剧本台词的词频分析

摩登家庭这部美剧学英语应该不模式,某宝上买了1~11季的台词,想对里面得单词出现频率做个统计,高频出现的单词应该就是日常常用的,应该牢牢记住。出现次数太低的也可以不用学了。

分析程序用的是python语言。

其中单词总量:23298个,分析结果以txt文本文件保存。词频结果下载

按流水号,单词,出现频率记录。如下:

1 i 32743
2 you 30923
3 the 23733
4 a 21256
5 to 20402
6 and 13428
7 it 12405
8 that 12020
9 of 9744

....

23291 conspiring 1
23292 subletting 1
23293 coughed 1
23294 overnighted 1
23295 biologist 1
23296 waitressing 1
23297 secret\'s 1
23298 muriel 1

出现次数最高的单词依然是i,you,the这类的。

代码如下:

 import os
 import re
 
 from docx import Document
 
 word_dic = 
 for root, dirs, files in os.walk(r\'H:\\english study\'):
     for file in files:
         file_path = \'\\\\\'.format(root, file)
         print(file_path)
         doc = Document(file_path)
         for para in doc.paragraphs:
             # print(para.text)
             rst = re.findall(r\'\\b[a-zA-Z\\\']+\\b\', para.text)
             if rst:
                 for word in rst:
                     word = word.lower()
                     count = word_dic.get(word)
                     if count:
                         word_dic[word] = count + 1
                     else:
                         word_dic[word] = 1
 sort_list = sorted(word_dic.items(), key=lambda x: x[1], reverse=True)
 i = 1
 
 with open(\'e:\\\\modern famile word sort.txt\',mode=\'w\',encoding=\'utf-8\') as f:
     for word in sort_list:
         line=\'  \\n\'.format(i, word[0], word[1])
         f.write(line)
         i = i + 1
 print(\'done, 单词总量:\'.format(len(sort_list)))

 

以上是关于大数据分析 | 用 Python 做文本词频分析的主要内容,如果未能解决你的问题,请参考以下文章

用Python统计词频

用python对modern family 摩登家庭 1~11季剧本台词的词频分析

用Py做文本分析5:关键词提取

文本挖掘之词频分析“结巴”分词

python bs4怎么抓豆瓣评论做词频表

如何用python和jieba分词,统计词频?