Организация интеллектуальной совместной деятельности в сфере образования с использованием Lotus Connections: Часть 4. Использование IBM Content Analytics для сканирования, анализа и отображения неструктурированных данных

В статье продолжается создание примера приложения, которое дополняет страницы IBM Lotus® Connections Profiles информацией о направлениях научных исследований и полученных грантах. Неструктурированные исходные данные собираются и сохраняются в коллекции анализа текстов. Вы познакомитесь с реализацией пользовательских виджетов на стороне сервера и с тем, как они используют IBM Content Analytics для анализа. Вы также создадите специальный поисковый робот. При помощи Lotus Connections и IBM Content Analytics можно сканировать, анализировать и отображать неструктурированные данные.

Карл Осипов, архитектор ПО, IBM

Карл Осипов (Carl Osipov) - архитектор ПО, подразделениe стратегий и технологий IBM Software Group. Обладает большим опытом в области распределенных вычислений, разработке приложений по распознаванию живой речи и компьютерной обработке естественного языка. Имеет ряд публикаций и выступлений по вопросам Сервис-ориентированной архитектуры и управлением разпознования речи перед образовательской и бизнес аудиторией. На данный момент он в основном занимается проектированием технологий повторного использования для составных бизнес-сервисов.



Илья Афанасьев, инженер-программист, IBM

Илья Афанасьев (Ilya Afanasiev) - фотографияИлья Афанасьев (Ilya Afanasiev) - инженер-программист, имеющий более 7 лет опыта успешной работы и богатый набор навыков в различных областях, включая исследования, разработку, поддержку и обеспечение качества программного обеспечения. Поступил на работу в IBM в 2007 году в качестве программиста систем z/OS в российской лаборатории систем и технологий. В настоящее время основное внимание уделяет разработке и созданию прототипов пользовательских Web-интерфейсов, поиску информации и разработке Java EE-приложений. Интересуется глубинным анализом текста и анализом неструктурированного текста.



21.11.2011

Введение

В части 3 данной серии, Использование Profiles для предоставления широкого доступа к информации о направлениях исследований и полученных грантах, рассказывалось, как дополнить страницы IBM Lotus® Connections Profiles информацией о направлениях научных исследований пользователей и полученных ими грантах. Наш пример приложения продемонстрировал, как собирать и сохранять исходные данные в коллекции анализа текстов. Пользовательский интерфейс был создан с помощью виджетов и Lotus Connections. Взаимодействие приложения с пользователем поддерживалось на уровне представления архитектуры – т.е. на Web-уровне.

Эта статья дополняет пример расширения приложения Profiles и его концептуальные уровни: Web-уровень, бизнес-уровень, уровень интеграции и уровень данных. Вы научитесь интегрировать серверные функции с IBM Content Analytics для анализа неструктурированного Web-контента.

Расширение приложения Profiles состоит из двух основных частей:

Java™ EE-приложение
Приложение Java Enterprise Edition (Java EE) развертывается на WebSphere Application Server как EAR-файл. Функции Java EE-приложения, также именуемые серверными функциями, включают в себя:
  • Два Java-сервлета, которые обрабатывают запросы, генерируемые виджетами My Grant Awards и My Keywords. Оба сервлета генерируют ответы в XML-формате.
  • Специальный поисковый робот, работающий со страницей расширенного поиска сайта системы отслеживания и отчетности по грантам правительства США (TAGGS) и генерирующий HTTP-запросы POST для извлечения списка грантов, полученных каким-либо исследователем.
  • Функции анализа неструктурированного текста, взаимодействующие с автономным приложением Content Analytics посредством Java API. Эти функции используются Java-сервлетами для получения результатов анализа неструктурированного текста, выполняемого Content Analytics.
IBM Content Analytics
Продукт предоставляет возможности сканирования, разбора, индексирования, поиска и анализа неструктурированного текста. Хотя Content Analytics предоставляет ряд возможностей для сложного анализа текста, в статье основное внимание уделяется простому анализу частоты встречаемости терминов. При написании статьи авторы использовали IBM Content Analytics версии 2.1, функции которой предоставляются Java EE-приложению через интерфейс Content Analytics Java API. Начиная с версии 2.2 IBM Content Analytics также предоставляет удобные REST-интерфейсы для взаимодействия со своими функциями.

На рисунке 1 показана последовательность обработки данных для получения названий грантов при помощи виджета My Grant Awards. На нем также показана последовательность извлечения ключевых слов и соответствующей частоты их встречаемости при помощи виджета My Keywords. Виджеты My Grant Awards и My Keywords подробно описаны в части 3 (EN) данной серии.

Рисунок 1. Последовательность обработки данных
Рисунок 1. Последовательность обработки данных

Серверные функции

Серверные функции виджетов My Keywords и My Grant Awards реализованы с использованием технологии Java Servlet. Виджеты обращаются к серверным функциям, направляя HTTP-запросы GET или POST к сервлетам. Затем сервлеты генерируют ответы в XML-формате.

Виджеты My Grant Awards и My Keywords используют специальный поисковый робот для получения названий предоставленных грантов со сторонних Web-сайтов. Как показано на рисунке 1, сервлеты используют полученную информацию двумя способами:

  • для извлечения названий грантов посредством сервлета My Grant Awards;
  • для анализа названий грантов при помощи Content Analytics с целью получения ключевых слов и соответствующих частот их встречаемости для последующего извлечения сервлетом My Keywords.

Сервлет My Keywords использует средство анализа Content Analytics для двух видов источников текста:

  • названий исследовательских грантов, полученных с Web-сайта TAGGS;
  • статей, полученных с Web-сайта журнала Biology Journal Публичной научной библиотеки (Public Library of Science - PLoS).

Оба источника содержат неструктурированный текстовый контент.


Сервлет My Grant Awards

Виджет My Grant Awards отображает список названий грантов, полученных владельцем профиля. В нашей статье сервлет My Grant Awards принимает только один параметр: идентификатор пользователя, чей профиль отображается на странице профилей. Для простоты в оставшейся части статьи в качестве идентификатора мы будем использовать полное имя владельца профиля.

Ниже приведен интерфейс сервлета My Grant Awards.

{path_to_servlet}?investigator=<string>

Реализация сервлета

Исходный Java-код в листинге 1 реализует метод doGet сервлета My Grant Awards. Сервлет 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 /* ... обработать условие ошибки ... */
9 } else if(principalInvestigator == null || principalInvestigator == ") {
10 /* ... обработать условие ошибки ... */
11 } else {
12 if(principalInvestigator.equals("maintenance")) {
13 GAMaintenanceStatus st = mgr.maintainAwards(db2Connection); 
14 switch(st) {
15 /* ...изменить строку grantsXml согласно статусу обработки...*/
16 }
17 } else {
18 grantsXml += mgr.retrieveAwardsXML(principalInvestigator);
19 }
20 }
21 } catch(Exception e) {
22 /* ... обработать любую исключительную ситуацию ... */
23 } finally {
24 /* ... обновить ответ сервлета в любом случае ... */
25 }
26 }

Все имена пользователей Profiles хранятся в таблице базы данных DB2, используемой на серверной стороне приложения Profiles. Для получения доступа к таблице сервлет My Grant Awards использует DB2-соединение с именем переменной db2Connection, как показано в строках 7 и 13 листинга 1.

Сервлет может обрабатывать запросы двух видов:

  • Извлечение списка предоставленных исследователю грантов (строка 18 в листинге 1, метод retrieveAwardsXML). Запрос выполняется, если HTTP-запрос GET содержит полное имя владельца профиля.
  • Получение наиболее актуального списка названий грантов от специального поискового робота и сохранение его в локальной файловой системе (строка 13 в листинге 1, метод maintainAwards).

Сохранение выполняется, если HTTP-запрос GET содержит ключевое слово maintenance. Оба запроса выполняют код специального поискового робота.

Специальный поисковый робот для выполнения HTTP-запроса POST

Специальный поисковый робот предназначен для извлечения данных из сторонних Web-сайтов путем выполнения HTTP-запроса POST и анализа полученных данных. Проанализированные данные хранятся в локальной файловой системе в виде HTML-файлов. Список названий грантов представлен в файлах в виде таблиц, оформленных в HTML. Каждому зарегистрированному пользователю Profiles соответствует уникальный HTML-файл.

Хранящиеся локально HTML-файлы используются в двух целях: для извлечения из этих файлов ключевых слов и соответствующей частоты их встречаемости, а также для отображения содержимого этих файлов при помощи виджета My Grant Award.

Нам пришлось разработать специальный поисковый робот, потому что Content Analytics не поддерживает сканирование Web-страниц, сгенерированных динамически в ответ на отправленные HTML-формы.


Сервлет My Keywords

Как говорилось в Части3: Использование Profiles для предоставления широкого доступа к информации о направлениях исследований и полученных грантах, виджет My Keywords поддерживает два вида контента: для целей чистой визуализации и для модификации параметров визуализации. В соответствии с такой неявной классификацией все обрабатываемые сервлетом My Keywords запросы делятся на две группы:

  • HTTP-запросы GET для создания или обновления данных, используемых для визуализации компонентов виджета.
  • HTTP-запросы POST для изменения параметров, используемых для создания этих данных.

Обработчик запросов GET

Синтаксис интерфейса сервлета My Keywords для обработки HTTP-запросов GET показан в листинге 2.

Листинг 2. Интерфейс сервлета My Keywords для HTTP-запроса GET
{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>Определение Web-источников, используемых для извлечения ключевых слов. По умолчанию извлекаются только названия грантов.
threshold=<integer>Определение минимального порога частоты встречаемости ключевых слов. Например, если порог равен 2, в сервлет вместе с другими параметрами передается threshold=2. В таком случае все ключевые слова, которые встречаются в тексте, анализируемом IBM Content Analytics, менее двух раз, не будут включены в список ключевых слов и частот их встречаемости.
compare_with=<string>Определение имени пользователя, являющегося владельцем другого профиля. Ключевые слова, извлеченные для данного пользователя, сравниваются с ключевыми словами, извлеченными для пользователя, вошедшего в приложение Profiles, чтобы можно было выделить общие для обоих профилей слова.

Обработчик запросов POST

Для обработки HTTP-запросов POST сервлет My Keywords принимает параметры, показанные в листинге 3.

Листинг 3. Интерфейс сервлета My Keywords для HTTP-запроса POST
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>Идентификация измененных источников для получения ключевых слов. Значением этого параметра может быть любая строка, составленная из подстрок grants и publications, разделенных знаком "," (запятая).

Реализация сервлета

В листинге 4 показан исходный Java-код реализации метода doGet сервлета My Keywords. Содержимое листинга 4:

  • Строки 2-7: инициализация переменных, которым присваиваются значения параметров, полученных при помощи HTTP-запроса GET.
  • Строка 8: использование хэш-карты termsFrequencyMap для хранения ключевых слов (или терминов) и частот их встречаемости в тексте.
  • Строка 13: ответ сервлета в виде текста в XML-формате.
  • Строки 15-24: реализация механизма инициализации набора стоповых слов, которые будут использоваться для исключения нежелательных терминов и получения списка источников для извлечения терминов.
  • Строки 26-45: реализация взаимодействия серверных функций с IBM Content Analytics, инкапсулированная в классе CcaAnalyzer. Подробности реализации класса обсуждаются ниже.
  • Строки 32-37: вариант отбора названий грантов в числе других источников для извлечения терминов и частот их встречаемости.

    Для вызова метода getTermsAndFreqs (строки 33, 35) используется уникальный префикс идентификатора источника (URI). IBM Content Analytics использует URI-префикс вместе с именем файла из переменной principalInvestigator при обращении к анализируемым документам. URI-префикс гарантирует, что во время извлечения терминов IBM Content Analytics будет использовать результаты анализа названий грантов. После извлечения из текста терминов и частоты их встречаемости выполняется обновление 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) { /*... обработка исключительных ситуаций ...*/ }
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 /*... код обновления termsFrequencyMap опущен ...*/
37 }
38 if(usedSources.contains(OTHER_POSTS)) {
39 String uriPrefix = OTHER_URI_PREFIX;
40 /* код аналогичен блоку AWARDS_SOURCES*/
41 }
42 if(usedSources.contains(JOURNAL_ARTICLES)) {
43 String uriPrefix = JOURNAL_ARTICLES_URI_PREFIX;
44 /* код аналогичен блоку AWARDS_SOURCES*/
45 }
 
46 /* замена выходных данных на XML-секцию, описывающую
извлеченные термины и частоту их встречаемости. */
 
47 String cloudJson = getCloudJSON(principalInvestigator,personToCompareWith); 
48 /* код, добавляющий XML-секцию с JSON для использования с виджетом Tag Cloud */
49 } catch (Exception e) { /* ... обработка исключительных ситуаций ... */ 
50 } finally {
51 /* ... код завершения XML-разметки / создания ответа опущен ... */
52 }
53 }

Термины и частоты их встречаемости извлекаются из разных источников (как показано ниже в строках 38-45). Исходный код извлечения терминов из разных источников почти идентичен коду в строках 33-36, поэтому он не включен в листинг.

После извлечения из разных источников терминов и частот их встречаемости (строка 46 в листинге 4) выходные данные заменяются парами извлеченный термин - частота встречаемости.

Dojo-виджет Tag Cloud, входящий в состав виджета My Keywords, использует для визуализации содержимого JSON. Поэтому термины и частоты их встречаемости включаются в ответ сервлета My Keywords в JSON-формате (строка 47 в листинге 4).

Интерфейс IBM Content Analytics и код для извлечения частоты встречаемости терминов

В листинге 5 показан упрощенный вариант исходного Java-кода для метода getTermsAndFreqs, являющегося ядром реализации класса CcaAnalyzer. Экземпляр этого класса используется сервлетом My Keywords, как показано в строках 27, 28, 29 и 35 листинга 4. Пример вызова метода getTermsAndFreqs показан в строке 35 листинга 4.

Листинг 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; 
 /* [пропущено]: 
 создание строки, заполняемой содержимым входного потока in */
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>; //возврат пустой карты
28 }
29 }
30 }

В листинге 5 метод getTermsAndFreqs в качестве входных параметров принимает следующие аргументы:

  • String uriPrefix: содержит первую часть URI источника документа, используемого для извлечения терминов и частот их встречаемости из документа.
  • String normalizedName: содержит полное имя пользователя, чей профиль просматривается в данный момент; все пробелы между именем, отчеством и фамилией заменяются знаком "+" (плюс).
  • Set<String> stopWords: содержит все стоповые слова для уточнения результата извлечения терминов путем исключения слов, принадлежащих набору stopWords.

Путь к файлу конфигурации configPath инициализируется до вызова getTermsAndFreqs на стадии инициализации анализатора IBM Content Analytics (строка 29 в листинге 4). На этой же стадии инициализируется переменная collectionID (строка 8 в листинге 5). CollectionID определяет коллекцию документов IBM Content Analytics, используемых при извлечении ключевых слов. Каждый источник имеет URI.

Как показано в листинге 5, реализация метода getTermsAndFreqs начинается с переменной fetchFactory создания экземпляра класса FetchServiceFactory (строки 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).

В строках 4 и 5 листинга 5 показано создание экземпляра класса java.util.Properties, используемого для загрузки параметров конфигурации IBM Content Analytics из локальной файловой системы. Интерфейс fetchService создается с использованием этого проинициализированного экземпляра класса (config экземпляра класса Properties в строке 7).

После получения непустого резюме источника при помощи предварительно созданного запроса резюме как потока ввода (строка 14), оно обрабатывается с целью:

  • извлечения терминов;
  • определения частот их встречаемости в резюме источника;
  • возвращения ответа вызывающей программе в виде Java-строки (строки 15-29).

Резюме источника оформляется на языке Mining Markup Language (MIML) с XML-тегами. Обработка резюме источника выполняется путем анализа входного потока с использованием SAXParser (строки 19-21 в листинге 5). В результате анализа создается экземпляр класса com.ibm.es.takmi.document.Document (под именем mimlDoc, строка 22), который используется для извлечения терминов и соответствующих частот их встречаемости, возвращаемых в виде строки (строки 24 и 25).

В листинге 6 процесс извлечения терминов и частот их встречаемости показан более подробно. В примере Java-кода для обработки XML-документов в MIML-формате используются три пакета com.ibm.es.takmi.impl.*.

Листинг 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, позволяющего анализировать неструктурированный текст. В примере мы будем извлекать текстовое содержимое из различных Web-источников.

Конфигурация IBM Content Analytics включает в себя несколько коллекций анализа текста (или корпусов на языке профессионалов глубинного анализа текста). Коллекции поддерживают поиск, а также различные возможности глубинного анализа текста, такие как:

  • Возможность выявления взаимосвязей или отклонений в данных.
  • Экспорт результатов анализа в хранилище данных и приложения бизнес-аналитики.

Информация для коллекции поставляется одним или несколькими поисковыми роботами, собирающими документы из источников данных непрерывно или по заданному графику. Затем полученные данные попадают на аналитический конвейер, где выполняется анализ, индексирование, лингвистический анализ и специальный анализ каждого полученного документа.

В примерах коллекций анализа текста нашей статьи используются два вида поисковых роботов:

  • Поисковый робот локальной файловой системы, настроенный на получение данных, хранимых локально.
  • Поисковый Web-робот, настроенный на получение публикаций с Web-сайта журнала Biology Journal библиотеки PLoS.

Оба вида роботов подробно обсуждаются ниже.

Специальный поисковый робот для анализа названий предоставленных грантов

Названия предоставленных пользователю Profiles грантов, полученные с Web-сайта TAGGS, хранятся локально и сканируются поисковым роботом локальной файловой системы Content Analytics. На Web-сайте TAGGS извлечение данных выполняется путем отправки формы поиска, поэтому возникает необходимость сканировать динамически сгенерированные страницы. IBM Content Analytics не имеет средств сканирования таких страниц. В нашем приложении расширения Profiles применяется альтернативное решение на основе специального поискового робота для динамически генерируемых Web-страниц.

Специальный поисковый робот реализуется с помощью Java-класса GAManager (менеджер предоставленных грантов) и нескольких вспомогательных классов. В реализации сервлета виджета My Grant Awards, приведенной в листинге 1, есть два вида обработки HTTP-запроса GET: один для обработки грантов одного пользователя, а другой - для обработки грантов всех зарегистрированных пользователей сразу. Обработка запросов завершается двумя отдельными вызовами в области действия doGet:

GAMaintenanceStatus st = mgr.maintainAwards(db2Connection);

и

grantsXml += mgr.retrieveAwardsXML(principalInvestigator);

В приведенном выше фрагменте кода экземпляр класса GAManager (переменная mgr) - это обработчик для специально разработанного поискового робота. Он инициализируется во время инициализации сервлета My Grant Awards.

Высокоуровневая реализация класса GAManager

В листинге 7 показана высокоуровневая реализация класса GAManager. Конструктор GAManager принимает два строковых параметра:

  • Первый строковый параметр содержит URL LDAP-сервера. Этот сервер используется для аутентификации всех зарегистрированных пользователей Profiles. GAManager использует этот сервер для извлечения списка полных имен всех зарегистрированных пользователей.
  • Второй строковый параметр содержит путь к каталогу локальной файловой системы, который используется для хранения данных, полученных с Web-сайта 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-данных по Интернету.

retrieveAwardsXml принимает полное имя пользователя Profiles в качестве параметра и возвращает статус попытки выполнения обработки. Статус принимает одно из следующих значений:

  • SUCCESS - обработка успешно выполнена.
  • INPROGRESS - для данного пользователя выполняется другой процесс обработки, поэтому обработка не выполнена.
  • ERROR - при обработке произошла внутренняя ошибка.
maintainAwards
Выполняет обработку данных предоставленных всем пользователям Profiles грантов. Сначала он извлекает записи зарегистрированных пользователей из LDAP и использует эти записи в качестве ключей для извлечения полных имен из DB2 при помощи SQL-запросов. Затем maintainAwards вызывает метод maintainSingleAwards для всех зарегистрированных пользователей. maintainAwards принимает параметр Connection, представляющий соединение с базой данных DB2.

Получение данных с TAGGS

Получение данных с Web-сайта TAGGS выполняется посредством вспомогательного класса GAWebFetcher, используемого классом GAManager. Упрощенная версия основного метода, используемого GAWebFetcher для извлечения грантов в HTML-формате, показана в листинге 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(); //настройка параметров по умолчанию.
        7 addRequestParameter("sPIName", investigator); //ввод имени параметра.
        8 fillParameters(); //размещение параметров в запросе.
        9 
        10 try {
        11 client.setTimeout(15000);//таймаут 15 секунд
        12 client.executeMethod(postMethod); //выполнение запроса
        13 } catch(Exception e) {
        14 if( e.getMessage().contains("timed out")) {
        15 /* ... уведомление вызывающей программы о таймауте ... */
        16 }
        17 /* ... обработка других исключительных ситуаций ... */
        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 }

В HTML-данные, полученные с сайта TAGGS, добавляются искусственно создаваемые HTML-компоненты, например, заголовок с названием факультета (строка 3, листинг 8).

Для получения HTML-данных со страницы расширенного поиска Web-сайта TAGGS генерируется HTTP-запрос POST. Он содержит параметры, значения которых указывают требования к извлекаемым данным. В HTTP-запросе POST передаются одинаковые для всех пользователей данные, за исключением фамилии исследователя.

Код в строках 4-7 листинга 8 используется для размещения в HTTP-запросе POST значимых параметров. Обратите внимание, что для получения правильного ответа от страницы расширенного поиска TAGGS в HTTP-запросе POST к этой странице должны присутствовать параметр grants referrer и его значение, чтобы получить правильный ответ с этой страницы. По существу реализация методов fillParameters и setAdvancedSearchDefaults состоит в добавлении и инициализации параметров объекта, вызываемого из класса org.apache.commons.httpclient.methods.PostMethod, следующим образом:

postMethod.addParameter(key, parameterValue);

В строках 10-18 листинга 8 показано использование объекта postMethod для инициирования выполнения HTTP-запроса POST. После выполнения HTTP-запроса POST может быть получен ответ, как показано в строке 23:

postMethod.getResponseBodyAsStream();

Встроенные в IBM Content Analytics поисковые роботы

Как уже говорилось, мы используем только два из многих видов поисковых роботов IBM Content Analytics. Ниже приведены примеры реальных конфигураций для обоих видов поисковых роботов.

Конфигурация поискового робота локальной файловой системы
Поисковый робот локальной файловой системы настроен на извлечение файлов из предопределенного каталога файловой системы Windows (см. раздел Специальный поисковый робот для анализа названий предоставленных грантов, описание конструктора GAManager, листинг 7). HTML-файлы, извлеченные специальным поисковым роботом с помощью HTTP-запроса POST, сохраняются в этом каталоге и становятся доступными для поискового робота IBM Content Analytics файловой системы Windows.

Поисковый робот файловой системы настроен на работу только с одним каталогом и на извлечение из этого каталога данных только в HTML-формате. Такая конфигурация гарантирует, что IBM Content Analytics будет анализировать только правильные HTML-файлы, содержащие предоставленные пользователю Profiles гранты.

Дополнительным преимуществом является возможность впоследствии получить результаты анализа для каждого пользователя с помощью уникального URI, соответствующего пути к HTML-файлу с названиями грантов.

Конфигурация поискового Web-робота: журнал Biology Journal библиотеки PLoS
Поисковый Web-робот настроен на извлечение резюме статей из майского выпуска 2010 года журнала Biology Journal на Web-сайте PLoS. Web-сайт предоставляет структурированный каталог статей и связанных с ними материалов (таких как резюме статей, цитаты из статей и т.д.).

Чтобы заставить робота извлекать URL-адреса страниц с резюме статей только за май 2010 года и не допустить сканирования любых других документов, использовались следующие правила:

Начальный 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-адреса, такие как адреса рекламных баннеров или ссылок на Web-журналы партнеров. Правила области сканирования, домена и префикса применяются в порядке поступления. Согласно правилам домена, приведенным выше, IBM Content Analytics сначала разрешает сканирование домена www.plosbiology.org, а затем запрещает сканирование любых других доменов.

Правила HTTP-префикса выполняют тонкую настройку области сканирования, чтобы сначала сканировалась стартовая Web-страница, а затем статьи на странице, в то время как любые другие URL-адреса были запрещены для сканирования.


Заключение

В этой статье мы подробно остановился на реализации пользовательского интерфейса, основанного на IBM Lotus Connections Profiles. Пользовательский интерфейс был дополнен пакетом основанных на iWidget виджетов для извлечения, анализа и визуализации неструктурированных данных. В части 3 описана сторона клиента.

Для анализа неструктурированного Web-контента серверные функции были интегрированы с IBM Content Analytics. Результаты анализа были использованы для отображения содержимого виджетов в удобном дружественном виде.

В статье на реальном примере была продемонстрирована полезность интеграции IBM Lotus Connections и IBM Content Analytics.

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Lotus
ArticleID=776056
ArticleTitle=Организация интеллектуальной совместной деятельности в сфере образования с использованием Lotus Connections: Часть 4. Использование IBM Content Analytics для сканирования, анализа и отображения неструктурированных данных
publish-date=11212011