自然語言處理(一)之讀取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庫 教程講解

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