跳到主要內容

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

留言

熱門文章

差不多食譜:牡丹魚片 Fish Slices Moutan

往餐桌端上這一道「牡丹魚片」,需要解釋的大概只有「這真的是我做的!」它是道不折不扣的大菜,能把一塊平凡無奇的魚片,展開變成一朵朵牡丹花。做這道菜最需要的不是技巧,是耐心;當然還有一點美學的天份!

【跟著我的閱讀腳步】山居歲月:普羅旺斯的一年 A Year in Provence

就記得我看過Peter Mayle(彼得.梅爾)的作品,而且對他在第一章大談用塑膠湯匙吃高級魚子醬的說法印象深刻,但怎麼樣就是想不起來到底是哪一本書。好在有些現代科技的幫忙,找出了那本令我印象深刻的《 關於品味 》。只不過,在《 關於品味 》之前,Peter Mayle還有另一部更加出名的作品——《 山居歲月:普羅旺斯的一年 》( A Year in Provence )。 穿襪子這件事已成遙遠的記憶,手錶躺在抽屜裡也已很久了。我發覺,憑著庭院中樹影的位置,我可以大致估算出時間;至於今日何日,我就不大記得了。反正也不重要。我快要化為安份守己,無欲無求的院中蔬菜了;與現實世界的偶然接觸,僅限於在電話中與遠方辦公室裡的人交談。他們總是欣羨渴慕地問起天氣如何,答案則讓他們鬱鬱不樂。他們寬慰自己的方法是警告我會得皮膚癌,又說太陽曬多了頭腦會遲鈍。我並不與他們爭執;他們也許說的沒錯。只不過,變笨也好,增添皺紋也好,可能得癌症也罷,我從來沒像現在這麼快活過。 ---《 山居歲月 》, pp. 173-174

「抓烏龜」的麻將遊戲

今天要和大家分享一個打發時間的簡單遊戲——抓烏龜。這可是我老爸老媽特別從美國學回來的,是個名符其實的「海歸」遊戲,據說是在下雪時無聊打發時間用的。