Практические советы по реализации систем извлечения информации

Показаны сообщения с ярлыком open source. Показать все сообщения
Показаны сообщения с ярлыком open source. Показать все сообщения

четверг, мая 03, 2007

Text Mining Libraries

Один из читателей блога спросил у меня по электронной почте про известные мне библиотеки с реализациями разных алгоритмов IR. В частности его интересовала кластеризация шинглами. Неплохая реализация шинглов на C++ есть в библиотеке ClustBoost.

Вообще хороших библиотек, а тем более open source, не так много. Среди тех с кем мне приходилось сталкиваться можно выделить:

  • GATE — как они пишут про себя это "the Eclipse of Natural Language Engineering, the Lucene of Information Extraction, the leading toolkit for Text Mining". С Lucene, конечно, они себя зря сравнивают. Коротко говоря, GATE это более-менее удобная графическая среда, к которой можно плагинами подключить практически любую библиотеку для обработки текста.
  • ANNIE — распространяется как часть GATE. Включает в себя: токенайзер, sentence splitter, part-of-speech tagger и named entity recogniser. Последний может выделять такие сущности как имена, организации, места, даты, адреса и др. Утверждается что ведутся работы по портированию ANNIE для русского языка.
  • WEKA — в этой библиотеке реализованы многие алгоритмы классификации плюс есть хорошие визуализаторы результатов. Есть wrapper в GATE.
  • MinorThird — позволяет работать с аннотированным текстом, используя эти аннотации можно классифицировать документы с помощью множества реализованных алгоритмов (начиная от k-nn, заканчивая SVM и voted perceptron. Что интересно, в MinorThird помимо обычной supervised классификации есть реализации и semi-supervised алгоритмов.
  • SVMlight — хорошая и быстрая реализация SVM на C. Есть wrapper в GATE.
Буду рад добавлениям в список.

среда, декабря 27, 2006

Nutch и Hadoop, первые впечатления

Давно уже собирался как следует посмотреть на Nutch — open-source поисковый движок на Java — сегодня наконец поставил, буду по-тихоньку делиться впечатлениями.

Nutch построен на основе Hadoop — это фреймворк, реализующий идею MapReduce. Расскажу кратко основную идею. Термины map и reduce пришли из функционального программирования, где они означают следующее: reduce это функция типа α -> β, map — функция типа (α -> β) -> [α] -> [β]. То есть map применяет переданную ей первым аргументом функцию reduce к списку элементов типа α и на выходе получается список элементов типа β. Например, если мы определим функцию square x = x ∗ x, вызов map square[1,2,3] вернет [1,4,9]. Если reduce функция без побочных эффектов (то есть она не изменяет ничего за пределами своей области видимости), то применять ее можно одновременно к нескольким элементам входного списка. Гугловый фреймворк MapReduce позволяет прозрачно для программы разносить эти вычисления по многим машинам. Hadoop представляет собой open-source реализацию этой же идеи на Java.

Итак, исходники скачаны, первое, что необходимо сделать — настроить запуск их среды разработки. Как это сделать для Eclipse описано здесь, перескажу вкратце с одним дополнительным шагом для IDEA.

  1. При создании нового проекта IDEA найдет все папки с исходниками (их там много).
  2. В dependencies надо добавить все *.jar из lib и src/plugin/*/lib. К hadoop-*.jar лучше подключить исходники или (лучше) настроить Hadoop соседним модулем в проекте.
  3. Пометить папку conf как source folder. В настройках компилятора в Resource Patterns добавить ?*.txt, если этого не сделать *.txt файлы из conf, не будут видны в рантайме и Nutch работать не будет.
  4. В nutch-site.xml (или nutch-defaults.xml) прописать свойство plugin.folders как src/plugin
  5. Прописать в defaults VM arguments: -Dhadoop.log.dir=logs -Dhadoop.log.file=hadoop.log
После этого можно попробовать запустить Injector с соответствующими параметрами (см. tutorial), все должно работать.

К сожалению, какая-либо внятная и полная документация по Nutch и Hadoop отсутствует, API также практически не задокументирован, а код не слишком читабелен. Без дебагера разобраться сложно. Плюс эти товарищи повсеместно используют конструкцию, за которую надо просто отрывать руки:

try {
url = urlNormalizers.normalize(url, URLNormalizers.SCOPE_INJECT);
url = filters.filter(url);
} catch (Exception e) {
if (LOG.isWarnEnabled()) { LOG.warn("Skipping " +url+":"+e);
url = null;
}

Если произойдет исключение, то мы увидим только его класс, а stacktrace нам не покажут. Нам даже не скажут на какой строчке какого класса оно произошло. Метод warn у логгера (и все остальные тоже) специально перегружены, чтобы корректно обрабатывать такую ситуацию, достаточно вместо плюса поставить запятую — LOG.warn("Skipping " +url+":", e) — и будет выведен нормальный stacktrace, из которого легко понять что происходит.

В целом же, Nutch работает: качает и ищет. В дальнейших планах написать пару плагинов к нему для особого парсинга скачанных страниц, развернуть его на кластере и разобраться с API Hadoop. Обо всем это, естественно, напишу.