Day 18: BoilerPipe —— Java开发者的文章提取工具
今天我決定學(xué)習(xí)如何使用Java做網(wǎng)頁(yè)鏈接的文本和圖像提取。在大多數(shù)內(nèi)容發(fā)現(xiàn)網(wǎng)站上(如Prismatic)這是一個(gè)非常常見(jiàn)的需求,今天就是學(xué)習(xí)如何使用一個(gè)名為boilerpipe的Java庫(kù)來(lái)完成這個(gè)任務(wù)。
準(zhǔn)備
基本的Java知識(shí)是必需的,安裝最新的Java開(kāi)發(fā)工具包(JDK ),可以是OpenJDK 7或Oracle JDK 7。
注冊(cè)一個(gè)OpenShift帳戶(hù),它是完全免費(fèi)的,可以分配給每個(gè)用戶(hù)1.5 GB的內(nèi)存和3 GB的磁盤(pán)空間。
安裝RHC客戶(hù)端工具,需要有ruby 1.8.7或更新的版本,如果已經(jīng)有ruby gem,輸入 sudo gem install rhc ,確保它是最新版本。要更新RHC的話(huà),執(zhí)行命令 sudo gem update rhc,如需其他協(xié)助安裝RHC命令行工具,請(qǐng)參閱該頁(yè)面: https://www.openshift.com/developers/rhc-client-tools-install
通過(guò) rhc setup 命令設(shè)置您的OpenShift帳戶(hù),此命令將幫助你創(chuàng)建一個(gè)命名空間,并上傳你的SSH keys到OpenShift服務(wù)器。
第1步:創(chuàng)建一個(gè)JBoss EAP的應(yīng)用
首先從創(chuàng)建示例應(yīng)用程序開(kāi)始,把該應(yīng)用稱(chēng)作 newsapp。
$ rhc create-app newsapp jbosseap然后可以使用如下命令:
$ rhc create-app newsapp jbosseap -g medium這樣會(huì)創(chuàng)建一個(gè)應(yīng)用程序容器,設(shè)置好所有需要的SELinux政策和cgroup配置,OpenShift也將創(chuàng)建一個(gè)私人git倉(cāng)庫(kù)并克隆到本地。最后,OpenShift會(huì)給外界提供一個(gè)DNS,該應(yīng)用程序?qū)⒃趆ttp://newsapp-{domain-name}.rhcloud.com/ 下可以訪問(wèn)(將 domain-name 更換為自己的域名)。
第2步:添加Maven依賴(lài)
在 pom.xml 文件里添加如下依賴(lài):
<dependency><groupId>de.l3s.boilerpipe</groupId><artifactId>boilerpipe</artifactId><version>1.2.0</version> </dependency> <dependency><groupId>xerces</groupId><artifactId>xercesImpl</artifactId><version>2.9.1</version> </dependency><dependency><groupId>net.sourceforge.nekohtml</groupId><artifactId>nekohtml</artifactId><version>1.9.13</version> </dependency>同時(shí)也需要加一個(gè)新的庫(kù):
<repository><id>boilerpipe-m2-repo</id><url>http://boilerpipe.googlecode.com/svn/repo/</url><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots> </repository>通過(guò)更新 pom.xml 文件里的幾個(gè)特性將Maven項(xiàng)目更新到Java 7:
<maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target>現(xiàn)在就可以更新Maven項(xiàng)目了(右鍵單擊>Maven>更新項(xiàng)目)。
第3步:啟用CDI
使用CDI來(lái)進(jìn)行依賴(lài)注入。CDI、上下文和依賴(lài)注入是一個(gè)Java EE 6規(guī)范,能夠使依賴(lài)注入在Java EE 6的項(xiàng)目中。
在 src/main/webapp/WEB-INF 文件夾下建一個(gè)名為beans.xml中一個(gè)新的XML文件。更換beans.xml中的以下內(nèi)容:
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"></beans>第4步:創(chuàng)建Boilerpipe內(nèi)容提取服務(wù)
現(xiàn)在創(chuàng)建一個(gè)Boilerpipe內(nèi)容提取服務(wù)的服務(wù)類(lèi),這個(gè)類(lèi)會(huì)用一個(gè)url,從這個(gè)url中提取標(biāo)題和文章內(nèi)容。
import java.net.URL; import java.util.Collections; import java.util.List;import com.newsapp.boilerpipe.image.Image; import com.newsapp.boilerpipe.image.ImageExtractor;import de.l3s.boilerpipe.BoilerpipeExtractor; import de.l3s.boilerpipe.document.TextDocument; import de.l3s.boilerpipe.extractors.ArticleExtractor; import de.l3s.boilerpipe.extractors.CommonExtractors; import de.l3s.boilerpipe.sax.BoilerpipeSAXInput; import de.l3s.boilerpipe.sax.HTMLDocument; import de.l3s.boilerpipe.sax.HTMLFetcher;public class BoilerpipeContentExtractionService {public Content content(String url) {try {final HTMLDocument htmlDoc = HTMLFetcher.fetch(new URL(url));final TextDocument doc = new BoilerpipeSAXInput(htmlDoc.toInputSource()).getTextDocument();String title = doc.getTitle();String content = ArticleExtractor.INSTANCE.getText(doc);final BoilerpipeExtractor extractor = CommonExtractors.KEEP_EVERYTHING_EXTRACTOR;final ImageExtractor ie = ImageExtractor.INSTANCE;List<Image> images = ie.process(new URL(url), extractor);Collections.sort(images);String image = null;if (!images.isEmpty()) {image = images.get(0).getSrc();}return new Content(title, content.substring(0, 200), image);} catch (Exception e) {return null;}} }上述代碼執(zhí)行以下操作:
第5步:啟用JAX-RS
為啟用JAX-RS,建立一個(gè)擴(kuò)展 javax.ws.rs.core.Application 的類(lèi),并通過(guò)如下所示的 javax.ws.rs.ApplicationPath 注釋指定應(yīng)用程序路徑。
import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application;@ApplicationPath("/api/v1") public class JaxrsInitializer extends Application{}第6步:創(chuàng)建ContentExtractionResource
創(chuàng)建ContentExtractionResource類(lèi),它會(huì)返回一個(gè)JSON內(nèi)容對(duì)象。創(chuàng)建一個(gè)名為ContentExtractionResource的新類(lèi),并用如下所示的內(nèi)容替換:
import javax.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType;import com.newsapp.service.BoilerpipeContentExtractionService; import com.newsapp.service.Content;@Path("/content") public class ContentExtractionResource {@Injectprivate BoilerpipeContentExtractionService boilerpipeContentExtractionService;@GET@Produces(value = MediaType.APPLICATION_JSON)public Content extractContent(@QueryParam("url") String url) {return boilerpipeContentExtractionService.content(url);} }部署到OpenShift
最后,更改部署到OpenShift
$ git add . $ git commit -am "NewApp" $ git push在代碼push和部署完成后,我們可以在 http://newsapp-{{domain-name}.rhcloud.com 查看正在運(yùn)行的應(yīng)用程序。我的示例應(yīng)用程序展示如下。
今天就這些,歡迎反饋。
原文 Day 18: BoilerPipe--Article Extraction for Java Developers
翻譯整理 SegmentFault
總結(jié)
以上是生活随笔為你收集整理的Day 18: BoilerPipe —— Java开发者的文章提取工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Day 17: 使用 JBoss For
- 下一篇: Day 19: EmberJS 入门指南