跳到主要內容

Apache Tika 抽取文本內容的好工具


Apache Tika,對於想要進行內容分析的人來說,絕對是個必要的工具。它是個抽取文字內容的工具箱,集結了POI、Pdfbox等多種函式庫以提取多種檔案內容。Apache Tika最大的優點,在於提供單一的提取界面,只要幾行,就能自動偵測並傳回文字。

還沒發現Apache Tika之前,我得要自己去判斷檔案類型,然後分別撰寫不同的程式碼,才有辦法讀取這些不同的檔案內容。而光是讀取Microsoft的Office文件就讓人傷透腦筋,因為.doc和.docx幾乎是完全不同的格式規範。這幾天試了Apache Tika後,果真覺得方便多了,可以把之前的程式碼都丟了。

public static void main(String[] args) throws Exception {
File file = new File("your/file");
String content = new Tika().parseToString(file);
System.out.println(content);
}

抽取檔案內容就是這麼簡單。然而,使用字串(String)在處理大檔案上有很大的缺點,因為它占用了太多的記憶體。Apache Tika提供了Reader的方式,傳回檔案內容的一個個字元,可以用BufferedReader接過來,一次處理一小段緩存。


public static void main(String[] args) throws Exception {
File file = new File("your/file");
Reader reader = new Tika().parse(file);
BufferedReader br = new BufferedReader(reader);
try {
String line;
while ( (line = br.readLine()) != null) {
System.out.println(line);
}
} finally {
br.close();
}
}

以上是Apache Tika最簡便的使用方式,但它也提供進階的方式,讓你能夠進一步篩選資料。一個方法是應用不同的Parser來處理特定文件,另一個方式則是選擇特定的ContentHandler來處理特定內容。當然,兩種方法都可以應用和延伸。

public static void main(String[] args) throws Exception {
InputStream input = new FileInputStream("your/html/file");
ContentHandler handler = new BodyContentHandler();
Parser parser = new AutoDetectParser();
parser.parse(input, handler, new Metadata(), new ParseContext());
String bodyContent = handler.toString();
System.out.println(bodyContent);
input.close();
}

最後,再來看一個自動抽取網頁主要內文的例子,這大概是進行網路內容研究最重要的部分。在這個例子裡面,你還必須囊括HttpClient的函式庫(包含在Apache HttpComponents專案裡頭),用來擷取網頁的主要內容。

public static void main(String[] args) throws Exception {
HttpGet httpget = new HttpGet("http://kuanming-style.blogspot.tw/");
HttpEntity entity = null;
HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(httpget);
entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
BodyContentHandler handler = new BodyContentHandler();
BoilerpipeContentHandler boilerpipHandler =
new BoilerpipeContentHandler(handler);
Metadata metadata = new Metadata();
Parser parser = new AutoDetectParser();
parser.parse( instream, boilerpipHandler,
metadata, new ParseContext());
String content =
boilerpipHandler.toTextDocument().getContent();
System.out.println(content);
}
}

擷取網頁主要內容的函式庫來自boilerpipe,理論上在安裝Tika時也一併裝了。但是相關的API Javadocs,還是得回到boilerpipe的專案網頁。如果你覺得這個ContentHandler還不夠好,那麼你可能要寫一個自己的。

留言

熱門文章

差不多食譜實驗:小烤箱烤長茄子? Oven-roasted Long Aubergine?

發佈了「 差不多食譜:小烤箱烤茄子 Oven-roasted Aubergine 」之後,有位朋友在YouTube上留言問說,這個方法也可以用在市場上比較常看到的那種長茄子嗎?當時我只能回答不知道,因為沒試過。現在我有答案了!結果是一半一半!

差不多食譜:香煎南瓜片 Pan-fried Pumpkin

托爺爺的福,在萬聖節那碗「 南瓜盅飯 」後,我還有個老家的南瓜可以用。但要怎麼好好運用這顆南瓜,卻是個不小問題。差不多食譜曾經試過「 醋漬南瓜 」、「 牛奶南瓜 」,還有「 南瓜濃湯 」幾種運用新鮮南瓜的料理,難度雖然都不高,看起來卻都不像平時會出現在餐桌的家常菜。這次我們不妨搞得家常一點,用廚房裡都會有菜刀和煎鍋 (除非你家不開伙) ,來弄個超級家常的「香煎南瓜片」。

上車睡覺、下車尿尿

台灣人對於旅遊的形容,往往是「上車睡覺、下車尿尿」。這是因為行程被極度壓縮,試圖要在最短的時間裡面看最多的東西,於是每個景點都只是蜻蜓點水般匆匆帶過,停留的時間往往等同於排隊上廁所的時間。 這個紫南宮的行程已在「人山人海的紫南宮」當中提到過,只是當初沒寫到為什麼要去參觀紫南宮。事實上,紫南宮最富盛名的是可以借錢的土地公。然而,這點對我們家人而言一點吸引力都沒有,反倒是那號稱七星級的廁所,才是吸引我們前往參拜的重點。或許你會說:「有沒有搞錯,開一個鐘頭的車去上廁所!」沒錯,行程就是這麼規劃的。 在過年期間要到紫南宮上廁所還不是件容易的事。首先,你必須先開車到紫南宮,這大概是最容易的部份。接著,你就得面臨搶停車位窘境。 過年期間,不論哪個景點都是人山人海,免費停車位更是難找。紫南宮雖然提供一大片停車場,在過年期間卻也不敷使用,每台進入停車場的車都虎視眈眈,只要哪邊出現一個車位,起碼就有四、五台車等著。 好不容易停好車,接下來就得穿越那群要去借錢、還錢、拜拜的人群。在那個地方,怎麼前進的都不知道,反正總會有人把你向前推進。 好不容易到達造價上億的廁所,人山人海的盛況依舊。還好這群並非全部都來上廁所,要不然廁所早就被塞爆了。聽老爸老媽說,上次他們來的時候廁所裡面都沒人,還可以在裡面拍照、欣賞噴水。但這次裡面卻塞了不少人,我也不好意思拿著那麼大的一台相機拍人家上廁所的模樣,只能拍拍外觀。 由於是在盛產竹筍的竹山鎮,廁所的外觀也用竹筍作為造型,每個竹筍下方都是一間造價昂貴的廁所。一個令我覺得很貼心的設計在於,廁所不僅僅只是男廁/女廁,還有一個殘障廁所,方便行動不便的人。 雖然招牌寫著「金筍迎客」,但是看起來那個筍子明明就是不鏽鋼的,除非把它理解成金屬。我還特地爬上廁所的樓頂,想說能不能看到些什麼特別的風景。可是過年期間,看到的除了人群還是人群。 上完廁所後,簡單徒手祭拜了提供廁所的土地公,我們又再次穿越那重重的人群。不過,我還是偷偷跑去滾了一下那個象徵「財源滾滾」的金元寶。最後,又踏上那個停車戰場,從容地離去。 我不奢望有賺大錢的機會,只要生活能過得去,偶爾還能買些奢侈品犒賞自己就夠了。不過這個願望似乎也不簡單!