Поиск по блогу

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

воскресенье, 19 октября 2014 г.

Text Analytics HackDay 2014: Хакатон для приложений по обработке текстов и текстовой аналитике

Продолжая славную традицию проведения тематических хакатонов в Казанском федеральном университете (см. мой текст на Хабре о RuSSIR Music Hackathon 2013), мы снова проводим 8 и 9 ноября 2-х дневный марафон, на этот раз посвященный созданию приложений на основе обработки и анализа текстов. Тема, очевидно, перекликается с нашим стартапом textocat.com, который предлагает облачный API текстовой аналитики для работы с текстами на русском языке.

Подробно о мероприятии читайте на официальной странице хакатона.

Приглашаем всех казанских студентов, программистов, дизайнеров, а также энтузиастов из других городов. Количество мест ограничено, спешите регистрироваться, будет интересно!

А пока для затравки посмотрите трейлер предстоящего мероприятия, надеюсь, он вам понравится:)


Madrobots

среда, 8 декабря 2010 г.

Исследовательский инструментарий

Это первый из серии постов о программных средствах или сервисах, используемых мною для различных целей. В этом сообщении привожу обзор программных инструментов, которые упрощают (надеюсь!) повседневную исследовательскую работу.
  1. Программирование
  2. Обработка данных
  3. Анализ данных
  4. Работа с онтологическими моделями
  5. Создание схем данных
  6. Создание научных статей и презентаций
  7. Поиск информации
  8. Структурирование информации

Программирование

После нескольких лет метаний между ведущими средами для Java программирования - IntelliJ IDEA и Eclipse - все-таки остановился на второй. JetBrains тогда еще не выпустил community edition своей среды - это было одним из основных мотивов выбора. Да и с ростом производительности железа, имеющегося под рукой, прежняя медлительность Eclipse как-то перестала замечаться вовсе. А функционально Eclipse представляет собой, как известно, чрезвычайно мощную интегрированную среду разработки. Среди массы полезных плагинов выделю, пожалуй, следующие: Google Plugin (с поддержкой GWT, GAE), интеграция с Maven (импорт проектов, поиск зависимостей) и Subclipse (SVN).



Обработка данных


Для сопутствующих задач, связанных с чтением/трансформацией/записью (extract/transform/load - ETL) данных, использую Pentaho Data Integration CE. Этот кроссплатформенный инструмент содержит удобные средства для редактирования процесса трансформации с помощью графического интерфейса, а также позволяет читать/писать данные, работая с различными форматами (CSV, XML, Excel, СУБД). На рисунке - пример простой трансформации:


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


Анализ данных

Для анализа, связанного с обработкой естественного языка, пожалуй, ведущей платформой является архитектура GATE, основная мощь которой представлена в многочисленных плагинах: чтение данных разных форматов, токенайзеры, стеммеры, POS тэггеры, синтаксические анализаторы, работа с тезаурусом WordNet, онтологиями и много другого. Кроме того, удобный графический интерфейс, унифицированный формат аннотаций и система управления корпусами документов. Конечно, у всей функциональности имеется серьезное смещение в сторону английского языка, но, в принципе, сама по себе архитектура продумана очень гибко.
Для анализа данных средствами машинного обучения использую RapidMiner CE. Это мощное решение с реализацией широкого ряда различных моделей для обучения, тестирования, валидации, визуализации. Также имеется удобный графический интерфейс. Пример дерева процесса:


Некоторые алгоритмы из самых популярных в академическом мире библиотек, таких как Weka и R, также представлены в RapidMiner. Впрочем, указанные фреймворки заслуживают пристального внимания и сами по себе.
Еще одна мощная библиотека - LingPipe. В части компьютерной лингвистики функционал данной библиотеки пересекается с возможностями GATE (неслучайно существует LingPipe плагин для GATE). Но помимо этого, есть реализация и других интересных вещей: вычисление SVD (например, для латентно-семантического анализа), LDA (для задач кластеризации) и др.  Кроме того, поддерживается интересный блог и имеется набор полезных туториалов.


Работа с онтологическими моделями

Для этой цели лучше всего подходит редактор Protege. Среди его возможностей, поддерживаемых различными плагинами: просмотр/редактирование онтологий основных форматов (OWL, RDFS), загрузка механизмов логического вывода (DL reasoner), визуализация, редактирование правил логического вывода. Пример отображения иерархии классов:




Создание схем данных

Для визуализации графовых структур очень подходит язык DOT. Кстати, его используют в основе некоторые из уже приведенных программ. Например, Protege делает это через библиотеку Graphviz.  Ниже пример синтаксиса для простого ориентированного графа:
digraph relations {
Доказательство -> Теорема [label="доказывает"];
Теорема ->  Теория [label="принадлежит"];
Пример -> Теорема [label="относится"];
}
При наличии утилиты dot легко скомпилировать этот код в следующую картинку:


Естественно, DOT позволяет поиграться с цветами, формами вершин и ребер, вообщем, всячески настроить выводимый граф.
Для создания UML диаграмм очень подходит Dia, юниксовый аналог MS Visio (впрочем, согласно их сайту, имеется и версия под Windows). Здесь все просто: графический интерфейс позволяет редактировать атрибуты и операции, также нет проблем с экспортом диаграмм в различные форматы.


Создание научных статей и презентаций

Ни для кого не секрет, что LaTeX является де-факто стандартом языка для написания научных статей во всем мире, особенно это касается публикаций по естественным наукам. Более того, использование LaTeX зачастую диктуется самим процессом принятия материалов для публикации на уровне программных комитетов конференций или журналов. Можно привести пример стилевых файлов Springer LNCS или ACM. Традиционные преимущества LaTeX следующие: переносимость, расширяемость, поддержка математической нотации, механизм ссылок и цитат.
Что касается цитат, то их поиск - один из самых частых сценариев. Дело в том, что при создании LaTeX документов принято выделять цитаты в отдельные BibTeX файлы, где каждая цитата согласно своему типу (статья, книга, тезис, онлайн ресурс) представлена набором полей (ключ, автор, название, издатель, год публикации и т.д.).  Собственно, не так давно узнал о функции импорта цитат в Google Scholar (можно настроить в Scholar Preferences).  До этого искал по таким ресурсам, как DBLPCiteULike и BibSonomy.
Безусловно, стоит отметить несколько пакетов LaTeX, которые особенно полезны при написании статей. Помимо традиционного AMS, выделяются:

  • PGFPlots - создание графиков и диаграмм;
  • algorithmic - форматированный вывод описания алгоритмов на псевдокоде;
  • beamer - создание слайдов презентаций;
  • todonotes - маленький, но полезный пакет для создания пометок.

Для редактирования меня устраивает Kile - TeX/LaTeX редактор для оболочки KDE с возможностями традиционной подсветки синтаксиса, механизмом автодополнения, WYSIWYG редактирования, быстрого просмотра скомпилированного документа и навигации по структуре документа.
В заключение отмечу еще вот это обсуждение по данной тематике. В ходе него перечисляется множество средств, далеко не все из которых удалось апробировать самому. Так весьма многообещающим выглядит использование распределенных систем контроля версий, таких как Git, в процессе колаборативного создания статьи. Это позволило бы работать с версионным репозиторием документов и в оффлайн режиме.


Поиск информации

Для поиска научных статей среди открытых и бесплатных средств особенно выделяется Google Scholar, который индексирует различные научные коллекции, находящиеся не только в открытом, но и ограниченном доступе. Помимо традиционного полнотекстового поиска по содержимому и метаданным документов, Google Scholar содержит неплохие дополнительные сервисы: поиск среди похожих статей или статей, ссылающихся на данную. Вообщем, это надежный, стабильно работающий продукт от мирового лидера в области поиска. Еще один тип ресурсов, который сейчас набирает обороты - это Q&A сайты. В известном смысле, они начинают составлять конкуренцию Wikipedia. Их принцип таков, что любой желающий может задать вопрос по соответствующей тематике и в довольно короткий срок получить адекватный ответ. У этих ресурсов есть продуманный механизм продвижения хороших вопросов и ответов, поощрения "экспертов" (людей, которые дают большое количество качественных ответов). Тенденция последних лет - это развитие тематических сайтов, посвященных, в том числе, научным или техническим областям. В частности, отмечу:
Отдельный пункт - отслеживание актуальной информации в динамично развивающихся исследовательских областях. В этой связи, особый интерес представляют публикации R&D подразделений ведущих IT компаний. Ниже приведен список RSS каналов некоторых из них:


Структурирование информации

Для хранения материалов, документации и связанных заметок используется ПО на базе wiki технологии. Наверно, это самый простой способ хранить и аннотировать такую информацию. Также удобно, когда такой ресурс доступен онлайн на работе и дома.
С недавнего времени осваиваю технологию создания диаграмм связей (mind mapping). Например, бывает удобно фиксировать темы обсуждения или идеи из только что прочитанной статьи в форме таких диаграмм. FreeMind - вполне удобная программа, служащая этим целям. Пример диаграммы для одной из научных статей:


-------------

Пожалуй, все. А какие средства используете вы?

Рекомендую сайт для изобретателей, инноваторов и для тех, кто ищет партнеров и инвесторов для продвижения своих идей и ноу-хау.

суббота, 23 октября 2010 г.

Попробуй Guice на вкус

В этом посте хотел бы вкратце описать возможности одной полезной Java библиотеки от Google. Естественно, только те из них, которые использовал непосредственно.
Guice - фреймворк, заточенный, по сути, только под одну задачу, которая в русскоязычной Википедии называется несколько неуклюже: "внедрение зависимости" (dependency injection - DI). Аналогичную функциональность реализуют в своих подмодулях и другие фреймворки вроде Spring или Seam. Guice - облегченная версия подобных библиотек и его применение позволяет для необходимой функциональности не "тащить" за собой вышеуказанных монстров. Ниже, собственно, о возможностях Guice.

  1. DI и модульность приложения
  2. Элементы AOP
  3. Unit тесты
  4. Интеграция с Servlet API


DI и модульность приложения

Рассмотрим простой пример зависимости класса Main от некоторого функционала класса HelperImpl, реализующего интерфейс Helper.
UML диаграмма:

Helper.java:
public interface Helper {
void doSomething();
}
HelperImpl.java:
public class HelperImpl extends Helper {
public void doSomething() {
// useful code here
}
}
Тогда зависимость внедряется с помощью аннотации @Inject.
Main.java:
public class Main  {
@Inject
private Helper helper;
public Helper getHelper() {
 return helper;
} 
}
Контекст приложения инкапсулируется в Guice в так называемых модулях. Как правило, это наследники от класса AbstractModule. Связывание интерфейса с классом настраивается в методе configure c помощью вызова методов bind и to.
ExampleModule.java:
public class ExampleModule extends AbstractModule {
protected void configure() {
bind(Helper.class).to(HelperImpl.class);
}
}
В принципе, все готово. Остальное зависит от того, где в приложении поднимается сконфигурированный Guice контекст. Пока пример в случае консольного приложения (далее будут примеры сервлетов веб-приложения и Unit-тестов).
Application.java:
public class Application {

 public static void main(String[] args) {
  Application app = new Application();
  Injector injector = Guice.createInjector(new ExampleModule());
  Main main = injector.getInstance(Main.class);
  main.getHelper();
 }
}
К моменту вызова getter-метода поле helper будет проинициализировано.

Элементы AOP

Элементы аспекто-ориентированного программирования представлены в Guice, как минимум, механизмом "перехватывания" (interception). Рассмотрим, это на примере валидации параметра, передаваемого в метод. Пусть есть функционал по работе с пользователями, для исполнения которого необходимо проверять корректность передаваемых данных.
UserDAO.java:
public class UserDAO {
@ValidateUser
public void saveUser(User user) {
// a code to save user
}
@ValidateUser
public void deleteUser(User user) {
// a code to delete user
}
}
@ValidateUser - аннотация, на которую мы настроим объект-перехватчик.
ValidateUser.java:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidateUser {
}
Код перехватчика будет проверять наличие id у пользователя.
ValidateUserInterceptor.java:
public class ValidateUserInterceptor
implements MethodInterceptor {

        @Override
        public Object invoke(MethodInvocation invocation)
        throws Throwable
        {
                Object[] args = invocation.getArguments();
  boolean isValid = false;
                for (Object arg : args) {
                        if (arg instanceof User) {
                                User user = (User) arg;
                                if (user.getId() != null) {
                                    isValid = true;break;
                                }
                        }
                }
  if (isValid) return invocation.proceed();
throw new IllegalArgumentException
("validation of user failed");
        }
}
Осталось настроить перехватчик на аннотацию в модуле приложения:
UserModule.java:
public class UserModule extends AbstractModule {

        @Override
        protected void configure() {
ValidateUserInterceptor validateUserInterceptor = new
 ValidateUserInterceptor();
                bindInterceptor(Matchers.any(),
Matchers.annotatedWith(ValidateUser.class),
validateUserInterceptor);
        }

}

Unit-тесты

Под Guice есть готовый фреймворк для написания Unit-тестов - MycilaGuice. Эта библиотека умеет самое главное - поднимать Guice контекст при запуске JUnit тестов. Делается это тоже с помощью аннотаций.
UserDAOTest.java:
@RunWith(MycilaJunitRunner.class)
@GuiceContext(UserModule.class)
public class UserDAOTest {
@Inject
private UserDAO userDao;
@Test
public void testSave() {
userDao.save(new User("1"));
}
@Test
public void testDelete() {
userDao.delete(new User("2"));
}

}

Интеграция с Servlet API

Наконец, Guice можно интегрировать в веб-приложение. Для этого необходимо создать класс-слушатель, который наследуется от класса GuiceServletContextListener.
WebGuiceContextListener.java:
public class WebGuiceContextListener extends GuiceServletContextListener {

        @Override
        protected Injector getInjector() {
                return Guice.createInjector(new WebModule());
        }

}
WebModule - модуль веб-приложения, где можно настраивать мэппинг сервлетов, не считая рассмотренных выше возможностей Guice модулей.
WebModule.java:
public class WebModule extends ServletModule {

        @Override
        protected void configureServlets() {
                serve("/webapplication/download").with(DownloadServlet.class);
        }
}
Осталось поправить конфигурационный файл веб-приложения web.xml и - бинго! - можно пользоваться всеми преимуществами Guice.
web.xml:
<web-app>
        <filter>
                <filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
        </filter>

        <filter-mapping>
                <filter-name>guiceFilter</filter-name>
                <url-pattern>/*</url-pattern>
        </filter-mapping>
        <listener>
                <listener-class>somepackage.WebGuiceContextListener</listener-class>
        </listener>

</web-app>
Metal War Online