【年报文本分析】第四辑:python批量处理PDF文档,输出自定义关键词的出现次数

序言

做这个的背景是研究生导师要批量处理新三板文本数据,提取出一些自定义的关键词的词频

代码能够运行,但效率不一定最优(我的配置能够实现2.5s一份),需要安装指定的第三方模块(jieba、pdfminer等)

在我电脑里可以运行,里面涉及到一些路径(rename里的path)和参数(全局变量里的自定义词语和文件数量)需要自己去阅读和调整,如果按照文章内容还是不能运行的话,可以评论个邮箱,我打包代码和数据发给你

函数模块介绍

具体的代码可见全部代码部分,这部分只介绍思路和相应的函数模块

获取文件夹下的所有文件名称

#获取文件夹下的所有文件名称
def oslist(dealPdf):
    file_name=list()
    for i in os.listdir(dealPdf):
        data_collect= ''.join(i)
        file_name.append(data_collect)
    return file_name

将PDF转化为txt,并删除换行符

PDF是无法直接进行文本分析的,所以需要将文字转成txt文件(PDF中图内的文字无法提取),因为PDF导出的txt会用换行符换行,为了避免词语因此拆开,所以删除所有的换行符

#将pdf文件转化成txt文件,并删除换行符
def pdf_to_txt(dealPdf,name):
    # 不显示warning
    logging.propagate = False
    logging.getLogger().setLevel(logging.ERROR)
    pdf_filename = dealPdf
    device = PDFPageAggregator(PDFResourceManager(), laparams=LAParams())
    interpreter = PDFPageInterpreter(PDFResourceManager(), device)    
    parser = PDFParser(open(pdf_filename, 'rb'))
    doc = PDFDocument(parser)
    dealTxt='TXT\\saler\\'#保存txt文件的地址 
    txt_filename=dealTxt+name+'.txt'       
    # 检测文档是否提供txt转换,不提供就忽略
    if not doc.is_extractable:
        raise PDFTextExtractionNotAllowed
    else:
        with open(txt_filename, 'w', encoding="utf-8") as fw:
            for i,page in enumerate(PDFPage.create_pages(doc)):
                interpreter.process_page(page)
                # 接受该页面的LTPage对象
                layout = device.get_result()
                # 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象
                for x in layout:
                    if isinstance(x, LTTextBoxHorizontal):
                        results = x.get_text()
                        results=results.replace(' ','').replace('\n','')
                        fw.write(results)

添加自定义词语

此处可以根据自己的需要自定义,传入的wordsByMyself是全局变量

def word_by_myself():
    for i in range(len(wordsByMyself)):
        jieba.add_word(wordsByMyself[i])

分词与词频统计

调用jieba进行分词,读取通用词表去掉停用词(此步其实可以省略,对最终结果影响不大),将词语和出现次数合成为键值对,输出关键词出现次数

#分词并进行词频统计
def cut_and_count(outPutTxt):
    with open(outPutTxt,encoding='utf-8') as f: 
        #step1:读取文档并调用jieba分词
        text=f.read() 
        words=jieba.lcut(text)
        #step2:读取停用词表,去停用词
        stopwords = {}.fromkeys([ line.rstrip() for line in open('stopwords.txt',encoding='utf-8') ])
        finalwords = []
        for word in words:
            if word not in stopwords:
                if (word != "。" and word != ",") :
                    finalwords.append(word)       
        
        
        #step3:统计特定关键词的出现次数
        valuelist=[0]*len(wordsByMyself)
        counts=dict(zip(wordsByMyself,valuelist))
        for word in finalwords:
            if len(word) == 1:#单个词不计算在内
                continue
            else:
                counts[word]=counts.get(word,0)+1#遍历所有词语,每出现一次其对应值加1
        for i in range(len(wordsByMyself)):
            if wordsByMyself[i] in counts:
                print(wordsByMyself[i]+':'+str(counts[wordsByMyself[i]]))
            else:
                print(wordsByMyself[i]+':0')

主函数

通过for循环进行批量操作

if __name__ == "__main__":
    dealPdf='PDF\\saler'#保存pdf文件的地址                                                                                                                                                      
    file_name=oslist(dealPdf)
    df=pd.DataFrame(columns=wordsByMyself,index=range(1,fileNum+1))    
    # 该程序支持中断,如数据量较大,中断后将range的第一个参数改完当前i的取值即可
    for i in range(0,len(file_name)):
        pdf_to_txt(dealPdf+'\\'+file_name[i],file_name[i][:-4])#将pdf文件转化成txt文件,传入文件路径 
        print(str(i)+'完成转换')
    
    for i in range(0,len(file_name)):
        word_by_myself()#添加自定义词语
        print(f'----------result {i}----------')
        cut_and_count('TXT\\saler\\'+file_name[i][:-4]+'.txt',df,i)#分词并进行词频统计,传入文件路径
    

本地文件结构

在这里插入图片描述

全部代码

import jieba
import jieba.analyse
import pandas as pd
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams
from pdfminer.pdfpage import PDFPage,PDFTextExtractionNotAllowed
import logging                                       
import os

'''
该代码运行前需要调整三个变量,即:
自定义的关键词wordsByMyself
保存年报pdf的地址dealPdf
保存拆分后的txt的地址dealTxt

若年报数据量较少,调整好以上变量后即可一次性运行完成,结果将保存到该文件同级目录下
若年报数据量较大,该程序支持中断,中断后将主程序中的range()的第一个参数改完当前i加1后的取值即可
'''

wordsByMyself=['社会责任','援助','捐赠','扶贫','乡村','供应商','技术','创新'] #自定义词语,全局变量


#获取文件夹下的所有文件名称
def oslist(dealPdf):
    file_name=list()
    for i in os.listdir(dealPdf):
        data_collect= ''.join(i)
        file_name.append(data_collect)
    return file_name
    

#将pdf文件转化成txt文件,并删除换行符
def pdf_to_txt(dealPdf,name):
    # 不显示warning
    logging.propagate = False
    logging.getLogger().setLevel(logging.ERROR)
    pdf_filename = dealPdf
    device = PDFPageAggregator(PDFResourceManager(), laparams=LAParams())
    interpreter = PDFPageInterpreter(PDFResourceManager(), device)    
    parser = PDFParser(open(pdf_filename, 'rb'))
    doc = PDFDocument(parser)
    dealTxt='TXT\\saler\\'#保存txt文件的地址 
    txt_filename=dealTxt+name+'.txt'       
    # 检测文档是否提供txt转换,不提供就忽略
    if not doc.is_extractable:
        raise PDFTextExtractionNotAllowed
    else:
        with open(txt_filename, 'w', encoding="utf-8") as fw:
            for i,page in enumerate(PDFPage.create_pages(doc)):
                interpreter.process_page(page)
                # 接受该页面的LTPage对象
                layout = device.get_result()
                # 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象
                for x in layout:
                    if isinstance(x, LTTextBoxHorizontal):
                        results = x.get_text()
                        results=results.replace(' ','').replace('\n','')
                        fw.write(results)
          
#添加自定义词语    
def word_by_myself():
    for i in range(len(wordsByMyself)):
        jieba.add_word(wordsByMyself[i])

#分词并进行词频统计
def cut_and_count(outPutTxt,df,fileNo):
    with open(outPutTxt,encoding='utf-8') as f: 
        #step1:读取文档并调用jieba分词
        text=f.read() 
        words=jieba.lcut(text)
        #step2:读取停用词表,去停用词
        stopwords = {}.fromkeys([ line.rstrip() for line in open('stopwords.txt',encoding='utf-8') ])
        finalwords = []
        for word in words:
            if word not in stopwords:
                if (word != "。" and word != ",") :
                    finalwords.append(word)              
        #step3:统计特定关键词的出现次数
        valuelist=[0]*len(wordsByMyself)
        counts=dict(zip(wordsByMyself,valuelist))
        for word in finalwords: 
            if len(word) == 1:#单个词不计算在内
                continue
            else:
                counts[word]=counts.get(word,0)+1#遍历所有词语,每出现一次其对应值加1
        for i in range(len(wordsByMyself)):
            if wordsByMyself[i] in counts:
                print(wordsByMyself[i]+':'+str(counts[wordsByMyself[i]]))
                df[wordsByMyself[i]][fileNo]=counts[wordsByMyself[i]]
            else:
                print(wordsByMyself[i]+':0')
                df[wordsByMyself[i]][fileNo]=0
        df.to_csv('result.csv',sep=',')
                                                                                                                                                                                                                                                                                                                                                                                                              
#主函数
if __name__ == "__main__":
    dealPdf='PDF\\saler'#保存pdf文件的地址                                                                                                                                                      
    file_name=oslist(dealPdf)
    #df=pd.DataFrame(columns=wordsByMyself,index=range(1,fileNum+1))    
    # 该程序支持中断,如数据量较大,中断后将range的第一个参数改完当前i的取值即可
    for i in range(1239,len(file_name)):
        pdf_to_txt(dealPdf+'\\'+file_name[i],file_name[i][:-4])#将pdf文件转化成txt文件,传入文件路径 
        print(str(i)+'完成转换')
    
    for i in range(1,fileNum+1):
        word_by_myself()#添加自定义词语
        print(f'----------result {i}----------')
        cut_and_count('outPutTxt\\'+str(i)+'.txt',df,i)#分词并进行词频统计,传入文件路径
    

结果预览

在这里插入图片描述

  • 27
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 116
    评论
对于Python上市公司年报文本分析,可以采取以下步骤: 1. 准备工作:首先,需要从相关网站上爬取上市公司的历史新闻文本数据,包括时间、网址、标题和正文。可以使用Python编写爬虫程序,通过分析网站结构,使用多线程或协程提高爬取效率。 2. 数据处理:将获取到的年报文本数据转换为txt格式,并进行数据处理。可以使用Python文本挖掘方式,例如提取关键词并统计词频。可以使用Python库如NLTK或spaCy进行自然语言处理,使用TF-IDF或词袋模型提取关键词,并计算词频。 3. 结果存储:将分析得到的关键词和词频结果存储到Excel文件中。可以使用Python的pandas库将数据存储到Excel文件中,方便后续的数据分析和可视化处理。 总结起来,Python上市公司年报文本分析包括准备工作、数据处理和结果存储三个步骤。通过爬取上市公司的历史新闻文本数据,使用文本挖掘方式提取关键词和统计词频,并将结果存储到Excel文件中,可以进行更深入的数据分析和洞察。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [基于python的上市公司年报新闻文本分类](https://blog.csdn.net/qiqi_ai_/article/details/128969776)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【Python爬虫实战】3.A股上市公司年报关键词词频分析](https://blog.csdn.net/w646645452/article/details/130623486)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 116
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ryo_Yuki

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值