Colaboração Mais Inteligente para o Segmento de Mercado de Educação Usando o Lotus Connections, Parte 4: Usar o IBM Content Analytics para efetuar crawl, analisar e exibir dados não estruturados

Neste artigo, continuaremos desenvolvendo um aplicativo de exemplo que amplia as páginas do IBM Lotus® Connections Profiles com informações sobre concessão de verbas de pesquisa e interesses de pesquisa acadêmica. Dados de origem não estruturados são reunidos e persistidos até um ponto de coleta de analítica de texto. Aprenderemos sobre a implementação do lado do servidor dos widgets personalizados, e como eles empregam a análise do IBM Content Analytics. Desenvolveremos também um crawler personalizado. Com o Lotus Connections e o IBM Content Analytics é possível executar crawl, análise e exibição de dados não estruturados.

Carl Osipov, Software Architect, IBM

CarlCarl Osipov é um experiente arquiteto de software da organização de estratégia e tecnologia do IBM Software Group. Suas qualificações estão relacionadas às áreas de computação distribuída, desenvolvimento de aplicativos de fala e entendimento do idioma natural por computadores. Ele já publicou e fez apresentações sobre SOA (Arquitetura Orientada a Serviços) e gerenciamento de diálogo de conversação para colegas do segmento de mercado e do mundo acadêmico. Seu foco atual é o design de técnicas de reutilização para serviços de negócios compostos.



Ilya Afanasiev, Software Engineer, IBM

Photograph of Ilya AfanasievIlya Afanasiev é engenheiro de software com mais de sete anos de experiência de trabalho bem-sucedido e um grande conjunto de competências em várias áreas, incluindo pesquisa, desenvolvimento, suporte e controle de qualidade de software. Ele passou a fazer parte da IBM em 2007 como programador de Sistemas z/OS no laboratório russo de sistemas e tecnologia. Seu foco atual é o desenvolvimento e a geração de protótipos de UI para a Web, recuperação de informações e desenvolvimento de aplicativos Java EE. Seus interesses de pesquisa atuais são a mineração de texto e análise de texto não estruturado.



31/Ago/2012

Introduction

A Parte 3 desta série, Use Perfis para compartilhar interesses de pesquisa e concessão de verbas, explorou como ampliar as páginas do IBM Lotus® Connections Profiles com informações sobre concessão de verbas de pesquisa e interesses de pesquisa acadêmica. Um aplicativo de exemplo mostrou como coletar e persistir dados de origem para um ponto de coleta de analítica de texto. A interface com o usuário (UI) foi criada com widgets e com o Lotus Connections. A apresentação, ou camada da "Web" da arquitetura suportou a interação do aplicativo com o usuário.

Este artigo amplia a extensão de exemplo do aplicativo Profiles e suas diversas camadas conceituais: Web, negócios, integração e dados. Aprenda a integrar as funções do lado do servidor com o IBM Content Analytics para analisar conteúdo da Web não estruturado.

A extensão de aplicativo Profiles tem duas partes principais:

Os desenvolvedores Java™ EE
Um aplicativo Java Enterprise Edition (Java EE) é implementado no WebSphere Application Server como arquivo EAR. As funções do aplicativo Java EE, também chamadas de funções do lado do servidor, incluem:
  • Dois servlets Java que processam as solicitações geradas pelos widgets My Grant Awards e My Keywords. Ambos os servlets geram respostas formatadas em XML.
  • Um crawler personalizado que trabalha com a página de pesquisa avançada do Tracking Accountability in US Government Grants System (TAGGS) e gera solicitações HTTP POST para recuperar a lista de concessão de verbas para um pesquisador arbitrário.
  • Funções de análise de texto não estruturado que interagem com um aplicativo independente do Content Analytics por meio de uma API Java. As funções são utilizadas pelos servlets Java para recuperar os resultados da análise de texto não estruturado realizada pelo Content Analytics.
IBM Content Analytics
Esse produto inclui recursos de crawl, análise, indexação, pesquisa, e análise de texto não estruturado. Embora o Content Analytics ofereça uma variedade de recursos de analítica de texto complexos, este artigo concentra-se em uma simples análise de frequência de termos. No momento em que este artigo foi escrito, os autores usaram o IBM Content Analytics versão 2.1, que expõe seu recurso para o aplicativo Java EE por meio de uma API Java do Content Analytics. No entanto, a partir do release 2.2, o IBM Content Analytics sugere adicionalmente o uso de APIs REST convenientes para interagir com sua funcionalidade.

a Figura 1 mostra o fluxo de processamento de dados para recuperar os títulos de concessões utilizado pelo widget My Grant Awards. Também mostra o fluxo de processamento para recuperar palavras-chave com suas frequências associadas utilizado pelo widget My Keywords. (Consulte Parte 3 desta série para obter detalhes sobre os widgets My Grant Awards e My Keywords.)

Figura 1. Fluxo de processamento de dados
Fluxo de processamento de dados

Funções do lado do servidor

As funções do lado do servidor dos widgets My Keywords e My Grant Awards são implementadas usando a tecnologia Java Servlet. Os widgets acessam as funções do lado do servidor por meio de solicitações HTTP GET ou HTTP POST padrão para servlets. Os servlets geram então respostas formatadas em XML.

Os servlets My Grant Awards e My Keywords empregam um Web crawler personalizado para recuperar os títulos das verbas concedidas a partir de um Web site de terceiros. Como mostra a a Figura 1, as informações recuperadas são usadas em ambos os servlets de duas maneiras:

  • Para recuperar títulos de verbas concedidas pelo servlet My Grant Awards.
  • Para analisar os títulos das concessões usando o Content Analytics para extrair palavras-chave, assim como suas frequências associadas, para recuperação adicional pelo servlet My Keywords.

O servlet My Keywords emprega a análise do Content Analytics para dois tipos de origens de texto:

  • Títulos de verbas de pesquisa concedidas, extraídos do Web site TAGGS.
  • Artigos extraídos do Web site do Biology Journal da Public Library of Science (PLoS).

Ambas as fontes representam conteúdo de texto não estruturado.


Servlet My Grant Awards

O widget My Grant Awards exibe a lista de títulos de verbas de pesquisa concedidas para um proprietário de perfil. Neste artigo, o servlet My Grant Awards aceita apenas um parâmetro: o ID da pessoa cujo perfil é exibido em uma página do Profiles. Por questão de simplicidade, usamos o nome completo do proprietário do perfil no lugar do ID durante todo o restante deste artigo.

A interface do servlet My Grant Awards tem a seguinte sintaxe.

{path_to_servlet}?investigator=<string>

Implementação de servlet

O código de origem Java na Listagem 1 implementa o método doGet para o servlet My Grant Awards. O servlet My Grant Awards aceita um único parâmetro, na linha 2 abaixo, cujo valor é armazenado na variável de cadeia de caracteres principalInvestigator . É feito processamento adicional da solicitação HTTP GET de acordo com o valor dessa variável.

Listagem 1. Servlet My Grant Awards, implementação 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 }

Todos os nomes de usuário do Profiles são armazenados em uma tabela DB2 usada pelo lado do servidor do aplicativo Profiles. Para acessar a tabela o servlet My Grant Awards usa uma conexão DB2, como mostrado na linhas 7 e 13 da Listagem 1, com o nome de variável db2Connection.

O servlet pode processar dois tipos de solicitação:

  • Para recuperar a lista de verbas concedidas de uma pessoa (linha 18 da Listagem 1, método retrieveAwardsXML). A solicitação é invocada se a solicitação HTTP GET contiver o nome completo de um proprietário de perfil.
  • Para obter a lista mais atualizada dos tópicos de verbas concedidas a partir de um crawler personalizado e salvá-la em um sistema de arquivos local (linha 13 na Listagem 1, método maintainAwards).

A manutenção é feita quando a solicitação HTTP GET contém a palavra-chave maintenance . Ambas essas solicitações executam o código no crawler personalizado.

Crawler personalizado para executar o HTTP POST

O crawler personalizado é usado para recuperar os dados de um Web site de terceiros, gerando uma solicitação HTTP POST e analisando os dados recuperados. Os dados analisados são armazenados em um sistema de arquivos local na forma de arquivos HTML. A lista de tópicos de verbas concedidas é representada nos arquivos por tabelas HTML nativas. Existe um arquivo HTML exclusivo para cada usuário de Profiles registrado.

Arquivos HTML armazenados localmente são usados de duas maneiras: para extrair palavras-chave dos arquivos com suas frequências associadas, e para exibir o conteúdo dos arquivos usando o widget My Grant Award.

Tivemos de desenvolver um crawler personalizado porque o Content Analytics não suporta crawling de páginas da Web geradas dinamicamente em resposta a formulários HTML enviados.


Servlet My Keywords

Como mencionado na Parte 3: Use Perfis para compartilhar interesses de pesquisa e concessão de verbas, o widget My Keywords tem dois tipos de conteúdo: para fins de visualização pura e para modificar os parâmetros de visualização. De acordo com essa "classificação" implícita, o servlet My Keywords processa todas as solicitações como dois grupos:

  • Solicitações HTTP GET para gerar ou atualizar os dados usados para visualizar os componentes do widget.
  • Solicitações HTTP POST para modificar os parâmetros usados para gerar esses dados.

Manipulador de solicitação GET

A interface do servlet My Keywords tem a sintaxe para manipular solicitações HTTP GET, como mostrado na Listagem 2.

Listagem 2. Interface do servlet My Keywords para a solicitação HTTP GET
{path_to_servlet}?investigator=<string>
 [&threshold=<integer>]
 [&extract_from=<comma-separated strings>]
 [&compare_with=<string>]

De acordo com a interface, o único parâmetro obrigatório transferido para o servlet é investigator=<string> que, de modo similar ao servlet My Grant Awards, especifica o nome para um proprietário de perfil. Outros parâmetros são opcionais, como delineado abaixo.

Parâmetros opcionaisRole
extract_from=<comma-separated strings>Para determinar as fontes da Web usadas para a extração de palavras-chave. Por padrão, apenas tópicos de verbas concedidas são utilizados para extração.
threshold=<integer>Para determinar o limite mínimo de frequência da ocorrência de uma palavra-chave. Por exemplo, se o limite for igual a 2, threshold=2 é transferido juntamente com outros parâmetros para o servlet. Nesse caso, nenhuma palavra-chave que ocorre no texto analisado pelo IBM Content Analytics menos de duas vezes será incluída na lista com palavras-chave e frequências.
compare_with=<string>Para determinar o nome da pessoa que é outro proprietário de perfil. As palavras-chave extraídas para essa pessoa devem ser comparadas a palavras-chave extraídas para uma pessoa atualmente conectada ao aplicativo Profiles, de modo que palavras idênticas em ambos os perfis possam ser destacadas.

Manipulador de solicitação POST

O servlet My Keywords aceita os parâmetros mostrados na a Listagem 3 para manipular a solicitação HTTP POST.

Listagem 3. Interface do servlet My Keywords para a solicitação HTTP POST
investigator=<string>
 updated_stopwords_list=<comma-separated strings>
 terms_sources=<comma-separated strings>

Todos os parâmetros são obrigatórios, como mencionado abaixo.

Parâmetros obrigatóriosRole
investigator=<string>Para identificar um proprietário de perfil.
updated_stopwords_list=<comma-separated sub-strings>Para identificar palavras comuns definidas pelo usuário a serem usadas para filtrar palavras-chave indesejadas.
terms_sources=<comma-separated sub-strings>Para identificar as fontes atualizadas a usar para a extração de palavras-chave. Os valores possíveis para esse parâmetro podem ser qualquer cadeia de caractere construída de subcadeias grants e publications , separadas por um sinal de “,” (vírgula).

Implementação de servlet

4 mostra o código de origem Java para a implementação do método doGet para o servlet My Keywords. Na Listagem 4:

  • Linhas 2 a 7: São para a inicialização das variáveis atribuídas de acordo com os valores dos parâmetros recebidos com a solicitação HTTP GET.
  • Linha 8: O mapa de hash termsFrequencyMap é usado para armazenar palavras-chave (ou termos) com sua frequência de ocorrência extraída do texto.
  • Linha 13: O servlet gera uma resposta na forma de texto formatado em XML.
  • Linhas 15 a 24: Implementam o mecanismo para inicializar as palavras comuns definidas para serem usadas para filtrar termos indesejados, e a lista de fontes a serem utilizadas para extração de termos.
  • Linhas 26 a 45: Implementam a interação de funções do lado do servidor com o IBM Content Analytics, encapsulada pela classe CcaAnalyzer de método único. Os detalhes da implementação da classe são discutidos abaixo.
  • Linhas 32 a 37: Representam um caso em que tópicos de verbas concedidas foram selecionados entre outras fontes para extrair os termos e suas frequências.

    É usado um prefixo de unique resource identifier (URI) específico para chamar o método getTermsAndFreqs (linhas 33, 35). Esse prefixo de URI, combinado a um nome de arquivo criado a partir da variável principalInvestigator , é usado pelo IBM Content Analytics para acessar os documentos analisados. O prefixo de URI garante que o IBM Content Analytics use resultados de análise de tópicos de verbas concedidas durante a extração de termos. Assim que os termos com suas frequências são extraídos do texto, termsFrequencyMap é atualizado. Essa parte do código de origem é omitida da Listagem 4 (linha 36).

Listagem 4. Servlet My Keywords, implementação 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 }

Os termos e suas frequências são extraídos de fontes diferentes, como mostrado nas linhas 38-45 acima. O código de origem que representa a extração de termos de diferentes fontes é quase idêntico ao código mostrado nas linhas 33-36, por isso, não está incluído na listagem.

Assim que a extração de termos e as frequências de diferentes fontes for concluída (linha 46 na 4), a saída é atualizada para incluir os pares de termos extraídos e suas frequências.

O widget Dojo Tag Cloud, que faz parte do widget My Keywords usa a fonte JSON para renderizar o conteúdo do widget. Assim, os termos com suas frequências em formato JSON são incluídos na resposta do servlet My Keywords (linha 47 na 4).

API do IBM Content Analytics e código para extração de frequência de termos

A Listagem 5 mostra uma versão simplificada do código de origem Java para o método getTermsAndFreqs , que representa o núcleo da implementação de classe CcaAnalyzer . Uma instância dessa classe é usada pelo servlet My Keywords, como mostrado na 4 nas linhas 27, 28, 29 e 35. Um exemplo da invocação do método getTermsAndFreqs é mostrado na linha 35 da listagem 4.

Listagem 5. Código de origem simplificado para a implementação 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 }

O operadorgetTermsAndFreqs da A Listagem 5 aceita os seguintes argumentos como parâmetros de entrada:

  • String uriPrefix: Contém a primeira parte do URI de origem do documento, que será utilizada para extração de termos e frequências a partir do documento.
  • String normalizedName: Contém o nome completo da pessoa cujo perfil é observado atualmente, normalizado no sentido de que todos os espaços em branco entre o primeiro nome, nome do meio e sobrenome foram substituídos por sinais de "+" (mais).
  • Set<String> stopWords: Contém todas as palavras comuns, para refinar os resultados da extração de termos, filtrando as palavras que residem no conjunto stopWords .

Um caminho para o arquivo de configuração configPath é inicializado antes da invocação de getTermsAndFreqs , e durante a fase de inicialização do analisador do IBM Content Analytics (linha 29 na 4). A mesma fase inicializa a variável collectionID (usada na linha 8, A Listagem 5). CollectionID define a coleção de documentos do IBM Content Analytics que será usada durante a extração de palavras-chave. Cada recurso tem um URI.

Como mostrado A Listagem 5, implementar o método getTermsAndFreqs inicia com a instanciação de classe FetchServiceFactory da variável fetchFactory (linhas 2 e 3). O operadorfetchFactory é usada para instanciar:

  • com.ibm.siapi.common.ApplicationInfo interface (linha 6), usada para fins de autenticação e controle de acesso, para verificar o acesso a coleções do IBM Content Analytics.
  • com.ibm.es.fetch.FetchService interface (linha 7), que contém serviços genéricos de busca e também é usado para criar uma instância de Buscador (linha 8).
  • com.ibm.es.fetch.SummaryRequest interface (linha 12) usada para realmente buscar um recurso identificado por seu URI (linhas 13 e 14).

As linhas 4 e 5 da A Listagem 5 ilustram a instanciação da classe java.util.Properties usada para fazer o upload das opções de configuração do IBM Content Analytics a partir do sistema de arquivos local. fetchService é criado usando essa instanciação inicializada (a instância de classe Properties de config na linha 7).

Assim que um resumo de recursos não vazios é obtido por meio de uma solicitação de resumo pré-criada como fluxo de entrada (linha 14), é então processado para:

  • Recuperar termos.
  • Determinar suas frequências a partir do resumo de recurso.
  • Retornar uma resposta a quem faz a chamada na forma de cadeia de caractere Java (linhas 15 a 29).

O resumo do recurso é formatado usando a MIning Markup Language (MIML) com tags XML. O processamento do resumo de recurso continua com a análise do fluxo de entrada usando SAXparser (linhas 19-21 na A Listagem 5). A análise é seguida pela criação subsequente da instância de classe com.ibm.es.takmi.document.Document (chamada de mimlDoc, linha 22), usada para recuperar termos com suas frequências associadas e retornadas como cadeia de caractere (linhas 24 e 25).

A Listagem 6 mostra mais detalhes do processo de extração de termos e frequências. O código Java de amostra usa três pacotes com.ibm.es.takmi.impl.* para processar documentos XML formatados em MIML.

Listagem 6. Método auxiliar para extrair termos e suas frequências
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 }

O código na A Listagem 6 implementa uma passagem de todos os elementos incluídos no documento MIML. Cada elemento tem constituintes extraídos do texto. Nos casos em que o constituinte representa uma palavra (linha 11), o elemento é analisado adicionalmente. A filtragem de palavras comuns é aplicada (linhas 13-15), e as frequências de palavras (também chamadas de frequências de palavras-chave ou termos) são calculadas usando Java HashMap (linhas 16-21).


Configuração do IBM Content Analytics

Esta seção se aprofunda nos detalhes de configuração do IBM Content Analytics, que permite a análise de conteúdo de texto não estruturado. No exemplo, o conteúdo do texto será extraído a partir de diversas fontes da Web.

A configuração do IBM Content Analytics abrange várias coleções de analítica de texto (ou corpora, para os profissionais de mineração de texto). As coleções suportam pesquisa e diversos recursos de mineração de texto, como:

  • Capacidade de explorar as correlações ou desvios nos dados.
  • Exportar os resultados da análise para aplicativos de armazém de dados ou de inteligência de negócios.

Os dados são recuperados para uma coleção por um ou mais crawlers que coletam documentos de origens de dados, de forma contínua ou de acordo com um cronograma predefinido. Os dados recuperados são então passados por um pipeline de analítica que inclui análise, indexação, análise linguística e análise personalizada de cada documento obtido por crawling.

Neste artigo, as coleções de análise de texto de exemplo usam dois tipos de crawlers:

  • O crawler do sistema de arquivos local, configurado para coletar os dados armazenados localmente.
  • O Web crawler, configurado para coletar publicações do Web site do PLoS Biology Journal.

Ambos os tipos de crawlers são tratados em mais detalhes à frente.

Crawler personalizado para recuperar tópicos de projetos concedidos

Os tópicos de verbas concedidas de um usuário do Profiles vêm do Web site TAGGS, são armazenados localmente e obtidos por crawling por meio de um crawler do sistema de arquivos local do Content Analytics. O site TAGGS permite recuperar os dados enviando um formulário de pesquisa, de modo que é necessário executar crawling em uma página gerada dinamicamente. O IBM Content Analytics não tem recursos para executar crawling nesse tipo de página. Nosso aplicativo de extensão do Profiles aplica uma solução alternativa com base em um crawler personalizado para páginas da Web geradas dinamicamente.

O crawler personalizado é implementado pela classe Java GAManager (gerenciador de concessões de verbas) e várias classes auxiliares. Na implementação de servlet do widget My Grant Awards, na Listagem 1 existem dois tipos diferentes de processamento de solicitação HTTP GET: um para a manutenção de concessões de verbas para uma única pessoa, e outro para a manutenção de concessões para todas as pessoas cadastradas de uma vez. O processamento das solicitações termina por meio de duas chamadas diferentes dentro do escopo de doGet:

GAMaintenanceStatus st = mgr.maintainAwards(db2Connection);

e

grantsXml += mgr.retrieveAwardsXML(principalInvestigator);

Nos fragmentos de código acima, a instância da classe GAManager (variável mgr ) é o manipulador para trabalhar com o crawler personalizado desenvolvido. Ele é inicializado durante a inicialização do servlet My Grant Awards.

GAManager GAManager

na Listagem 7 mostra uma implementação de alto nível da classe GAManager de método único. O operadorGAManager aceita dois parâmetros de cadeia de caractere:

  • O primeiro parâmetro de cadeia de caractere contém a URL do servidor do LDAP. Esse servidor é usado para autenticar todos os usuários de Profiles cadastrados. GAManager usa o servidor para recuperar a lista de todos os nomes completos dos usuários cadastrados.
  • O segundo parâmetro de cadeia de caractere contém o caminho para a pasta do sistema de arquivos local, usada para armazenar os dados recuperados do Web site TAGGS ― um arquivo por usuário do Profiles.
Listagem 7. Implementação de alto nível da classe GAManager de classe
public class GAManager {
 public GAManager(String ldapURL, String awardsFolder) {...}
 public String retrieveAwardsXML(String userName) {...}
 public GAMaintenanceStatus maintainSingleAward(String userName) {...}
 public GAMaintenanceStatus maintainAwards(Connection db2Connection) {...}
 }

In na Listagem 7, os seguintes métodos são usados.

retrieveAwardsXml
Com um nome de usuário do Profiles, esse método realiza a manutenção da lista de concessões de verbas do usuário em termos de conteúdo de arquivo HTML armazenado localmente. Depois, ele converte os dados HTML em XML e os retorna a quem faz a chamada. Dependendo do status atual do arquivo HTML (por exemplo, o arquivo talvez não exista), buscar o HTML de concessões na Web pode ser invocado implicitamente.

retrieveAwardsXml aceita o nome completo do usuário do Profiles como parâmetro, e chama o método maintainSingleAward .

maintainSingleAward
Com um nome de usuário do Profiles, esse método realiza a manutenção da lista de concessões de verbas de perfil em termos de um único arquivo HTML armazenado localmente para um usuário. Dependendo do status atual do arquivo HTML (o arquivo talvez não exista ou esteja desatualizado), buscar o HTML de concessões na Web é invocado aqui.

maintainSingleAward aceita o nome completo do usuário do Profiles como parâmetro e retorna o status de uma tentativa de executar a manutenção. O status é um dos seguintes:

  • SUCCESS - a manutenção foi executada com êxito.
  • INPROGRESS - outro encadeamento de manutenção para essa pessoa está em andamento, de modo que a manutenção não foi executada.
  • ERRO - ocorreu um erro interno durante a manutenção.
maintainAwards
Executa a manutenção dos dados de concessão de verbas para todos os usuários do Profiles. Primeiro, ele recupera as entradas de usuário cadastrados do LDAP e as usa como chaves para recuperar o nome completo dos usuários a partir do DB2 utilizando consultas SQL. maintainAwards chama então o método maintainSingleAwards para todos os usuários cadastrados. maintainAwards aceita um parâmetro Conexão , que representa uma conexão com um banco de dados DB2.

Buscar dados no TAGGS

A busca de dados no Web site TAGGS é feita por meio da classe auxiliar GAWebFetcher , que o GAManager usa. Uma versão simplificada do método principal usado pelo GAWebFetcher para buscar o HTML de concessões de verbas é mostrada na Listagem 8.

Listagem 8. Implementação do método 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 }

A seção HTML buscada no Web site TAGGS está equipada com componentes HTML gerados artificialmente, como um cabeçalho que representa um nome de corpo docente (linha 3, Listagem 8).

Para buscar dados HTML de concessão de verbas na página de pesquisa avançada do TAGGS, é preciso gerar uma solicitação HTTP POST. Ela inclui parâmetros de solicitação com os valores que representam os detalhes do que precisa ser recuperado. Com exceção do sobrenome do investigador, os dados passados junto com as solicitações HTTP POST são idênticos para todas as pessoas.

O código das linhas 4 a 7 da Listagem 8 é usado para preencher uma solicitação HTTP POST com parâmetros significativos. Observe que o parâmetro grants referrer , com seu valor, deve estar presente na solicitação HTTP POST dirigida à página de pesquisa avançada do TAGGS, a fim de obter uma resposta válida dessa página. Essencialmente, a implementação dos métodos fillParameters e setAdvancedSearchDefaults serve para incluir/inicializar parâmetros do objeto instanciado a partir da classe org.apache.commons.httpclient.methods.PostMethod , como segue.

postMethod.addParameter(key, parameterValue);

As linhas 10 a 18 da Listagem 8 mostram como o objeto postMethod é usado para invocar a execução da solicitação HTTP POST. Assim que a solicitação HTTP POST é executada, a resposta pode ser recuperada, como mostrado na linha 23:

hápostMethod.getResponseBodyAsStream();

Crawlers integrados ao IBM Content Analytics

Como mencionado, usamos apenas dois dos muitos tipos de crawlers do IBM Content Analytics. Os seguintes são exemplos de configuração da vida real para cada tipo de crawler.

Configuração de crawler do sistema de arquivos local
O crawler do sistema de arquivos local é configurado para recuperar os arquivos que residem na pasta de sistema de arquivos predefinida do Windows (mencionada em Crawler personalizado para recuperar tópicos de projetos concedidos, , GAManager , detalhes desse construtor, na Listagem 7). Os arquivos HTML recuperados pelo crawler personalizado usando uma solicitação HTTP POST são armazenados nessa pasta e ficam disponíveis para o crawler do sistema de arquivos do Windows para o IBM Content Analytics.

O crawler do sistema de arquivos local é configurado para trabalhar com uma única pasta, e para recuperar apenas os arquivos do tipo HTML nessa pasta. Essa configuração garante que apenas os arquivos HTML adequados, que contêm tópicos de verbas concedidas para um usuário do Profiles, sejam analisados pelo IBM Content Analytics.

Como benefício adicional, os resultados da análise de cada pessoa podem ser recuperados posteriormente por meio de um URI exclusivo que combine o caminho ao arquivo HTML com os tópicos de verbas concedidas.

Configuração de Web crawler: PLoS Biology Journal
O Web crawler é configurado para recuperar resumos de artigos na PLoS Biology, edição de maio de 2010, usando o Web site da PLoS Biology. O Web site oferece um catálogo estruturado de artigos com materiais relacionados (como resumos de artigos, citações de artigos, e assim por diante).

Para obrigar o crawler a recuperar apenas os resumos de artigos com URLs das páginas da edição de maio de 2010, e para evitar que o crawler execute crawling em qualquer outro documento, foram usadas as seguintes regras de crawling.

URL de início:

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

Regras de domínio:

allow domain www.plosbiology.org
forbid domain *

Regras de prefixo 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 *

Usando regras de domínio, quase todas as URLs não relacionadas, como anúncios em banners ou links para revistas eletrônicas parceiras, são filtradas. As regras do espaço de crawl, ou seja, domínio ou prefixo, são aplicadas na base de “primeira a chegar, primeira a ser aplicada”. De acordo com as regras de domínio acima, o IBM Content Analytics primeiro permite que o domínio www.plosbiology.org seja analisado por crawling e depois proíbe essa atividade em outros domínios.

As regras de prefixo HTTP executam ajuste fino no crawl space de modo que o crawling seja executado primeiro na página da Web, seguida por artigos na página, enquanto outras URLs ficam proibidas para crawling.


Conclusão

Este artigo discutiu a implementação de uma UI com base no IBM Lotus Connections Profiles. A UI foi ampliada com um pacote de widgets baseado em iWidget para suportar a recuperação, análise e visualização de dados não estruturados. (A Parte 3 explorou o lado do cliente.)

As funções do lado do servidor foram integradas ao IBM Content Analytics para analisar conteúdo da Web não estruturado. Os resultados da análise foram usados para exibir o conteúdo dos widgets de uma forma amigável e útil.

Usando um exemplo realista, este artigo demonstrou o valor da integração do IBM Lotus Connections ao IBM Content Analytics.

Recursos

Aprender

Obter produtos e tecnologias

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Segmentos de mercado, Lotus
ArticleID=646939
ArticleTitle=Colaboração Mais Inteligente para o Segmento de Mercado de Educação Usando o Lotus Connections, Parte 4: Usar o IBM Content Analytics para efetuar crawl, analisar e exibir dados não estruturados
publish-date=08312012