python-分享篇-用Python分析文本数据的词频

上次批量提取了上市公司主要业务信息,要分析这些文本数据,就需要做文本词频分析。由于中文不同于英文,词是由一个一个汉字组成的,而英文的词与词之间本身就有空格,所以中文的分词需要单独的库才能够实现,常用的是jieba。若没安装,直接运行cmd,然后输入pip install jieba安装即可。然后导入jieba库。我们以“华特气体”公司的主要业务进行分词,分词前如下图所示。通过open打开华特气体文本文件,使用读模式r,为避免编码错误,指定编码类型为utf-8。读取出来是一个大字符串,将这个大字符串存入txt。然后调用jieba进行分词。lcut的意思是切分词后再转换成列表("l"即表示list的首字母)。将切分后的词存入列表words
在这里插入图片描述

import jieba
txt = open("华特气体.txt", "r", encoding="utf-8").read()
words = jieba.lcut(txt)
words
['主要',
 '业务',
 '\\',
 '华特',
 '气体',
 ':',
 '2019',
 '年',
 '年度报告',
 '(',
 '修订版',
 ')',
 '\n',
 '一',
 '、',
 ' ',
 '报告',
 '期内',
 '公司',
 '所',
 '从事',
 '的',
 '主要',
 '业务',
 '、',
...
 '采购',
 '合作',
 '关系',
 '。',
 ...]
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...
[('气体', 151),
 ('公司', 76),
 ('特种', 52),
 ('行业', 42),
 ('产品', 42),
 ('高纯', 42),
 ('生产', 41),
 ('000', 35),
 ('客户', 34),
 ('发展', 34),
 ('研发', 31),
 ('产业', 30),
 ('技术', 30),
 ('主要', 29),
 ('实验', 24)]
[('气体', 151),
 ('特种', 52),
 ('产品', 42),
 ('高纯', 42),
 ('生产', 41),
 ('客户', 34),
 ('发展', 34),
 ('研发', 31),
 ('产业', 30),
 ('技术', 30),
 ('主要', 29),
 ('实验', 24),
 ('国内', 23),
 ('2019', 22),
 ('模式', 22)]
词	次数
0	气体	151
1	特种	52
2	产品	42
3	高纯	42
4	生产	41
5	客户	34
6	发展	34
7	研发	31
8	产业	30
9	技术	30
['主要业务\\东旭蓝天:2019年年度报告.txt',
 '主要业务\\保利地产:2018年年度报告.txt',
 '主要业务\\共达电声:2019年年度报告(更新后).txt',
 '主要业务\\华特气体:2019年年度报告(修订版).txt',
 '主要业务\\吉峰科技:2019年年度报告(更新后).txt',
 '主要业务\\引力传媒:2019年年度报告(修订版).txt',
 '主要业务\\方正科技:2019年年度报告.txt',
 '主要业务\\湖北宜化:2019年年度报告(更新后).txt',
 '主要业务\\联创股份:2019年年度报告(更新后).txt',
 '主要业务\\高乐股份:2019年年度报告.txt']

结果如上,可见基本是按照我们的汉字使用习惯来区分词的,不能组成词的字则是按单独一个字符串存放的。然后我们就需要将词和对应出现的次数统计出来。先新建一个字典wordsDict用于储存词及其出现的次数。对于单个的字或字符不是我们想要的,所以加了一个if语句将其排除在外。continue的作用是,if后面的条件满足时,让程序回到for循环,而不执行continue下面的语句。也就是列表中的元素只有一个字符的时候,就马上跳到下一个而不执行任何操作。只有当元素不止一个字符的时候,才执行else语句,即将词及其出现的次数加入字典。此处用setdefault给词的出现初始值设置为0,每重复出现一次,自动加1。然后我们根据此出现的次数,降序排序,并查看前20个词的情况。

wordsDict = {} #新建字典用于储存词及词频
for word in words:
    if len(word) == 1: #单个的字符不作为词放入字典
        continue
    else:
        wordsDict.setdefault(word, 0) #设置词的初始出现次数为0
        wordsDict[word] +=1 #对于重复出现的词,每出现一次,次数增加1
        
wordsDict_seq = sorted(wordsDict.items(),key=lambda x:x[1], reverse=True) #按字典的值降序排序
wordsDict_seq[:15] 
['主要',
 '业务',
 '\\',
 '华特',
 '气体',
 ':',
 '2019',
 '年',
 '年度报告',
 '(',
 '修订版',
 ')',
 '\n',
 '一',
 '、',
 ' ',
 '报告',
 '期内',
 '公司',
 '所',
 '从事',
 '的',
 '主要',
 '业务',
 '、',
...
 '采购',
 '合作',
 '关系',
 '。',
 ...]
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...
[('气体', 151),
 ('公司', 76),
 ('特种', 52),
 ('行业', 42),
 ('产品', 42),
 ('高纯', 42),
 ('生产', 41),
 ('000', 35),
 ('客户', 34),
 ('发展', 34),
 ('研发', 31),
 ('产业', 30),
 ('技术', 30),
 ('主要', 29),
 ('实验', 24)]
[('气体', 151),
 ('特种', 52),
 ('产品', 42),
 ('高纯', 42),
 ('生产', 41),
 ('客户', 34),
 ('发展', 34),
 ('研发', 31),
 ('产业', 30),
 ('技术', 30),
 ('主要', 29),
 ('实验', 24),
 ('国内', 23),
 ('2019', 22),
 ('模式', 22)]
词	次数
0	气体	151
1	特种	52
2	产品	42
3	高纯	42
4	生产	41
5	客户	34
6	发展	34
7	研发	31
8	产业	30
9	技术	30
['主要业务\\东旭蓝天:2019年年度报告.txt',
 '主要业务\\保利地产:2018年年度报告.txt',
 '主要业务\\共达电声:2019年年度报告(更新后).txt',
 '主要业务\\华特气体:2019年年度报告(修订版).txt',
 '主要业务\\吉峰科技:2019年年度报告(更新后).txt',
 '主要业务\\引力传媒:2019年年度报告(修订版).txt',
 '主要业务\\方正科技:2019年年度报告.txt',
 '主要业务\\湖北宜化:2019年年度报告(更新后).txt',
 '主要业务\\联创股份:2019年年度报告(更新后).txt',
 '主要业务\\高乐股份:2019年年度报告.txt']

可以看到,有些词并不是我们想要的,比如“公司”、“行业”、“000”。因此需要把这些意义不大的词删除。先定义一个储存要排除的词的列表stopWords,将想排除的词放进去,一般是放出现次数较多,但意义不大的词,可根据实际需要调整。然后遍历这个字典,在检查这些词是否在目标字典wordsDict中,如果在,就将字典中这个词对应的数据删除。

stopWords = ["公司","行业","000","用于","情况","方面","一种","要求","对于","进行","一般","212","实现","处理","通过","投入","随着"]
for word in stopWords:
    if word in wordsDict:
        del wordsDict[word] #删除对应的词
        
wordsDict_seq = sorted(wordsDict.items(),key=lambda x:x[1], reverse=True) #按字典的值降序排序
wordsDict_seq[:15] 
['主要',
 '业务',
 '\\',
 '华特',
 '气体',
 ':',
 '2019',
 '年',
 '年度报告',
 '(',
 '修订版',
 ')',
 '\n',
 '一',
 '、',
 ' ',
 '报告',
 '期内',
 '公司',
 '所',
 '从事',
 '的',
 '主要',
 '业务',
 '、',
...
 '采购',
 '合作',
 '关系',
 '。',
 ...]
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...
[('气体', 151),
 ('公司', 76),
 ('特种', 52),
 ('行业', 42),
 ('产品', 42),
 ('高纯', 42),
 ('生产', 41),
 ('000', 35),
 ('客户', 34),
 ('发展', 34),
 ('研发', 31),
 ('产业', 30),
 ('技术', 30),
 ('主要', 29),
 ('实验', 24)]
[('气体', 151),
 ('特种', 52),
 ('产品', 42),
 ('高纯', 42),
 ('生产', 41),
 ('客户', 34),
 ('发展', 34),
 ('研发', 31),
 ('产业', 30),
 ('技术', 30),
 ('主要', 29),
 ('实验', 24),
 ('国内', 23),
 ('2019', 22),
 ('模式', 22)]
词	次数
0	气体	151
1	特种	52
2	产品	42
3	高纯	42
4	生产	41
5	客户	34
6	发展	34
7	研发	31
8	产业	30
9	技术	30
['主要业务\\东旭蓝天:2019年年度报告.txt',
 '主要业务\\保利地产:2018年年度报告.txt',
 '主要业务\\共达电声:2019年年度报告(更新后).txt',
 '主要业务\\华特气体:2019年年度报告(修订版).txt',
 '主要业务\\吉峰科技:2019年年度报告(更新后).txt',
 '主要业务\\引力传媒:2019年年度报告(修订版).txt',
 '主要业务\\方正科技:2019年年度报告.txt',
 '主要业务\\湖北宜化:2019年年度报告(更新后).txt',
 '主要业务\\联创股份:2019年年度报告(更新后).txt',
 '主要业务\\高乐股份:2019年年度报告.txt']

然后将筛选后的数据转换成DataFrame,并增加列名“词”和“次数”,然后导出为Excel文件。

df = pd.DataFrame(wordsDict_seq,columns=['词','次数'])
df.to_excel("华特气体-词频.xlsx",index = False) #存为Excel时去掉index索引列
df.head(10)

以上,搞定了一个文件的词频收集,那批量操作呢?请看下面分解。

import os
path='主要业务'  #文件所在文件夹
files = [path+"\\"+i for i in os.listdir(path)] #获取文件夹下的文件名,并拼接完整路径
files
['主要',
 '业务',
 '\\',
 '华特',
 '气体',
 ':',
 '2019',
 '年',
 '年度报告',
 '(',
 '修订版',
 ')',
 '\n',
 '一',
 '、',
 ' ',
 '报告',
 '期内',
 '公司',
 '所',
 '从事',
 '的',
 '主要',
 '业务',
 '、',
...
 '采购',
 '合作',
 '关系',
 '。',
 ...]
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...
[('气体', 151),
 ('公司', 76),
 ('特种', 52),
 ('行业', 42),
 ('产品', 42),
 ('高纯', 42),
 ('生产', 41),
 ('000', 35),
 ('客户', 34),
 ('发展', 34),
 ('研发', 31),
 ('产业', 30),
 ('技术', 30),
 ('主要', 29),
 ('实验', 24)]
[('气体', 151),
 ('特种', 52),
 ('产品', 42),
 ('高纯', 42),
 ('生产', 41),
 ('客户', 34),
 ('发展', 34),
 ('研发', 31),
 ('产业', 30),
 ('技术', 30),
 ('主要', 29),
 ('实验', 24),
 ('国内', 23),
 ('2019', 22),
 ('模式', 22)]
词	次数
0	气体	151
1	特种	52
2	产品	42
3	高纯	42
4	生产	41
5	客户	34
6	发展	34
7	研发	31
8	产业	30
9	技术	30
['主要业务\\东旭蓝天:2019年年度报告.txt',
 '主要业务\\保利地产:2018年年度报告.txt',
 '主要业务\\共达电声:2019年年度报告(更新后).txt',
 '主要业务\\华特气体:2019年年度报告(修订版).txt',
 '主要业务\\吉峰科技:2019年年度报告(更新后).txt',
 '主要业务\\引力传媒:2019年年度报告(修订版).txt',
 '主要业务\\方正科技:2019年年度报告.txt',
 '主要业务\\湖北宜化:2019年年度报告(更新后).txt',
 '主要业务\\联创股份:2019年年度报告(更新后).txt',
 '主要业务\\高乐股份:2019年年度报告.txt']

以上,先获取到所有待分析文件的路径。然后逐个进行分析。稍微修改一下上面的程序,很快分析完成。结果如下。
在这里插入图片描述

import jieba
import pandas as pd

for file in files:

    txt = open(file, "r", encoding="utf-8").read()
    words = jieba.lcut(txt)
    wordsDict = {} #新建字典用于储存词及词频
    for word in words:
        if len(word) == 1: #单个的字符不作为词放入字典
            continue
        else:
            wordsDict.setdefault(word, 0) #设置词的初始出现次数为0
            wordsDict[word] +=1 #对于重复出现的词,每出现一次,次数增加1

    stopWords = ["2019","不断","持续","主要","企业","产品","业务","公司","行业","000","用于","情况","方面","一种","要求","对于","进行","一般","212","实现","处理","通过","投入","随着"]
    for word in stopWords:
        if word in wordsDict:
            del wordsDict[word] #删除对应的词

    wordsDict_seq = sorted(wordsDict.items(),key=lambda x:x[1], reverse=True) #按字典的值降序排序

    df = pd.DataFrame(wordsDict_seq,columns=['词','次数'])
    df.to_excel("词频//{}.xlsx".format(file.split("\\")[1][:-4]),index = False) #存为Excel时去掉index索引列
  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fo安方

觉得俺的文章还行,感谢打赏,爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值