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::Span, имеющего три атрибута:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Также имеется эвристика для поиска аббревиатур в тексте.

text = 'Занятие ведёт к.т.н. Петров.'

pp Greeb::Parser.abbrevs(text).map { |e| [e, e.slice(text)] } # =>
  [[#<struct Greeb::Span from=14, to=20, type=:abbrev>, "к.т.н."]]

Более того, можно выделять временные отметки.

text = 'Наше время истекает: 13:37.'

pp Greeb::Parser.time(text).map { |e| [e, e.slice(text)] } # =>
  [[#<struct Greeb::Span from=21, to=26, type=:time>, "13:37"]]

Ссылки

Примечания