自然语言处理(一)之读取PDF文档生成词云图

点赞、关注再看,养成良好习惯
Python入门系列视频课程详见超星学习通:https://me.chaoxing.com(点击方可链接)
欢迎博友们亲临指导
在这里插入图片描述


1. 前言

最近超星学习通课程需要几个封面图片(模板图片不满意,无法和课程匹配),于是想着自己做几个词云图,然而本人自然语言处理知识接触不多(虽然也很感兴趣),于是静静坐下来花了半天稍微系统地学习了一下如何制作词云图(从读取本地TXT文档到本地读取PDF文档,以及在线读取PDF文档,这里的PDF文档主要是为了想读取某本点子书),结果有点上瘾了:媳妇做好饭喊话半天都没从电脑面前移步餐桌(最后不得不错过热腾腾的大米饭)。好了,下面言归正传开始今天的博文正文!

2. 读取PDF文档

博文本节主要介绍 Python3.X 版本(2020年开始 Python2.X 版本不再维护,因此建议初学者直接一步到位学习 Python3.X 版本)解析并读取PDF文件内容,这里需要用到第三方库 — pdfminer 库(与Python2版本不同,Python3版本需要安装pdfminer3k 库)。其中代码部分也参考了一些已经发布的博客内容,不过博主还是详细拆解了其他博文的代码,以一种通俗易懂的方式展示给Python初学者,免得初学者直接把别人的代码复制过来(那些代码大多封装起来了,写得过于专业,不太适合初学者)在自己电脑跑了一下,也许发现很多 bug,而不知道如何去 debug,或者不知从那做起。博主希望通过这次所谓详细的讲解能让初学者真正明白(如果还是不清楚请博文留言,博主会第一时间为博友解读)。好了,不啰嗦了,言归正传开始本节正文!

下面以具体案例为主,详细分解如何利用Python语言实现读取PDF文档(博友可以任意选一本电子书):

(1)准备工作

  • 事先安装好Python集成开发环境(IDE)
  • 事先安装好第三方库 pdfminer3k
    • 貌似直接 pip install pdfminer3k 失败了(博友可以试一下),转本地安装即可(下载 pdfminer3k 到本地,提取码:j4en);
    • 以 Anaconda3 安装Python IDE 为例,开始菜单找到 Anaconda3 文件夹下面的 Anaconda Prompt,点击打开后在命令提示符 > 后面输入:pip install D:\zgq\pdfminer3k-master.zip (后面是pdfminer3k本地电脑存储位置),等待完成安装即可。

(2)实现源代码(本地PDF)

  • 导入模块(有关 pdfminer3k 的教程会抽时间博文介绍)
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams
  • 设置读取、输出文件路径
pdf_file = 'Python.pdf'      (默认工作路径)
txt_file = 'Python.txt'      (默认工作路径)
#pdf_file = 'C:\Users\Administrator\Desktop\'Python.pdf'   (电脑桌面)
#txt_file =  'C:\Users\Administrator\Desktop\Python.txt'   (电脑桌面)
  • 生成对象并读取文件(建议先找一个页码少的PDF跑一下)
device = PDFPageAggregator(PDFResourceManager(), laparams=LAParams())
interpreter = PDFPageInterpreter(PDFResourceManager(), device)

document = PDFDocument()
parser = PDFParser(open(pdf_file, 'rb'))
parser.set_document(document)
document.set_parser(parser)
document.initialize()
  • 打开TXT文档写入内容
with open(txt_file, 'w', encoding='utf-8') as f:
    page_list = list(document.get_pages())
    page_list_length = len(page_list)
    print('The number of PDF is: ', page_list_length)
        
    for page in document.get_pages():  
        # 接受LTPage对象
        interpreter.process_page(page)    
        
        # 获取LTPage对象的text文本属性
        layout = device.get_result()
        for x in layout:
            if isinstance(x, LTTextBoxHorizontal):
                results = x.get_text()
                f.write(results)
  • 检验是否转换成TXT文档(用于下一步的作词云图)
with open('Python.txt',encoding='utf-8') as f:
    txt_text = f.readlines()
txt_text[:10]

3. 生成词云图

突然觉得肚子有点饿了,本想加一下餐,但是为了尽快完成博文还是坚持一下吧!不再啰嗦了,直接进入正文。

(1)准备工作

  • 事先安装好第三方库 wordcloud
    • 直接在 Anaconda Prompt 命令行窗口输入:pip install wordcloud,等待完成安装即可(得有网络啊)
    • 当然也可以下载本地安装 wordcloud(提取密码:9ld7;记着选取对应32位还是64位啊:得看你电脑操作系统了)

(2)实现源代码(制作词云图)

  • 导入模块
import matplotlib.pyplot as plt           
from wordcloud import WordCloud
  • 读取生成的TXT文档
with open('Python.txt',encoding='utf-8') as f:
    mytext = f.readlines()
  • 生成我的词云对象
mycloud = WordCloud().generate(str(mytext))
  • 奇迹出现(展示词云图)
plt.imshow(mycloud)
plt.axis('off')   # 关闭词云图座标显示
plt.savefig('out.jpg',dpi=1000,edgecolor='blue', bbox_inches='tight', quality=95)  # 保存词云图(到工作路径下)
plt.show()

在这里插入图片描述

  • 中文显示问题:发现中文无法显示(一些小方块)
    • 添加参数:font_path = ‘simsun.ttc’ (可以到 C:\Windows\Fonts 选择其他字体)
    • 结果小方块消失了(因选择PDF文档关系,图片不太明显)
mycloud = WordCloud(font_path = 'simsun.ttc').generate(str(mytext))

在这里插入图片描述

  • 思考题:是否发现如上出现 ‘n’ 最大?想一想为啥?相信您会处理掉的,再次不再啰嗦了!
  • 美化词云图:自己去发现一些参数吧:比如,背景颜色等!
  • 能否生成其他图形的词云图(矩形词语图很反感)?当然没问题了,看代码吧(不再解析,直接封装代码了)!
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import imageio

filename = "Python.txt"
mytext = open(filename).read()

picture = imageio.imread('people.jpg')

mycloud = WordCloud(
                background_color = 'white',  # 背景颜色
                max_words = 20000,           # 最大词数
                mask = picture,              # 以该参数值作图绘制词云,width和height会被忽略
                max_font_size = 30,          # 显示字体的最大值
                font_path = 'simsun.ttc',    # 解决显示口字型乱码问题
                collocations=False,          # 避免词重复
               ).generate(mytext)

plt.imshow(mycloud)

plt.axis('off')

plt.savefig('new.jpg',dpi=1000,edgecolor='blue',transparent=True, bbox_inches='tight', quality=95)
plt.show()

在这里插入图片描述

  • 温馨提示:代码中的图例(people.jpg)记得存在工作路径下。

  • 写作不易,切勿白剽
  • 博友们的点赞关注就是对博主坚持写作的最大鼓励
  • 持续更新,未完待续…
  • 让我们一起期待吧…
  • Life is short, U need Python!

下一篇:自然语言处理(二)之 pdfminer3k库 教程讲解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章