Greeb
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
— тип обнаруженного вхождения.
При отсчёте начала строки от нуля, любое обнаруженное анализатором вхождение может быть выделено в тексте по координатам .
На этапе токенизации вхождения могут иметь следующие типы:
-
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"]]