跳到主要內容

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還不夠好,那麼你可能要寫一個自己的。

留言

熱門文章

差不多食譜:手工巧克力餅乾 Chocolate Cookies

又是手工餅乾,最近一連出了兩份餅乾食譜,這個「手工巧克力餅乾」已經是第三份了。會不會有更多呢?我可以告訴大家,這是肯定的。 要怪就怪這個陰鬱的冬季雨天,哪裡都不方便去,也懶得出去。餅乾櫃空在那邊已經很久了,雖然有時候會嘴饞,但也沒有迫切去補貨的必要。反正經常開伙,平常該有的材料都會有,自己弄個成分完全透明的零食,也是個不錯的選擇。再說,用烤箱進行烘焙時,房間會變得比較乾燥,也比較溫暖。在夏天是個折磨,但到了冬天,這種感覺還滿不錯的。 話不多說,開始進行這一道「手工巧克力餅乾」的準備工作。

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

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

窺探洋蔥的秘密:顯微鏡下的洋蔥鱗葉表皮與細胞 Onion Bulb Leaf under a microscope

在這段嘗試使用顯微鏡來拍攝的期間,「洋蔥表皮」可以說是最容易製作的玻片標本,沒有之一。只要剝開來,攤平,滴上水,蓋上玻片,基本就完事了。怪不得學校的生物課本,都會拿洋蔥表皮來設計實驗。但是想要看到鱗葉的橫切面,那就得要練練刀功,並試試你的運氣了。 洋蔥表皮是比較容易處理的樣本,這次拍攝我們就從撕皮開始。只要不是最外面那層乾掉的表皮,用哪一層都無所謂。我也沒有拿整顆洋蔥,就拿做菜切下來的地方。這樣的大小對於顯微鏡觀察來講,已經相當足夠了。 洋蔥皮剝下來後,放在滴了水的玻片上,再滴一滴水,蓋上蓋玻片。這樣一來,觀察用的玻片標本就完成了。接著放上顯微鏡的載物台,調整鏡頭到適當的高度(大約一公分),然後調整標片標本位置,調整光源,最後再進行細微的對焦,就可以開始你的觀察了! 洋蔥表皮細胞 40x 先用顯微鏡的低倍鏡來看。這架顯微鏡最低的放大倍率是40倍,可以看出洋蔥表皮的排列狀況,而且也很清楚看到表皮有深淺不一的顏色。 洋蔥表皮細胞 100x 放大到100倍,可以看到細胞裡面還有東西。透明一點的細胞會比較清楚,可以看到細胞核。有的除了細胞核外,好像還有其他的東西。 洋蔥表皮細胞 600x 繼續放大到600倍,細胞核變得更明顯了。除此之外,可以看到細胞邊緣有兩層構成。生物課本裡面介紹過,外層的是細胞壁,內層的是細胞膜。然而,在有顏色的細胞中,細胞核就沒有那麼明顯。 洋蔥鱗葉剖面 40x 看過洋蔥表皮,現在把洋蔥的鱗葉做剖面,看看裡面的細胞構成。切了很多片,終於有一片切的比較成功,可以看到上面一層薄薄的紫色表皮。這層紫色表皮就是剛剛看了很久的洋蔥表皮。中間還有帶點綠色的部位,這應該是維管束。 洋蔥鱗葉剖面 600x 直接放大到600倍,可以明顯看出紫色的表皮細胞比較扁平,底下構成洋蔥肉的透明細胞則比較大顆。問題是紫色的花青素好像只集中在表皮而已,底下那些通通沒有。但畫面的右下角,也就是靠近維管束的周邊有綠綠的,移過去看看。 洋蔥鱗葉剖面 600x 靠近維管束 在細胞內可以看到一顆顆綠綠的小球,不知道這些是不是葉綠體,或者只是有綠色色素的有色體。仔細再想想,剝開洋蔥後確實有一條條綠色的紋路,這些綠綠的小球應該就是那些紋路出現的地方。 我能看懂的部分只有這個樣子!如果有哪些高手看到,還請多多指教。