Greeb

Материал из NLPub
Перейти к: навигация, поиск

Greeb — это графематический анализатор с полной поддержкой Юникода, разработанный на языке Ruby. Принцип функционирования анализатора основан на регулярных выражениях. Данный анализатор выполняет задачи токенизации и сегментации текста на естественном языке.

Содержание

[править] Доступность

Анализатор Greeb распространяется на условиях лицензии MIT. Исходные коды доступны на GitHub.

[править] Установка

Поскольку Greeb разработан на языке Ruby, то перед установкой анализатора необходимо установить Ruby версии не ниже 1.9. Обеспечивается совместимость анализатора с альтернативными реализациями языка Ruby: Rubinius и JRuby.

При наличии Ruby установка анализатора выполняется одной командой:

% gem install greeb

[править] Использование

[править] Командная строка

Анализатор можно использовать в качестве утилиты командной строки. В настоящий момент поддерживается только функция токенизации текста.

Утилита greeb читает текст из потока стандартного ввода. После обработки текста и выполнения токенизации, в каждой строке потока стандартного вывода записывается очередной обнаруженный токен. При этом выполняется обнаружение различных особых строк, вроде URL и адресов электронной почты.

% echo 'Hello http://nlpub.ru guys, how are you?' | greeb
Hello
http://nlpub.ru
guys
,
how
are
you
?

[править] Ruby

Поскольку Greeb распространяется как гем, то можно легко встроить анализатор в сторонние решения на языке Ruby.

Стоит отметить особенности формата вывода анализатора. Greeb выдаёт результат в виде списков объектов класса Greeb::Entity, имеющего три атрибута:

  • атрибут from — позиция начала обнаруженного вхождения;
  • атрибут to — позиция конца обнаруженного вхождения;
  • атрибут type — тип обнаруженного вхождения.

При отсчёте начала строки от нуля, любое обнаруженное анализатором вхождение может быть выделено в тексте по координатам (from, to-1).

На этапе токенизации вхождения могут иметь следующие типы:

  • letter — буквы;
  • float — десятичные дроби;
  • integer — целые числа;
  • spunct — знаки препинания внутри предложения (запятые, тире);
  • punct — знаки препинания (точки, восклицательные знаки);
  • separ — разделители (пробелы, математические знаки);
  • break — переносы строк;
  • residual — как правило, бесполезные символы.

Токенизация текста выполняется одной строкой:

tokens = Greeb::Tokenizer.tokenize('Привет!!! Как дела?') # =>
  [#<struct Greeb::Entity from=0, to=6, type=:letter>,
   #<struct Greeb::Entity from=6, to=9, type=:punct>,
   #<struct Greeb::Entity from=9, to=10, type=:separ>,
   #<struct Greeb::Entity from=10, to=13, type=:letter>,
   #<struct Greeb::Entity from=13, to=14, type=:separ>,
   #<struct Greeb::Entity from=14, to=18, type=:letter>,
   #<struct Greeb::Entity from=18, to=19, type=:punct>]

Сегментация предложений выполняется на основе результатов предыдущего этапа. Для выполнения сегментации необходимо передать сегментатору имеющуюсь последовательность токенов Greeb::Segmentator.new(tokens).sentences. В данном примере анализатор корректно обнаружит два предложения в тексте:

Greeb::Segmentator.new(tokens).sentences # =>
  [#<struct Greeb::Entity from=0, to=9, type=:sentence>,
   #<struct Greeb::Entity from=10, to=19, type=:sentence>]

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

segmentator = Greeb::Segmentator.new(tokens)
segmentator.extract(segmentator.sentences) # =>
  {#<struct Greeb::Entity from=0, to=9, type=:sentence>=>
    [#<struct Greeb::Entity from=0, to=6, type=:letter>,
     #<struct Greeb::Entity from=6, to=9, type=:punct>],
   #<struct Greeb::Entity from=10, to=19, type=:sentence>=>
    [#<struct Greeb::Entity from=10, to=13, type=:letter>,
     #<struct Greeb::Entity from=13, to=14, type=:separ>,
     #<struct Greeb::Entity from=14, to=18, type=:letter>,
     #<struct Greeb::Entity from=18, to=19, type=:punct>]}

Часто в тексте встречаются URL или адреса электронной почты, которые необходимо выделить для какой-либо дальнейшей обработки. Greeb имеет встроенный парсер таких строк и позволяет решить задачу быстро и эффективно:

text = 'У меня есть сайт http://nlpub.ru и электропочта example@example.com.'

pp Greeb::Parser.urls(text).map { |e| [e, text[e.from...e.to]] } # =>
  [[#<struct Greeb::Entity from=17, to=32, type=:url>, "http://nlpub.ru"]]

pp Greeb::Parser.emails(text).map { |e| [e, text[e.from...e.to]] } # =>
  [[#<struct Greeb::Entity from=48, to=67, type=:email>, "example@example.com"]]

[править] Ссылки

[править] Примечания

Личные инструменты
Пространства имён

Варианты
Действия
NLPub
Ресурсы
Вживую
Навигация
Инструменты