3.0.0 • Published 7 months ago

social-text-tokenizer v3.0.0

Weekly downloads
81
License
MIT
Repository
-
Last release
7 months ago

social-text-tokenizer

Пакет для разбора текстов постов и комментариев. Он предназначен для текстов сайта freefeed.net, но может быть адаптирован и для на других сервисов.

TL;DR

Как быстро начать парсить тексты:

import {
  combine, withText,
  hashTags, emails, mentions, foreignMentions, links, arrows
} from 'social-text-tokenizer';

// Находит в тексте hashTags, emails, mentions, foreignMentions, links, arrows,
// объединяет результаты и заполняет промежутки токенами типа Text.
const parse = withText(combine(hashTags, emails, mentions, foreignMentions, links, arrows));

const tokens = parse(text);

Подробности

Токены и токенизаторы

Пакет экспортирует функции-токенизаторы. Токенизатор принимает текст и возвращает массив найденных в нём токенов — элементов, под поиск которых заточен данный токенизатор.

interface Tokenizer {
  (text: string): Token[];
}

Токены представляют собой найденные в тексте объекты и являются наследниками класса Token:

class Token {
  type: string;   // тип токена (совпадает с именем класса)
  offset: number; // позиция начала в строке
  text: string;   // текст токена без изменений
  …
}

Пакет экспортирует следующие токены (классы) и соответствующие конструкторы токенизаторов:

  • Text — простой текст, используется для заполнения интервалов между значимыми токенами
  • HashTag (и токенизатор hashTags()) — хэштег
  • Email (и токенизатор emails()) — адрес e-mail
  • Mention (и токенизатор mentions()) — @-упоминание логина пользователя
  • ForeignMention (и токенизатор foreignMentions()) — упоминание пользователя другой соцсети вида username@service
  • Link (и токенизаторы links()) — URL в тексте
  • Arrows (и токенизатор arrows()) — ссылки на комментарии вида ^^ или ↑↑

Функции-конструктры токенизаторов возвращают токенизаторы нужного типа. Они имеют опциональные аргументы, позволяеющие уточнять, какие именно токены будут захвачены. Каждый токенизатор возвращает токены своего типа.

Особенности токенов

Отдельные типы токенов имеют дополнительные свойства, расширяющий стандартный класс Token.

Классы Link и Email имеют дополнительное строковое поле pretty. Этом поле представляет ссылку или адрес e-mail в виде, предназначеном для показа пользователю. В частности, IDN-домены в нём представлены в Unicode-виде, а все параметры и элементы пути у ссылок URL-раскодированы.

Класс Link имеет дополнительное поле href, оно содержит абсолютный URL, пригодный для использования, например, в href-атрибуте ссылки. В частности, href всегда содержит URL-схему, даже если в исходном тексте её нет.

Класс Link имеет дополнительный метод shorten(limit). Он возвращает pretty-вид ссылки, обрезанный так, чтобы быть не длиннее limit символов.

Объединение результатов

Функция combine принимает токенизаторы-аргументы и возвращает токенизатор, который объединяет результаты аргументов:

// Простые токенизаторы
const emailTokens = emails(text);
const linkTokens = links(text);

// Комбинированный токенизатор
const emailAndLinkTokens = combine(emails, links)(text);

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

Добавление текстовых токенов

Функция withText принимает токенизатор и возвращает новый токенизатор, который заполняет интервалы токенами типа Text.

const tokens = hashTags("abc #def ghi");
// Result: [HashTag{offset: 4, text: "#def"}]

const tokensWithText = withText(hashTags)("abc #def ghi");
// Result: [
//  Text{offset: 0, text: "abc "},
//  HashTag{offset: 4, text: "#def"},
//  Text{offset: 8, text: " ghi"},
// ]

Текстовые токены имеет смысл добавлять на последнем этапе, после комбинирования токенизаторов.

3.0.0

7 months ago

2.3.0

1 year ago

2.5.0

1 year ago

2.4.0

1 year ago

2.3.1

1 year ago

2.2.0

3 years ago

2.1.5

3 years ago

2.1.4

3 years ago

2.1.3

4 years ago

2.1.2

4 years ago

2.1.1

4 years ago

2.1.0

4 years ago

2.0.1

5 years ago

2.0.0

5 years ago

1.1.1

5 years ago

1.1.0

5 years ago

1.0.1

5 years ago

1.0.0

6 years ago