메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

Lotus Connections를 사용하여 교육 산업에서 더욱 스마트하게 협업하기, 파트 4: IBM Content Analytics를 사용하여 구조화되지 않은 데이터를 크롤링하고 분석하여 표시하기

Ilya Afanasiev, 소프트웨어 엔지니어, IBM
Ilya Afanasiev사진
Ilya Afanasiev는 소프트웨어 연구, 개발, 지원 및 품질 보증을 비롯한 다양한 분야에서 7년 이상 일한 경력으로 풍부한 기술 세트를 보유한 소프트웨어 엔지니어이다. 그는 IBM에 2007년도에 Russian Systems and Technology 연구소에 z/OS Systems Programmer로 합류했다. 현재는 웹 UI 개발 및 프로토타입화, 정보 검색 및 Java EE 애플리케이션 개발에 집중한다. 현재 연구 관심 분야는 텍스트 마이닝과 구조화되지 않은 텍스트 분석이다.

요약:  이 기사에서는 연구비 지원 및 학술 연구 관심 분야의 관련 정보가 있는 IBM Lotus® Connections Profiles 페이지를 중대하는 예제 애플리케이션을 계속해서 빌드합니다. 구조화되지 않은 소스 데이터는 수집되어 텍스트 분석 콜렉션 지점으로 유지됩니다. 사용자 정의 위젯의 서버측 구현과 이러한 구현에서 IBM Content Analytics 분석을 사용하는 방법을 배웁니다. 또한, 사용자 정의 크롤러를 빌드합니다. Lotus Connections와 IBM Content Analytics를 사용하여 구조화되지 않은 데이터를 크롤링하고 분석하여 표시할 수 있습니다.

이 연재 자세히 보기

기사 게재일:  2011 년 3 월 01 일
난이도: 중급 PDF:  A4 and Letter (125KB | 19 pages)Get Adobe® Reader®
페이지뷰:  1655 회
의견:  


소개

이 시리즈의 파트 3, 프로파일을 사용하여 연구 관심 분야 및 연구비 지원 정보 공유에서는 연구비 지원 및 학술 연구 관심 분야에 관한 정보가 있는 IBM Lotus® Connections Profiles 페이지를 증대하는 방법을 탐구했다. 예제 애플리케이션에서는 소스 데이터를 수집하여 텍스트 분석 콜렉션 지점으로 유지하는 방법을 살펴보았다. 사용자 인터페이스(UI)는 위젯과 Lotus Connections를 사용하여 작성했다. 이 애플리케이션과 사용자의 상호 작용은 프리젠테이션 부분, 즉 아키텍처의 "웹" 티어에서 지원했다.

이 기사에서는 예제 Profiles 애플리케이션 확장과 이 애플리케이션의 여러 가지 개념적 티어, 즉 웹 비즈니스, 통합 및 데이트를 확장한다. 서버측 함수를 IBM Content Analytics와 통합하여 구조화되지 않은 컨텐츠를 분석하는 방법을 배운다.

Profiles 애플리케이션 확장은 다음과 같은 두 가지 주요 부분으로 구성된다.

Java™ EE 애플리케이션
Java EE(Java Enterprise Edition) 애플리케이션은 EAR 파일로 WebSphere Application Server에 배치된다. Java EE 애플리케이션의 함수는 서버측 함수라고도 하며 다음과 같은 것들이 있다.
  • My Grant Awards와 My Keywords 위젯에서 생성된 요청을 처리하는 Java 서블릿 두 개. 이 두 가지 서블릿은 XML 형식의 응답을 생성한다.
  • TAGGS(Tracking Accountability in US Government Grants System) 고급 검색 페이지와 함께 작동하고 HTTP POST 요청을 생성하여 특정 연구원의 연구비 지원 목록을 검색하는 사용자 정의 크롤러.
  • Java API를 통해 Content Analytics 독립형 애플리케이션과 상호 작용하는 구조화되지 않은 텍스트 분석 함수. 이 함수는 Content Analytics에서 수행한 구조화되지 않은 텍스트 분석의 결과를 검색하기 위해 Java 서블릿에서 사용한다.
IBM Content Analytics
이 제품에는 크롤링 기능과 구문 분석, 인덱스, 검색 및 구조화되지 않은 텍스트 분석 기능이 있다. Content Analytics에는 복잡한 텍스트 분석 기능이 다양하게 있지만, 이 기사에서는 간단한 용어 빈도 분석을 집중적으로 살펴본다. 이 기사를 작성할 때는 IBM Content Analytics 버전 2.1을 사용했으며 이 제품은 Content Analytics Java API를 통해 자체 기능을 Java EE 애플리케이션으로 노출한다. 그러나 IBM Content Analytics 릴리스 2.2부터는 편리한 REST API를 사용하여 자체 기능과 상호 작용할 것을 추가로 제안한다.

그림 1에는 My Grant Awards 위젯에서 사용한 연구비 제목을 검색하기 위한 데이터 처리 플로우가 표시되어 있다. 또한, 이 그림에는 My Keywords 위젯에서 사용한 키워드의 연관된 빈도와 함께 키워드를 검색하기 위한 데이터 처리 플로우가 표시되어 있다. (My Grant Awards 및 My Keywords 위젯의 세부사항은 이 시리즈의 파트 3를 참조한다.)


그림 1. 데이터 처리 플로우
데이터 처리 플로우

서버측 함수

My Grant Awards와 My Keywords 위젯의 서버측 함수는 Java 서블릿 기술을 사용하여 구현한다. 위젯은 서블릿에 표준 HTTP GET이나 HTTP POST 요청을 전달함으로써 서버측 함수를 액세스한다. 그러면 이 서블릿이 XML 형식의 응답을 생성한다.

My Grant Awards와 My Keywords 서블릿은 지원 연구비의 제목을 사용자 정의 웹 크롤러를 사용하여 써드파티 웹 사이트에서 검색한다. 그림 1에 표시된 바와 같이 검색된 정보는 두 서블릿에서 다음과 같은 두 가지 방법으로 사용한다.

  • My Grant Awards 서블릿을 사용하여 지원 연구비의 제목을 검색
  • Content Analytics를 사용하여 키워드와 키워드의 연관된 빈도를 추출하여 지원 연구비의 제목을 분석하고 My Keywords 서블릿을 사용하여 추가로 검색

My Keywords 서블릿은 Content Analytics 분석을 사용하여 다음과 같은 두 가지 유형의 텍스트 소스를 처리한다.

  • TAGGS 웹 사이트에서 추출한 지원 연구비의 제목
  • PLoS(Public Library of Science) 생물학 저널 웹 사이트에서 추출한 기사

이 두 가지 소스는 구조화되지 않은 텍스트 컨텐츠를 나타낸다.


My Grant Awards 서블릿

My Grant Awards 위젯은 프로파일 소유자에게 지원 연구비의 제목 목록을 표시한다. 이 기사에 있는 My Grant Awards 서블릿은 하나의 매개변수, 즉 Profile 페이지에 표시되는 프로파일의 소유자 ID만 받는다. 단순하게 하기 위해 이 기사의 나머지 부분에서는 ID 대신 프로파일 소유자의 전체 이름을 사용한다.

My Grant Awards 서블릿 인터페이스에는 다음과 같은 구문이 있다.

{path_to_servlet}?investigator=<string>

서블릿 구현

목록 1에 있는 Java 소스 코드는 My Grant Awards 서블릿의 doGet 메소드를 구현한다. My Grant Awards 서블릿은 아래 2행에서 매개변수를 하나 받아서 principalInvestigator 문자열 변수에 저장한다. HTTP GET 요청의 추가 처리는 이 변수의 값에 따라 수행된다.


목록 1. My Grant Awards 서블릿, doGet 구현
1 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
2 String principalInvestigator = request.getParameter(INVESTIGATOR);
3 response.setContentType(XMLUtil.CONTENT_TYPE);
4 PrintWriter pw = response.getWriter();
5 String grantsXml = "";
6 try{
7 if(db2Connection == null) {
8 /* ... handle error condition ... */
9 } else if(principalInvestigator == null || principalInvestigator == "") {
10 /* ... handle error condition ... */
11 } else {
12 if(principalInvestigator.equals("maintenance")) {
13 GAMaintenanceStatus st = mgr.maintainAwards(db2Connection); 
14 switch(st) {
15 /* ...modify grantsXml string according to maintenance status...*/
16 }
17 } else {
18 grantsXml += mgr.retrieveAwardsXML(principalInvestigator);
19 }
20 }
21 } catch(Exception e) {
22 /* ... handle any occurred exception ... */
23 } finally {
24 /* ... update servlet response in any case ... */
25 }
26 }


모든 Profiles 사용자 이름은 Profiles 애플리케이션의 서버측에서 사용하는 DB2 테이블에 저장된다. 목록 1의 7행과 13행에 표시된 바와 같이 My Grant Awards 서블릿은 DB2 연결(변수 이름 db2Connection)을 사용하여 이 테이블에 액세스한다.

이 서블릿은 다음과 같은 두 가지 유형의 요청을 처리할 수 있다.

  • 한 사람의 지원 연구비의 목록 검색(목록 1의 18행에 있는 retrieveAwardsXML 메소드). 이 요청은 HTTP GET 요청에 프로파일 소유자의 전체 이름이 포함되어 있는 경우에 호출된다.
  • 최근에 지원된 연구비의 주제 목록을 사용자 정의 크롤러에서 가져와서 로컬 파일 시스템에 저장(목록 1의 13행에 있는 maintainAwards 메소드).

유지보수는 HTTP GET 요청에 maintenance 키워드가 포함되어 있을 때 수행된다. 이러한 요청은 모두 사용자 정의 크롤러에 있는 코드를 실행한다.

HTTP POST 요청을 수행할 사용자 정의 크롤러

사용자 정의 크롤러는 HTTP POST 요청을 생성하여 써드파티 웹 사이트에 있는 데이터를 검색하고 검색한 데이터를 구문 분석하는 기능을 한다. 구문 분석한 데이터는 HTML 파일 형태로 로컬 파일 시스템에 저장된다. 지원 연구비 주제 목록은 파일에서 원시 HTML 테이블로 표시된다. 고유 HTML 파일은 등록된 각 Profiles 사용자를 위해 존재한다.

로컬에 저장한 HTML 파일은 다음과 같은 두 가지 방법으로 사용된다. 키워드의 연관된 빈도를 사용하여 이 파일에서 키워드를 추출하고 My Grant Award 위젯을 사용하여 이 파일의 내용을 표시한다.

Content Analytics는 제출된 HTML 양식에 따라 동적으로 생성된 웹 페이지를 크롤링하는 기능을 지원하지 않기 때문에 사용자 정의 크롤러를 개발해야 했다.


My Keywords 서블릿

파트 3: 프로파일을 사용하여 연구 관심 분야 및 지원 연구비 정보 공유에서 살펴본 바와 같이 My Keywords 위젯에는 두 가지 유형의 컨텐츠, 즉 순전히 시각화를 목적으로 한 컨텐츠와 시각화의 매개변수를 수정하기 위한 컨텐츠가 있다. 이러한 묵시적 "분류"가 있는 행에서 My Keywords 서블릿은 모든 요청을 다음과 같은 두 가지 그룹으로 처리한다.

  • 이 위젯의 컴포넌트를 시각화하는 데 사용된 데이터를 생성하거나 새로 고치기 위한 HTTP GET 요청
  • 이 데이터를 생성하는 데 사용된 매개변수를 수정하기 위한 HTTP POST 요청

GET 요청 핸들러

목록 2에 표시된 바와 같이 My Keywords 서블릿의 인터페이스에는 HTTP GET 요청을 처리하는 구문이 있다.


목록 2. HTTP GET 요청을 처리하기 위한 My Keywords 서블릿 인터페이스
{path_to_servlet}?investigator=<string>
 [&threshold=<integer>]
 [&extract_from=<comma-separated strings>]
 [&compare_with=<string>]


이 인터페이스에 따르면 이 서블릿으로 전달되는 유일한 필수 매개변수는 investigator=<string>이며, My Grant Awards 서블릿에서와 마찬가지로 이 매개변수는 프로파일 소유자의 이름을 지정한다. 아래에 표시된 바와 같이 기타 매개변수는 선택적이다.

선택적 매개변수역할
extract_from=<comma-separated strings>키워드 추출에 사용된 웹 소스 결정. 기본적으로 지원 연구비 주제만 추출에 사용된다.
threshold=<integer>키워드 발생 빈도의 최소 임계값 결정. 예를 들어, 임계값이 2이면 threshold=2가 다른 매개변수와 함께 서블릿으로 전달된다. 이 경우에는 IBM Content Analytics에서 두 번 미만 분석된 텍스트에서 발생하는 모든 키워드는 키워드와 빈도가 있는 목록에 포함되지 않는다.
compare_with=<string>또 다른 프로파일 소유자의 이름을 결정. 이 소유자를 대상으로 추출한 키워드를 현재 Profile 애플리케이션에 로그인한 사람을 대상으로 추출한 키워드와 비교하여 이 두 개의 프로파일과 일치하는 단어를 강조할 수 있다.

POST 요청 핸들러

My Keywords 서블릿은 목록 3에 표시된 매개변수를 받아서 HTTP POST 요청을 처리한다.


목록 3. HTTP POST 요청을 처리하기 위한 My Keywords 서블릿 인터페이스
investigator=<string>
 updated_stopwords_list=<comma-separated strings>
 terms_sources=<comma-separated strings>

아래에 표시된 바 같이 모든 매개변수는 필수이다.

필수 매개변수역할
investigator=<string>프로파일 소유자 식별
updated_stopwords_list=<comma-separated sub-strings>원하지 않는 키워드를 필터링할 때 사용하는 사용자 정의 중지 단어(검색 엔진에서 제외되는 단어)를 식별
terms_sources=<comma-separated sub-strings>키워드를 추출할 때 사용할 업데이트된 소스 식별 이 매개변수 값은 ","(콤마) 기호로 분리된 grantspublications 서브스트링으로 구성된 문자열이 될 수 있다.

서블릿 구현

목록 4에는 My Keywords 서블릿의 doGet 메소드를 구현하는 데 필요한 Java 소스 코드가 표시되어 있다. 목록 4는 다음과 같이 구성된다.

  • 2 ~ 7행: HTTP GET 요청과 함께 수신된 매개변수 값에 따라 할당된 값을 초기화한다.
  • 8행: termsFrequencyMap 해시 맵을 사용하여 해당 텍스트에서 추출한 발생 빈도와 함께 키워드(또는 용어)를 저장한다.
  • 13행: 서블릿에서 XML 형식의 텍스트 형태로 응답을 생성한다.
  • 15 ~ 24행: 원하지 않는 용어를 필터링할 때 사용하는 중지 단어 세트와 용어를 추출할 때 사용하는 소스 목록을 초기화하는 메커니즘을 구현한다.
  • 26 ~ 45행: CcaAnalyzer 클래스로 캡슐화한 서버측 함수의 상호 작용을 IBM Content Analytics를 사용하여 구현한다. 클래스를 구현하는 자세한 과정은 아래에서 살펴본다.
  • 32 ~ 37행: 다른 소스 중에서 지원 연구비 주제를 선택하여 용어와 용어의 빈도를 추출했을 경우를 나타낸다.

    특정 URI(Unique Resource Identifier) 접두부를 사용하여 getTermsAndFreqs 메소드를 호출한다(33, 35행). principalInvestigator 변수를 이용하여 작성된 파일 이름과 결합된 이 URI 접두부는 IBM Content Analytics가 분석된 문서를 액세스하기 위해 사용한다. 용어를 추출하는 과정에서 IBM Content Analytics가 지원 연구비 주제의 분석 결과를 사용한다는 사실을 이 URI 접두부를 통해 알 수 있다. 텍스트에서 용어가 빈도와 함께 추출되는 즉시 termsFrequencyMap이 업데이트된다. 목록 4에서는 소스 코드 중 이 부분이 생략되었다(36행).


목록 4. My Keywords 서블릿, doGet 구현
1 protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
 throws ServletException, IOException {
2 String principalInvestigator = (req.getParameter(INVESTIGATOR) == null) ?
3 "" : req.getParameter(INVESTIGATOR);
4 String personToCompareWith = (req.getParameter(COMPARE_WITH) == null) ? 
5 "" : req.getParameter(COMPARE_WITH);
6 String frequencyThreshold = (req.getParameter(THRESHOLD) == null) ? 
7 "0": req.getParameter(THRESHOLD);
8 HashMap<String, String> termsFrequencyMap = new HashMap<String, String>();
9 
10 String usedSources; 
11 Set<String> stopWords;
12 
13 resp.setContentType(XMLUtil.CONTENT_TYPE);
14 
15 try {
16 TermsInfo termsInfo = allPersonsInfo.get(principalInvestigator);
17 if(termsInfo.exists()) {
18 usedSources = termsInfo.getSources();
19 stopWords = termsInfo.getStopWords ();
20 } else {
21 usedSources = DEFAULT_SOURCES;
22 stopWords = getDefaultStopWords();
23 }
24 } catch(Exception e) { /*... handle exceptions ...*/ }
25 
26 try{
27 CcaAnalyzer ccaAnalyzer;
28 ccaAnalyzer = new CcaAnalyzer(Integer.parseInt(frequencyThreshold));
29 ccaAnalyzer.initialize(ccaConfigFile);
30 
31 String normalizedName = principalInvestigator.replace(' ', '+');
32 if(usedSources.contains(AWARDS_SOURCES)) {
33 String uriPrefix = AWARDS_URI_PREFIX;
34 String terms_and_freqs;
35 terms_and_freqs = 
 ccaAnalyzer.getTermsAndFreqs(uriPrefix,normalizedName,stopWords);
36 /*... code to update termsFrequencyMap is omitted ...*/
37 }
38 if(usedSources.contains(OTHER_POSTS)) {
39 String uriPrefix = OTHER_URI_PREFIX;
40 /* code similar to AWARDS_SOURCES block*/
41 }
42 if(usedSources.contains(JOURNAL_ARTICLES)) {
43 String uriPrefix = JOURNAL_ARTICLES_URI_PREFIX;
44 /* code similar to AWARDS_SOURCES block*/
45 }
 
46 /* here an output is updated with XML section,
 describing extracted terms and frequencies */
 
47 String cloudJson = getCloudJSON(principalInvestigator,personToCompareWith); 
48 /* code to add XML section with JSON to be used with Tag Cloud widget */
49 } catch (Exception e) { /* ... handle exceptions ... */ 
50 } finally {
51 /* ... code to finalize XML markup / release response is omitted ... */
52 }
53 }

위에 있는 소스의 38 ~ 45행에 표시된 바와 같이 용어와 용어의 빈도가 다양한 소스에서 추출된다. 다양한 소스에서 용어를 추출하는 소스 코드는 33 ~ 36행에 있는 코드와 거의 동일해서 목록에는 포함되지 않았다.

다양한 소스에서 용어와 빈도를 추출하는 작업이 완료(목록 4의 46행)되는 즉시 추출된 용어와 용어의 빈도 쌍이 포함되도록 결과물이 업데이트된다.

My Keywords 위젯의 일부인 Dojo Tag Cloud 위젯은 JSON 소스를 사용하여 위젯 컨텐츠를 렌더링한다. 따라서 JSON 형식으로 된 용어와 용어의 빈도가 My Keywords 서블릿 응답에 포함된다(목록 4의 47행).

용어의 빈도를 추출하는 데 필요한 IBM Content Analytics API와 코드

목록 5에는 getTermsAndFreqs 메소드의 Java 소스 코드를 단순화한 버전이 표시되어 있는데, 이 코드는 CcaAnalyzer 클래스를 구현하는 핵심 코드이다. 목록 4의 27, 28, 29 및 35행에 표시된 바와 같이 이 클래스의 인스턴스는 My Keywords 서블릿에서 사용한다. getTermsAndFreqs 메소드를 호출하는 예제는 목록 4의 35행에 표시되어 있다.


목록 5. getTermsAndFreqs를 구현하는 데 필요한 단순화된 소스 코드
1 public Map<String, Integer> getTermsAndFreqs (String uriPrefix, String normalizedName,
 Set<String> stopWords) {
2 Class<?> fetchClass = Class.forName("com.ibm.es.api.fetch.RemoteFetchFactory");
3 FetchServiceFactory fetchFactory = 
 (FetchServiceFactory) fetchClass.newInstance();
4 config = new Properties();
5 config.load(new FileInputStream(configPath));
6 ApplicationInfo applicationInfo = 
 fetchFactory.createApplicationInfo(applicationName);
7 FetchService fetchService = fetchFactory.getFetchService(config);
8 Fetcher fetcher = fetchService.getFetcher(applicationInfo, collectionID);
9 fetcher.getCollection();
10 
11 String resourceURI = uriPrefix + "/" + normalizedName;
12 SummaryRequest summaryRequest = 
 fetchFactory.createSummaryRequest(resourceURI, null);
13 summaryRequest.setFormat("miml");
14 InputStream in = fetcher.getSummary(summaryRequest);
15 if(in != null) {
16 String inputString; 
 /* [skipped]: 
 build the string filled from the contents of ‘in’ input stream */
17 InputSource source = new InputSource(inputString);
 
18 com.ibm.es.takmi.impl.std.document.DocumentHandler handler = 
 new DocumentHandler();
19 SAXParser parser = new SAXParser();
20 parser.setContentHandler(handler);
21 parser.parse(source);
 
22 com.ibm.es.takmi.impl.std.document.Document mimlDoc = 
 handler.getDocument();
23 if (mimlDoc.getDocumentID() != null) {
24 Map<String, Integer> m = determineFrequencyOfKeywords(mimlDoc, stopWords);
25 return m; 
26 } else {
27 return new HashMap<String, Integer>; //return empty map
28 }
29 }
30 }


목록 5에 있는 getTermsAndFreqs 메소드는 입력 매개변수로 다음 인수를 받는다.

  • String uriPrefix: 문서 소스 URI의 첫 번째 부분을 포함하고 있으며, 문서에서 용어와 빈도를 추출하는 데 사용된다.
  • String normalizedName: 현재 관찰하고 있는 프로파일 소유자의 전체 이름을 포함하고 있으며 첫 번째, 중간 및 마지막 이름 사이에 있는 모든 공백을 "+"(플러스) 기호로 대체하는 방식으로 표준화된다.
  • Set<String> stopWords: stopWords 세트에 있는 단어를 필터링하여 용어 추출 결과를 세분화할 모든 중지 단어를 포함하고 있다.

구성 파일에 대한 경로인 configPath는 IBM Content Analytics 분석기 초기화 단계에서 getTermsAndFreqs가 호출되기 전에 초기화된다(목록 4의 29행). 같은 단계에서 collectionID 변수(목록 5의 8행에서 사용됨)가 초기화된다. CollectionID는 키워드를 추출하는 과정에서 사용하는 IBM Content Analytics 문서 콜렉션을 정의한다. 각 자원에는 URI가 있다.

목록 5에 표시된 바와 같이 getTermsAndFreqs 메소드를 구현하는 과정은 FetchServiceFactory 클래스 인스턴스화 변수 fetchFactory(2 및 3행)로 시작된다. fetchFactory 변수는 다음 인터페이스를 인스턴스화하기 위해 사용한다.

  • com.ibm.siapi.common.ApplicationInfo 인터페이스(6행): 이 인터페이스는 인증 및 액세스 제어를 위해 사용되며 IBM Content Analytics 콜렉션에 액세스할 수 있는 권한을 검증한다.
  • com.ibm.es.fetch.FetchService 인터페이스(7행): 일반적인 페칭 서비스를 포함하고 있으며 Fetcher 인스턴스를 작성하는 데도 사용된다(8행).
  • com.ibm.es.fetch.SummaryRequest 인터페이스(12행): URI로 식별되는 자원을 실제로 페치하는 데 사용된다(13 및 14행).

목록 5의 4행과 5행에는 로컬 파일 시스템에서 IBM Content Analytics 구성 옵션을 업로드하는 데 사용되는 java.util.Properties 클래스를 인스턴스화하는 코드가 표시되어 있다. fetchService는 이렇게 초기화된 인스턴스(7행의 Properties 클래스 인스턴스 config)를 사용하여 작성한다.

사전에 작성된 요약 요청을 입력 스트림(14행)으로 사용하여, 비어 있지 않은 자원 요약을 페치하는 즉시 자원 요약을 처리하여 다음과 같은 작업을 한다.

  • 용어 검색
  • 자원 요약에서 용어의 빈도를 결정
  • Java 문자열 형태로 응답을 호출자에게 리턴(15 ~ 29행)

자원 요약은 XML 태그를 사용하는 MIML(MIning Markup Language)을 사용하여 형식화된다. 자원 요약은 SAXparser를 사용하여 입력 스트림을 구문 분석하는 과정을 통해 계속 처리된다(목록 5의 19 ~ 21행). 구문 분석은 com.ibm.es.takmi.document.Document 클래스 인스턴스(mimlDoc, 22행)를 작성한 후에 수행되며 용어와 용어의 연관된 빈도를 검색하여 문자열로 리턴하기 위해 사용된다(24 및 25행).

목록 6에는 용어와 빈도를 추출하는 프로세스가 더 자세하게 표시되어 있다. 샘플 Java 코드에서는 com.ibm.es.takmi.impl.* 패키지를 사용하여 MIML 형식의 XML 문서를 처리한다.


목록 6. 용어와 용어의 빈도를 추출하는 데 필요한 보조 메소드
1 import com.ibm.es.takmi.impl.common.document.KeywordFeature;
2 import com.ibm.es.takmi.impl.common.document.KeywordFeatureElement;
3 
4 /*...*/
5 
6 private Map&lt;String,Integer&gt;
          determineFrequencyOfKeywords(Document doc, Set&lt;String&gt; stopWords) {
7 HashMap<String, Integer> keywordFrequencyMap = 
 new HashMap<String, Integer>();
8 KeywordFeature keywordFeature = 
 (KeywordFeature) mimlDoc.getFeature(KeywordFeature.class);
9 for (KeywordFeatureElement element : keywordFeature.getFeatureElements()) {
10 String category = element.getCategory();
11 if (category.startsWith("$._word")) {
12 String keyword = element.getValue();
13 if(stopWords.contains(keyword.toLowerCase()) {
14 continue;
15 }
16 Integer freq = keywordFrequencyMap.get(keyword);
17 if(freq != null) {
18 keywordFrequencyMap.put(keyword, freq+1);
19 } else {
20 keywordFrequencyMap.put(keyword, 1);
21 }
22 }
23 }
24 return keywordFrequencyMap;
25 }

목록 6의 코드에서는 MIML 문서에 포함된 모든 요소를 순회하는 코드를 구현한다. 각 요소에는 텍스트에서 추출된 구성요소가 포함되어 있다. 이 구성요소가 단어(11행)를 나타내는 경우에는 해당 요소가 추가로 분석된다. 중지 단어를 필터링하는 과정을 적용하며(13 ~ 15행) Java HashMap(16 ~ 21행)을 사용하여 단어 빈도(키워드 또는 용어 빈도라고도 함)를 계산한다.


IBM Content Analytics 구성

이 섹션에서는 구조화되지 않은 텍스트 컨텐츠를 분석할 수 있는 IBM Content Analytics의 구성과 관련된 세부사항을 자세하게 살펴본다. 또한, 예제를 통해 다양한 웹 소스에서 텍스트 컨텐츠를 추출한다.

IBM Content Analytics 구성에는 여러 가지 텍스트 분석 콜렉션(즉, 텍스트 마이닝 전문 도구 corpora)이 포함된다. 이러한 콜렉션에서는 다음과 같은 다양한 텍스트 마이닝 기능과 검색 기능이 지원된다.

  • 데이터에서 상관이나 편차를 탐색하는 기능
  • 분석 결과를 데이터 웨어하우스나 비즈니스 인텔리전스 애플리케이션으로 내보내기

사전 정의된 스케줄에 따르거나 계속해서 데이터 소스에서 문서를 수집하는 하나 이상의 크롤러를 사용하여 콜렉션 데이터를 검색한다. 그런 다음, 크롤링된 각 문서를 대상으로 구문 분석, 인덱싱, 언어 분석 및 사용자 정의 분석을 하는 분석 파이프라인을 통해 검색한 데이터를 전달한다.

이 기사의 예제 텍스트 분석 콜렉션에서는 두 가지 유형의 크롤러를 사용한다.

  • 로컬 파일 시스템 크롤러. 이 크롤러는 로컬에 저장된 데이터를 수집하기 위해 구성된다.
  • 웹 크롤러. 이 크롤러는 PLoS 생물학 저널 웹 사이트에 있는 출판물을 수집하기 위해 구성된다.

이 두 가지 유형의 크롤러는 아래에서 더욱 자세하게 다룬다.

지원된 프로젝트 주제를 검색하는 사용자 정의 크롤러

Profiles 사용자의 지원 연구비 주제는 TAGGS 웹 사이트에서 가져와서 로컬에 저장하며 Content Analytics 로컬 파일 시스템 크롤러를 사용하여 크롤링한다. TAGGS 사이트에서는 검색 양식을 제출하여 데이터를 검색할 수 있으므로 동적으로 생성된 페이지를 크롤링하는 기능이 필요하다. IBM Content Analytics에는 이러한 페이지를 크롤링하는 기능이 없다. 이 기사의 Profiles 확장 애플리케이션에서는 사용자 정의 크롤러를 기반으로 하는 다른 솔루션을 적용하여 동적으로 생성된 웹 페이지를 크롤링한다.

사용자 정의 크롤러는 GAManager(연구비 지원 관리자) Java 클래스와 여러 개의 보조 클래스를 사용하여 구현한다. 목록 1에서 My Grant Awards 위젯의 서블릿을 구현하는 과정에서는 서로 다른 두 가지 유형의 HTTP GET 요청, 즉 한 사람의 연구비 지원 목록을 유지하기 위한 요청과 등록된 모든 사람의 연구비 지원 목록을 한 번에 유지하기 위한 요청을 처리했다. 이러한 요청은 doGet의 범위 내에서 서로 다른 두 개의 호출을 통해 처리된다.

GAMaintenanceStatus st = mgr.maintainAwards(db2Connection);

grantsXml += mgr.retrieveAwardsXML(principalInvestigator);

위에 있는 코드 스니펫에서는 GAManager 클래스(mgr 변수) 인스턴스가 개발된 사용자 정의 크롤러와 함께 작동하는 핸들러이다. 이 인스턴스는 My Grant Awards 서블릿을 초기화하는 과정에서 초기화된다.

GAManager 상위 레벨 구현

목록 7에는 GAManager 클래스를 상위 레벨에서 구현한 코드가 표시되어 있다. GAManager 생성자는 다음과 같은 두 개의 문자열 매개변수를 받는다.

  • 첫 번째 문자열 매개변수에는 LDAP 서버의 URL이 포함되어 있다. 이 서버는 등록된 모든 Profiles 사용자를 인증하는 데 사용된다. GAManager는 등록된 모든 사용자의 전체 이름으로 구성된 목록을 검색하기 위해 이 서버를 사용한다.
  • 두 번째 문자열 매개변수에는 TAGGS 웹 사이트에서 검색한 데이터를 Profiles 사용자 한 명당 한 개의 파일로 저장하기 위해 사용하는 로컬 파일 시스템 폴더의 경로가 포함되어 있다.

목록 7. GAManager 클래스의 상위 레벨 구현
public class GAManager {
 public GAManager(String ldapURL, String awardsFolder) {...}
 public String retrieveAwardsXML(String userName) {...}
 public GAMaintenanceStatus maintainSingleAward(String userName) {...}
 public GAMaintenanceStatus maintainAwards(Connection db2Connection) {...}
 }

목록 7에서는 다음 메소드를 사용한다.

retrieveAwardsXml
이 메소드는 Profiles 사용자 이름을 감안하여, 로컬에 저장된 HTML 파일 컨텐츠 형태로 사용자의 연구비 지원 목록을 유지보수하는 작업을 수행한다. 그런 다음에는 HTML 데이터를 XML로 변환하여 다시 호출자에게 리턴한다. HTML 파일의 현재 상태(예를 들면, 이 파일이 존재하지 않을 수도 있음)에 따라 웹에서 HTML 형식의 연구비 지원 목록을 페치하는 메소드가 묵시적으로 호출될 수도 있다.

retrieveAwardsXml은 Profiles 사용자의 전체 이름을 매개변수로 받아서 maintainSingleAward 메소드를 호출한다.

maintainSingleAward
이 메소드는 Profiles 사용자 이름을 감안하여, 사용자를 위해 로컬에 저장된 하나의 HTML 파일 형태로 프로파일의 연구비 지원 목록을 유지보수하는 작업을 수행한다. HTML 파일의 현재 상태(이 파일이 존재하지 않거나 더 이상 유효하지 않을 수 있음)에 따라 웹 에서 HTML 형식의 연구비 지원 목록을 페치하는 메소드가 여기에서 호출된다.

maintainSingleAward는 Profiles 사용자의 전체 이름을 매개변수로 받아서 유지보수를 수행하는 작업의 상태를 리턴한다. 이 상태는 다음 중 하나가 된다.

  • SUCCESS - 유지보수가 성공적으로 실행되었음
  • INPROGRESS - 다른 유지보수 스레드가 이 사람을 대상으로 진행 중이어서 유지보수가 실행되지 않았음
  • ERROR - 유지보수를 수행하는 과정에서 내부 오류가 발생했음
maintainAwards
모든 Profiles 사용자의 연구비 지원 데이터를 유지보수하는 작업을 수행한다. 이 메소드는 먼저 등록된 사용자 항목을 LDAP에서 검색하고 이 항목을 키로 사용하여 DB2에서 SQL 쿼리를 통해 사용자의 전체 이름을 검색한다. 그런 다음, maintainAwardsmaintainSingleAwards 메소드를 호출하여 등록된 모든 사용자를 처리한다. maintainAwards는 DB2 데이터베이스로의 연결을 나타내는 Connection 매개변수를 받는다.

TAGGS에서 데이터 페치

TAGGS 웹 사이트에서 데이터를 페치하는 작업은 GAManager가 사용하는 GAWebFetcher 보조 클래스를 통해 수행된다. HTML 형태의 연구비 지원 목록을 페치하기 위해 GAWebFetcher에서 사용하는 기본 메소드의 단순화된 버전은 목록 8에 표시되어 있다.


목록 8. fetchAwardsHTML 메소드의 구현
        /* ... */	
        1 private static final String GRANTS_REFERER = 
        "http://taggs.hhs.gov/advancedsearch.cfm";
        /* ... */	
        2 private String fetchAwardsHTML(String userName) throws IOException {
        3 String awardsHTML = "<h2>"+facultyName+"</h2><hr><br>";
        4 String investigator = getLastName(userName);
        5 addRequestHeader("referer", GRANTS_REFERER); 
        6 setAdvancedSearchRequestDefaults(); //setting default parameters.
        7 addRequestParameter("sPIName", investigator); //fill-in the name parameter.
        8 fillParameters(); //putting parameters into request.
        9 
        10 try {
        11 client.setTimeout(15000);//15 seconds timeout
        12 client.executeMethod(postMethod); //executing request.
        13 } catch(Exception e) {
        14 if( e.getMessage().contains("timed out")) {
        15 /* ... notify the caller about timeout ... */
        16 }
        17 /* ... handle other exceptions ... */
        18 }
        19 
        20 Tidy tidy = new org.w3c.tidy.Tidy();
        21 tidy.setXmlOut(true);
        22 tidy.setShowWarnings(false);
        23 document = tidy.parseDOM(postMethod.getResponseBodyAsStream(), null);
        24 awardsHTML += getAwardsHtmlTable();
        25 postMethod.releaseConnection();
        26 return awardsHTML;
        27 }
        
    

TAGGS 웹 사이트에서 페치한 HTML 섹션에는 학부 이름(목록 8의 3행)을 나타내는 머리글과 같은 인위적으로 생성된 HTML 컴포넌트가 있다.

TAGGS 고급 검색 페이지에서 연구비 지원 HTML 데이터를 페치하려면 HTTP POST 요청을 생성해야 한다. 이 요청에는 검색 대상의 세부사항을 나타내는 값이 있는 요청 매개변수가 포함되어 있다. 시험자의 마지막 이름을 제외하면 HTTP POST 요청과 함께 전달되는 데이터는 모든 사람에게 동일하다.

목록 8의 4 ~ 7행에 있는 코드는 의미 있는 매개변수를 사용하여 HTTP POST 요청을 이행하기 위해 사용된다. TAGGS 고급 검색 페이지에서 유효한 응답을 얻기 위해 이 페이지로 전달되는 HTTP POST 요청을 통해 grants referrer 매개변수를 값과 함께 전달해야 한다. 본질적으로 fillParameterssetAdvancedSearchDefaults 메소드는 다음과 같은 org.apache.commons.httpclient.methods.PostMethod 클래스에서 인스턴스화된 오브젝트의 매개변수를 추가하고 초기화하는 과정을 통해 구현된다.

postMethod.addParameter(key, parameterValue);
    

목록 8의 10 ~ 18행에는 postMethod 오브젝트를 사용하여 HTTP POST 요청 실행을 호출하는 방법이 표시되어 있다. 23행에 표시된 바와 같이 HTTP POST 요청을 실행하자 마자 응답을 받을 수 있다.

postMethod.getResponseBodyAsStream();
    

IBM Content Analytics 내장 크롤러

언급한 바와 같이 이 기사에서는 여러 가지 유형의 IBM Content Analytics 크롤러 중 두 가지만을 사용한다. 다음은 각 크롤러 유형에 대한 현실적인 구성 예제이다.

로컬 파일 시스템 크롤러의 구성
로컬 파일 시스템 크롤러는 사전 정의된 Windows 파일 시스템 폴더에 있는 파일을 검색하도록 구성된다(지원된 프로젝트의 주제를 검색하는 사용자 정의 크롤러, GAManager 생성자 세부사항 및 목록 7 참조). HTTP POST 요청을 사용하여 사용자 정의 크롤러로 검색한 HTML 파일은 이 폴더에 저장되어 IBM Content Analytics Windows 파일 시스템 크롤러가 사용할 수 있게 된다.

로컬 파일 시스템 크롤러는 단일 폴더를 대상으로 작동하고 이 폴더에서 HTML 유형의 파일만을 검색하도록 구성된다. 이렇게 구성하면 Profiles 사용자의 지원 연구비 주제가 포함된 해당 HTML 파일만 IBM Content Analytics에서 분석하게 된다.

지원 연구비의 주제가 있는 해당 HTML 파일의 경로와 일치하는 고유 URI를 사용하여 각 사용자에 대한 분석 결과를 연속해서 검색할 수 있다는 혜택을 추가로 누릴 수 있다.

웹 크롤러 구성: PLoS 생물학 저널
웹 크롤러는 2010년 5월에 PLoS Biology에서 발행한 기사의 초록을 PLoS Biology 웹 사이트를 사용하여 검색하도록 구성된다. 이 웹 사이트에서는 기사의 구조화된 카탈로그를 기사 초록 및 기사 인용과 같은 관련 자료와 함께 제공한다.

크롤러가 2010년 5월에 발행된 페이지의 URL을 사용하여 해당 기사의 초록만을 검색하도록 하고 크롤러가 다른 문서를 크롤링하지 못하도록 하기 위해 다음과 같은 크롤링 규칙을 사용했다.

시작 URL:

http://www.plosbiology.org/article/browseIssue.action?
    issue=info%3Adoi%2F10.1371%2Fissue.pbio.v08.i05     
    

도메인 규칙:

allow domain www.plosbiology.org
forbid domain *
    

HTTP 접두부 규칙:

allow prefix http://www.plosbiology.org/article/browseIssue.action?
    issue=info%3Adoi%2F10.1371%2Fissue.pbio.v08.i05
allow prefix http://www.plosbiology.org/article/browseIssue.action*
allow prefix http://www.plosbiology.org/article/info*
forbid prefix *

도메인 규칙을 사용하여 파트너 웹 저널을 가리키는 링크나 배너 광고와 같은 관련이 없는 거의 모든 URL을 필터링한다. 크롤링 공간(도메인 또는 접두부)의 규칙은 "선입선적용" 방식으로 적용된다. IBM Content Analytics는 위에 있는 도메인 규칙에 따라 먼저 www.plosbiology.org 도메인을 크롤링하도록 한 다음, 다른 도메인은 크롤링하지 못하도록 한다.

HTTP 접두부 규칙은 크롤링 공간을 세밀하게 조정하여 시작 웹 페이지를 먼저 크롤링하고 그다음에 이 페이지에 있는 기사를 크롤링하도록 하면서 다른 URL은 크롤링하지 못하도록 하는 기능을 수행한다.


결론

이 기사에서는 IBM Lotus Connections Profiles를 기반으로 하는 UI를 구현하는 과정을 자세하게 설명했다. 구조화되지 않은 데이터를 검색하고 분석 및 시각화하는 기능을 지원하기 위해 iWidget 기반 위젯 번들을 사용하여 UI를 확장했다. (파트 3에서는 클라이언트 측을 살펴보았다.)

구조화되지 않은 웹 컨텐츠를 분석하기 위해 서버측 함수를 IBM Content Analytics와 통합했다. 분석 결과를 사용하여 위젯의 컨텐츠를 친화적이고 유용한 방법으로 표시했다.

이 기사에서는 실제적인 예제를 사용하여 IBM Lotus Connections와 IBM Content Analytics를 통합했을 때의 가치를 설명했다.


참고자료

교육

제품 및 기술 얻기

토론

필자소개

Ilya Afanasiev사진

Ilya Afanasiev는 소프트웨어 연구, 개발, 지원 및 품질 보증을 비롯한 다양한 분야에서 7년 이상 일한 경력으로 풍부한 기술 세트를 보유한 소프트웨어 엔지니어이다. 그는 IBM에 2007년도에 Russian Systems and Technology 연구소에 z/OS Systems Programmer로 합류했다. 현재는 웹 UI 개발 및 프로토타입화, 정보 검색 및 Java EE 애플리케이션 개발에 집중한다. 현재 연구 관심 분야는 텍스트 마이닝과 구조화되지 않은 텍스트 분석이다.

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=Industries, Lotus
ArticleID=742424
ArticleTitle=Lotus Connections를 사용하여 교육 산업에서 더욱 스마트하게 협업하기, 파트 4: IBM Content Analytics를 사용하여 구조화되지 않은 데이터를 크롤링하고 분석하여 표시하기
publish-date=03012011
author1-email=ilya.afanasiev@ru.ibm.com
author1-email-cc=

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.