Ключевые слова
Пакет keywords позволяет задать ключевые слова/тэги для выбранных слов/фраз/шаблонов.
Файл данных
Данные хранятся в файле data.txt, который встраиваются в библиотеку при помощи go:embed,
а загрузка производится на этапе инициализации пакета keywords.
Каждая строка данных имеет следующий формат:
word|phrase|template tag1 tag2 ... tagN
При этом для некоторых сущностей тэги могут отсутствовать.
В случае phrase/template/tags бывает потребность, чтобы внутри тега использовался пробел, для этого
нужно заменить пробел на символ подчеркивания "_".
В качестве тэгов могут быть использованы специальные параметры $0, $1, $2, $3, $4 и их комбинаций
например $0_$1. Это может быть полезно, если мы хотим определить шаблон например таким образом:
:mnames_:mlastnames $0_$1 $0 $1
Что эта строка означает? А означает она следующее, что если в тексте мы встречаем последовательность
токенов, базовая форма первого из которых попадает в словарь :mnames (мужские имена), а базовая
форма второго попадает в словарь :mlastnames (мужские фамилии), то на выходе мы получим три тэга:
имя_фамилия, имя, фамилия.
Как мы видели, вхождение слова в словарь описывается следующей конструкцией ":" + "имя словаря".
В самых простых случаях фрагмент файла данных может выглядеть следующим образом:
как_сыр_в_масле
москва москва россия
красная_площадь красная_площадь москва россия
Это означает, что встретив в тексте красной площади, мы поставим ей в соответствие три тэга: красная площадь,
москва и россия, если конечно для слов красная и площадь определены в пакете forms формы.
А встретив как сыр в масле, этой фразе мы ничего не поставим в соответствие и просто пропустим ее.
На данный момент существенным ограничением является тот факте, что фразы и шаблоны могут содержать не более чем
5 токенов.
При анализе текста более приоритетной считается более длинная фраза или шаблон. Если есть фраза и шаблон одинаковой длины то
приоритет будет отдан конкретной фразе, а не шаблону. Если есть просто две подходящие фразы и
они имеют идентичный набор тэгов, то этот набор тэгов будет использован. Если наборы тэгов разные, то будет использован пустой
массив тэгов (неоднозначность). Например если в исходном тексте мы встречаем токен иванову, то для этого токена существуют
базовые формы иванов и иванова и в данном контексте мы не может однозначно понять о ком речь (о женщине или
о мужчине), поэтому исходный список тэгов будет пуст.
API
Get
func Get(src string) ([]string, bool)
Функция возвращает массив тэгов, связанных с шаблоном/сущностью и флаг того, что шаблон определен.
Нормальная практика, если для шаблона нет тэгов.
Is
func Is(src string) bool
Проверка определен ли переданный шаблон в базе данных ключевых сущностей.
Size
func Size() int
Получение числа ключевых слов/шаблонов в базе данных. Нужно для статистики.