、技術(shù)路線:
開(kāi)發(fā)語(yǔ)言:Java
前端技術(shù):JavaScript、VUE.js(2.X)、css3
數(shù)據(jù)庫(kù):MySQL 5.7
數(shù)據(jù)庫(kù)管理工具:Navicat或sqlyog
開(kāi)發(fā)工具:IDEA或Ecplise
二、項(xiàng)目介紹:
<script src="https://lf3-cdn-tos.bytescm.com/obj/cdn-static-resource/tt_player/tt.player.js?v=20160723"></script>
三、運(yùn)行截圖:
沒(méi)有賬號(hào)的用戶可進(jìn)行注冊(cè)操作,注冊(cè)后可進(jìn)行登錄系統(tǒng),用戶注冊(cè)登錄界面展示如圖3-1所示。
圖3-1 用戶注冊(cè)登錄界面圖
用戶登錄后進(jìn)入系統(tǒng)首頁(yè)界面,首頁(yè)界面展示如圖3-2所示。
圖3-2 首頁(yè)界面圖
用戶在圖書信息界面可查看所有圖書信息,并可選擇進(jìn)行查看圖書詳情,進(jìn)行閱讀,圖書信息界面展示如圖3-3所示。
圖3-3 圖書信息界面圖
用戶可管理個(gè)人已發(fā)帖信息,我的發(fā)帖界面如圖3-4所示。
圖3-4 我的發(fā)帖界面圖
用戶可查看電子書論壇信息,并可進(jìn)行查看詳情,電子書論壇界面如圖3-5所示。
圖3-5 電子書論壇界面圖
用戶可進(jìn)行發(fā)帖操作,我要發(fā)帖界面如圖3-6所示。
圖3-6 我要發(fā)帖界面圖
管理員可以通過(guò)正確的登錄賬號(hào)和密碼進(jìn)行登錄系統(tǒng)后臺(tái),管理員登錄界面展示如圖3-7所示。
圖3-7 管理員登錄界面圖
管理員登錄后可增刪改查圖書類型信息,圖書類型管理界面展示如圖3-8所示。
圖3-8 圖書類型管理界面圖
管理員可增刪改查圖書信息,圖書信息管理界面展示如圖3-9所示,添加圖書信息界面展示如圖3-10所示。
圖3-9 圖書信息管理界面圖
圖3-10 添加圖書信息界面圖
管理員可管理電子書論壇信息,電子書論壇管理界面展示如圖3-11所示。
圖3-11 電子書論壇管理界面圖
在前面的話小書架買回家,擺放也有大學(xué)問(wèn)。如何擺放節(jié)省空間?書籍如何搭配更合理?讓書香來(lái)告訴你布置書架的好辦法吧!“書香盒子”兒童書架使用秘籍給孩子的專屬書架買回來(lái)家,怎么使用呢?讓書香來(lái)教你幾招吧!第一招拉著孩子一起做
很多媽媽把書架買回家,都會(huì)自顧自的忙活起來(lái),書架放在哪,書架上放什么書,什么書放在什么位置,全都是媽媽說(shuō)了算。這書架本就是孩子的專屬書架,媽媽們千萬(wàn)別搞錯(cuò)定位,孩子的,當(dāng)然是孩子說(shuō)了算!
媽媽一定要與孩子一起來(lái)做這件事,書架放哪,放什么書,不放什么書,什么時(shí)候換什么書,都是孩子自己決定,年紀(jì)太小的孩子,媽媽可以給予更多的幫助和建議,但書架的擺放,媽媽們一定要讓孩子參與進(jìn)來(lái),給孩子選擇的空間。
第二招通盤考慮覆蓋多
一套書架(兩個(gè))大致能放一、二百本書。媽媽要總體規(guī)劃,通盤考慮。要覆蓋孩子喜歡的書目、孩子近期關(guān)注的主題、媽媽希望讓孩子接觸的新書等等。可以由媽媽規(guī)劃出幾類圖書,然后媽媽和孩子一起在挑選類別中的圖書。
第三招套裝擺放好方法
很多孩子的書架上都有套裝書,一是因?yàn)槔L本的篇幅所限,在表達(dá)內(nèi)容方面局限性較大,一個(gè)主題要想從內(nèi)容上表達(dá)清楚,單冊(cè)繪本是很難做到的;二來(lái)孩子喜歡上一本書,接受了里面的繪本風(fēng)格、人物形象,如果后面還有一系列跟這些因素有高度關(guān)聯(lián)的其他內(nèi)容,孩子是非常容易接受而連續(xù)閱讀的,一個(gè)套裝書看下來(lái),孩子對(duì)角色的認(rèn)知、解讀,對(duì)畫風(fēng)的體會(huì)、對(duì)內(nèi)容的思考,都比單冊(cè)豐富的多。
套裝書最好放在一起展示,其中的一本書展示出來(lái),其他的書藏在身后,孩子看完一本第二本就露出臉來(lái),如此接二連三的看下去。媽媽還可以經(jīng)常換一下套裝書的第一本展示書,尤其是大套裝,給孩子多一些的選擇。
第四招定期更換保新鮮
很多家庭空間有限,不可能為孩子所有的圖書都陪伴小書架,對(duì)于只能放一、兩個(gè)書架的家庭,媽媽可以將孩子暫時(shí)不讀的圖書收納在成人的書柜或整理箱中,根據(jù)孩子閱讀的頻率,定期更換兒童書架上的圖書。一些孩子一定階段不感興趣的書籍,就可以及時(shí)替換。
第五招擺放位置有學(xué)問(wèn)
一個(gè)小書架,孩子最關(guān)注的是上面能直觀看到封面的書籍展示層,放在這個(gè)區(qū)域的書往往是最容易引起孩子閱讀興趣的。一些希望孩子看到的圖書就可以選擇這個(gè)黃金位置擺放。而下面的囤書層,可以挑選一些孩子平時(shí)不常看的,或者是媽媽提前囤的還不適合孩子年齡階段的書籍?dāng)[放。囤書層也是玩具收納的好幫手。
第六招合理搭配省空間
“書香盒子”兒童書架標(biāo)準(zhǔn)版的尺寸是寬41.5*厚25*高65CM,包含三層展示層和一層囤書層。如果將家中的書籍合理搭配擺放,既節(jié)省空間,又能最大量的囤書。
發(fā)表文章為“書香兒童閱讀”原創(chuàng)作品,轉(zhuǎn)載請(qǐng)標(biāo)明出處,謝謝合作!
關(guān)于“書香兒童閱讀”書香兒童閱讀(北京書香)專注于親子閱讀推廣及兒童閱讀產(chǎn)品研發(fā),產(chǎn)品覆蓋閱讀環(huán)境及閱讀內(nèi)容,其中兒童書架產(chǎn)品已獲得國(guó)家專利,主題閱讀產(chǎn)品也深受家長(zhǎng)和孩子的歡迎。書香兒童閱讀產(chǎn)品代理火熱招募中“書香盒子”書架及主題閱讀產(chǎn)品,以渠道銷售為主,歡迎各位愛(ài)孩子、愛(ài)閱讀的媽媽做為產(chǎn)品代理,與書香一起推廣兒童閱讀!讓每個(gè)孩子都愛(ài)上閱讀!讓每個(gè)家庭都擁有孩子專屬的閱讀空間!
本文由書香盒子發(fā)布,原文來(lái)自:http://www.shuxianghezi.com/news/101.html
關(guān)注了解更多親子閱讀貼心服務(wù)
讀
2015年,美國(guó)官方解密了一系列有關(guān)本·拉登的文件,其中最引人矚目的,是美國(guó)國(guó)家情報(bào)總監(jiān)辦公室在其官網(wǎng)上列出的“本·拉登的書架”。曝光的這份閱讀清單涉及書籍和其他材料400余種。
其中包含了已解密的書信等文檔103份、公開(kāi)發(fā)表的美國(guó)政府文件75份等。本文關(guān)注的重點(diǎn),是如何分析已經(jīng)解密的103份書信等文檔。
——EarlGrey@編程派
在本文中,我們將學(xué)習(xí)如何分析PDF文檔,并且利用AlchemyAPI來(lái)進(jìn)行實(shí)體抽取分析,看看本·拉登在這些信件中最常提到的10個(gè)實(shí)體是什么。
01
什么是AlchemyAPI?
AlchemyAPI是IBM旗下的一家公司,具有深度學(xué)習(xí)的自然語(yǔ)言處理和圖片識(shí)別技術(shù),可利用人工智能分析理解網(wǎng)頁(yè)、文檔、電子郵件、微博等形式的內(nèi)容。它還將同Google 一樣的神經(jīng)網(wǎng)絡(luò)分析技術(shù)應(yīng)用其中。
AlchemyAPI目前共提供了12個(gè)文本分析功能:實(shí)體抽取(entitiy extraction),情感分析,關(guān)鍵字抓取,概念標(biāo)識(shí),關(guān)系提取,分類識(shí)別,作者提取,語(yǔ)言識(shí)別,文本提取,微格式分析,訂閱內(nèi)容識(shí)別,數(shù)據(jù)連接等。
接下來(lái),我們開(kāi)始進(jìn)行準(zhǔn)備工作。
本文中的代碼大部分來(lái)自automatingosint,我對(duì)源代碼進(jìn)行更新。目前的腳本支持Python 3。
2
安裝依賴包
由于美國(guó)ODNI公開(kāi)的本·拉登信件都是PDF格式的,因此我們首先必須要安裝能夠處理PDF文檔的Python包。這里,我使用的是PyPDF2。我們通過(guò)pip包管理器進(jìn)行安裝:
pip install pypdf2
另外,你肯定不想一封一封地手動(dòng)103封書信吧?!省時(shí)省力的辦法就是寫個(gè)腳本把這些文檔都爬取下來(lái)。由于要訪問(wèn)網(wǎng)頁(yè)和解析網(wǎng)頁(yè),我們選擇使用兩個(gè)常用的第三方庫(kù):requests和BeautifulSoup 4:
pip install requests beautifulsoup4
3
獲取免費(fèi)AlchemyAPI Key
AlchemyAPI有一個(gè)免費(fèi)的基礎(chǔ)服務(wù)包,每天的事務(wù)處理上限為1000次。在本文中,我們將使用他們的實(shí)體抽取服務(wù)來(lái)執(zhí)行文本分析。
獲取免費(fèi)AlchemyAPI Key非常簡(jiǎn)單,只需要填寫一個(gè)表單即可,輸入自己的郵箱地址。
申請(qǐng)?zhí)幚硗瓿芍螅憔涂梢栽卩]箱中看到發(fā)送給你的API Key了。
4
安裝AlchemyAPI Python SDK
獲得API Key之后,我們可以通過(guò)AlchemyAPI提供的Python SDK和HTTP REST接口調(diào)用其提供的文本分析服務(wù)。在本文中,我們選擇安裝SDK的方式。
PyPI上之前有AlchemyAPI包,但是后來(lái)移除了下載包,因此我們不能使用pip來(lái)安裝,只能通過(guò)Git克隆Python SDK的代碼庫(kù)或是直接下載代碼庫(kù):
git clone https://github.com/AlchemyAPI/alchemyapi_python.git
接下來(lái),我們要把申請(qǐng)到的API Key與SDK關(guān)聯(lián)起來(lái)。打開(kāi)終端,進(jìn)入SDK文件夾,然后按下面的示例執(zhí)行alchemyapi.py文件:
cd alchemyapi_python python alchemyapi.py YOUR_API_KEY
# 將YOUR_API_KEY替換成你收到的Key
為確保SDK正常安裝,可以按照提示運(yùn)行example.py查看演示程序:
python example.py
如果最后出現(xiàn)了下圖的文字,就證明SDK安裝正確,API Key也可以使用。
5
下載文檔
然后就到了怎么自動(dòng)將103份PDF文檔下載到本地了。
我們可以寫一個(gè)簡(jiǎn)單的Python腳本來(lái)完成這項(xiàng)工作,但是我選擇把它封裝在download_bld_documents這個(gè)函數(shù)里,因?yàn)槲蚁氚阉械拇a都放在一個(gè)腳本里,這樣大家就可以直接運(yùn)行這個(gè)腳本,等待一段時(shí)間,就可以看到最后的結(jié)果了。
這個(gè)函數(shù)寫的比較簡(jiǎn)單,但是已經(jīng)能夠滿足我們的需求了。
def download_bld_documents: """Download Bin Laden's Declassified documents from ODNI.""" import os
import time
import requests
from bs4 import BeautifulSoup
# 創(chuàng)建一個(gè)名為“pdfs”的文件夾,用于保存所有下載的PDF文檔。 try: os.mkdir("pdfs") except: pass
# 獲取ODNI網(wǎng)站上有關(guān)本·拉登書架的網(wǎng)頁(yè),
# 將其交給Beautiful Soup,以進(jìn)行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=
# 從網(wǎng)頁(yè)中第54個(gè)超鏈接開(kāi)始,我們遍歷所有的文檔鏈接,
# 僅保留那些我們所需要的鏈接:即含有“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'])
# 接下來(lái),我們遍歷列表中所有的元素,
# 從原鏈接中獲取PDF的文件名,
#然后從ODNI網(wǎng)站下載相應(yīng)的文檔。 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)
由于文件數(shù)量比較多,因此在最終執(zhí)行腳本時(shí),耗費(fèi)在文件下載的時(shí)間可能會(huì)比較長(zhǎng)。如果你從ODNI網(wǎng)站下載的速度非常慢,那么可以前往我的百度網(wǎng)盤下載,但是在最終執(zhí)行時(shí)要對(duì)腳本做修改。只需要執(zhí)行下文中的函數(shù)即可。
在微信號(hào)中,回復(fù)“l(fā)aden”即可獲得分享鏈接及提取碼。
6
處理文檔
下面,我們就可以正式對(duì)下載的PDF文檔進(jìn)行分析了。我們將要利用Alchemy API提供的強(qiáng)大工具,對(duì)這些PDF文檔進(jìn)行實(shí)體抽取(entitiy extraction)分析。通過(guò)實(shí)體分析,我們可以了解本·拉登在這些信件和文件中,談到最多的人、地方或東西是什么。
所以,我們要一一打開(kāi)這些PDF文件,從文檔中提取所有的文本,然后將其提交至Alchemy進(jìn)行分析處理。在處理每一個(gè)文檔時(shí),我們可以得到其中的實(shí)體數(shù)據(jù),最后將所有文檔的分析數(shù)據(jù)結(jié)合在一起,就可以得到出現(xiàn)頻率最高的實(shí)體了。
我們將這部分代碼封裝在process_documents函數(shù)中:
def process_documents: """Process downloaded documents using AlchemyAPI.""" # 導(dǎo)入所需要的模塊,包括我們安裝的PyPDF2和AlchemyAPI。 import PyPDF2
import glob
import time
from collections import Counter
from alchemyapi import AlchemyAPI alchemyapi=AlchemyAPI # 初始化AlchemyAPI。 file_list=glob.glob("pdfs/*.pdf")
# 通過(guò)`glob`模塊獲取我們下載的所有PDF文件的文件名。 entities={}
# 我們要使用`entities`字典來(lái)保存每個(gè)PDF文檔的分析結(jié)果。 # 下面的for循環(huán)將遍歷所有的PDF文件 for pdf_file in file_list: # read in the PDF print("[*] Parsing %s" % pdf_file) # 初始化一個(gè)PyPDF2對(duì)象,用于保存從PDF文檔中提取的文本數(shù)據(jù) pdf_obj=PyPDF2.PdfFileReader(open(pdf_file, "rb")) # 創(chuàng)建一個(gè)空字符串,用于后續(xù)構(gòu)建這個(gè)PDF的全部文本數(shù)據(jù) full_text="" # 從每頁(yè)中提取文本數(shù)據(jù) for page in pdf_obj.pages: full_text +=page.extractText # 接下來(lái)我們使用Alchemy API進(jìn)行實(shí)體抽取 print("[*] Sending %d bytes to the Alchemy API" % len(full_text)) # 調(diào)用AlchemyAPI,并明確我們提交的是文本數(shù)據(jù)(第一個(gè)參數(shù))
# 然后傳入需要分析的文本,第三個(gè)參數(shù)代表禁用情感分析功能,
# 因?yàn)楸疚闹形覀冎魂P(guān)注頻率最??的實(shí)體。 response=alchemyapi.entities('text', full_text, {'sentiment': 0}) if response['status']=='OK': # 遍歷返回的全部實(shí)體數(shù)據(jù)。
# Alchemy返回的每個(gè)實(shí)體中,都包含有`count`數(shù)據(jù),
# 我們要確保在`entities`字典中,將所有相同實(shí)體的count相加 for entity in response['entities']: # add each entity to our master list if entity['text'] in entities: entities[entity['text']] +=int(entity['count']) else: entities[entity['text']]=int(entity['count']) print("[*] Retrieved %d entities from %s" % (len(entities), pdf_file)) else: print("[!] Error receiving Alchemy response: %s" % response['statusInfo']) time.sleep(1) # 上面的循環(huán)執(zhí)行結(jié)束,我們可以統(tǒng)計(jì)最常見(jiàn)的實(shí)體,
# 并把相關(guān)的結(jié)果打印出來(lái)了! entity_counter=Counter(entities) top_entities=entity_counter.most_common # 接下來(lái)就開(kāi)始打印本·拉登提到次數(shù)最多的實(shí)體吧! for top_entity in top_entities[0:10]: # most_common returns a tuple (entity,count) print("%s=> %d" % (top_entity[0], top_entity[1]))
微信閱讀代碼不方便的話,請(qǐng)點(diǎn)擊閱讀原文。
上面函數(shù)的最后,我們使用了Counter類來(lái)加載entities字典,并且很容易地就得出了最常見(jiàn)的實(shí)體。
7
快速執(zhí)行數(shù)據(jù)分析
最后執(zhí)行腳本時(shí),一定要注意:要把腳本放在alchemyapi_python這個(gè)文件夾里。這是因?yàn)锳lchemyAPI SDK并沒(méi)有在Python的PATH上。
為了讓大家少?gòu)?fù)制粘貼,我已經(jīng)把相關(guān)的操作寫在一個(gè)bash腳本里。大家下載腳本后修改API KEY即可。
curl https://raw.githubusercontent.com/bingjin/funscripts/master/laden/bld.sh --output bld.sh sh bld.sh
上圖就是正在執(zhí)行的腳本。想不想看看最終的分析結(jié)果?
我直接告訴你們就太沒(méi)趣了,大家可以運(yùn)行腳本自己看,等待的同時(shí)可以品嘗一杯咖啡。當(dāng)然,劇透也是有的:伊斯蘭教先知穆罕默德居然才排第七!
你分析的結(jié)果是怎樣的,留言告訴大家本·拉登提到次數(shù)最多的三個(gè)實(shí)體吧!
9
結(jié)語(yǔ)
本文中僅使用了AlchemyAPI的實(shí)體提取功能,其他諸如關(guān)鍵詞分析、情感分析、圖像分析等功能都沒(méi)有涉及。大家可以在本文的基礎(chǔ)上,進(jìn)一步發(fā)揮自己的想象力,看看還能從本·拉登的書架中得到什么信息。
...
Python核心開(kāi)發(fā)者:print為什么從語(yǔ)句變成了函數(shù)?
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。