——@編程派
在本文中,我們將學習如何分析PDF文檔,并且利用來進行實體抽取分析,看看本·拉登在這些信件中最常提到的10個實體是什么。
01什么是?
是IBM旗下的一家公司,具有深度學習的自然語言處理和圖片識別技術,可利用人工智能分析理解網頁、文檔、電子郵件、微博等形式的內容。它還將同 一樣的神經網絡分析技術應用其中。
目前共提供了12個文本分析功能:實體抽取( ),情感分析,關鍵字抓取,概念標識,關系提取,分類識別,作者提取怎么用文本文檔做網頁,語言識別,文本提取,微格式分析,訂閱內容識別,數據連接等。
接下來,我們開始進行準備工作。
本文中的代碼大部分來自,我對源代碼進行更新。目前的腳本支持 3。
2安裝依賴包
由于美國ODNI公開的本·拉登信件都是PDF格式的,因此我們首先必須要安裝能夠處理PDF文檔的包。這里,我使用的是。我們通過pip包管理器進行安裝:
pip install pypdf2
另外,你肯定不想一封一封地手動103封書信吧?!省時省力的辦法就是寫個腳本把這些文檔都爬取下來。由于要訪問網頁和解析網頁,我們選擇使用兩個常用的第三方庫:和 4:
pip install requests beautifulsoup4
3獲取免費 Key
有一個免費的基礎服務包,每天的事務處理上限為1000次。在本文中,我們將使用他們的實體抽取服務來執行文本分析。
獲取免費 Key非常簡單,只需要填寫一個表單即可,輸入自己的郵箱地址。
申請處理完成之后,你就可以在郵箱中看到發送給你的API Key了。
4安裝 SDK
獲得API Key之后,我們可以通過提供的 SDK和HTTP REST接口調用其提供的文本分析服務。在本文中,我們選擇安裝SDK的方式。
PyPI上之前有包,但是后來移除了下載包,因此我們不能使用pip來安裝,只能通過Git克隆 SDK的代碼庫或是直接下載代碼庫:
git clone https://github.com/AlchemyAPI/alchemyapi_python.git
接下來,我們要把申請到的API Key與SDK關聯起來。打開終端,進入SDK文件夾,然后按下面的示例執行.py文件:
cd alchemyapi_python
python alchemyapi.py YOUR_API_KEY
# 將YOUR_API_KEY替換成你收到的Key
為確保SDK正常安裝,可以按照提示運行.py查看演示程序:
python example.py
如果最后出現了下圖的文字,就證明SDK安裝正確,API Key也可以使用。
5下載文檔
然后就到了怎么自動將103份PDF文檔下載到本地了。
我們可以寫一個簡單的腳本來完成這項工作,但是我選擇把它封裝在ts這個函數里,因為我想把所有的代碼都放在一個腳本里,這樣大家就可以直接運行這個腳本,等待一段時間,就可以看到最后的結果了。
這個函數寫的比較簡單,但是已經能夠滿足我們的需求了。
def download_bld_documents(): ? ?"""Download Bin Laden's Declassified documents from ODNI.""" ? ?import os
? ?import time
? ?import requests ? ?
? ?from bs4 import BeautifulSoup
? ?
? ?# 創建一個名為“pdfs”的文件夾,用于保存所有下載的PDF文檔。 ? ?try: ? ? ? ?os.mkdir("pdfs") ? ?except: ? ? ? ?pass
? ?# 獲取ODNI網站上有關本·拉登書架的網頁,
? ?# 將其交給Beautiful Soup,以進行HTML解析。 ? ?response = requests.get( ? ? ? ?"http://www.dni.gov/index.php/resources/bin-laden-bookshelf?start=1") ? ?if response.status_code == 200: ? ? ? ?html = BeautifulSoup(response.content) ? ?link_list = []
? ?# 從網頁中第54個超鏈接開始,我們遍歷所有的文檔鏈接,
? ?# 僅保留那些我們所需要的鏈接:即含有“pdf”但不包含“Arabic”
? ?# 字樣的鏈接。我們將滿足要求的鏈接保存到列表`link_list`中。 ? ?for i in html.findAll("a")[54:]: ? ? ? ?if "pdf" in i['href'] and "Arabic" not in i.text: ? ? ? ? ? ?link_list.append("http://www.odni.gov%s" % i['href'])
? ?# 接下來,我們遍歷列表中所有的元素,
? ?# 從原鏈接中獲取PDF的文件名,
? ?#然后從ODNI網站下載相應的文檔。 ? ?for i in link_list: ? ? ? ?response = requests.get(i) ? ? ? ?file_name = i.split("/")[::-1][0] ? ? ? ?fd = open("pdfs/%s" % file_name, "wb") ? ? ? ?fd.write(response.content) ? ? ? ?fd.close() ? ? ? ?time.sleep(1)
由于文件數量比較多,因此在最終執行腳本時怎么用文本文檔做網頁,耗費在文件下載的時間可能會比較長。如果你從ODNI網站下載的速度非常慢,那么可以前往我的百度網盤下載,但是在最終執行時要對腳本做修改。只需要執行下文中的函數即可。