Normalizer: опенсорс-библиотека для «нормализации» текста
Normalizer — это библиотека с открытым исходным кодом для очистки, нормализации и сравнения текста, выпущенная под лицензией MIT. Библиотека, созданная разработчиком Валентином Хомутенко, написана на Go и позволяет, например, преобразовать строку кода в нижний регистр или быстро заменить «ё» на «е». Полученные значения затем можно сравнивать или использовать в качестве уникальных идентификаторов.
Установка
Чтобы установить Normalizer, нужно выполнить следующую команду:
go get -u github.com/avito-tech/normalize
package main import ( "fmt" "github.com/avito-tech/normalize" ) func main() { fuzzy := "VAG-1101" clean := normalize.Normalize(fuzzy) fmt.Print(clean) // vag1101 manyFuzzy := []string{"VAG-1101", "VAG-1102"} manyClean := normalize.Many(manyFuzzy) fmt.Print(manyClean) // {"vag1101", "vag1102"} }
Библиотека по умолчанию работает по следующим принципам:
- Все символы, кроме латиницы и кириллицы, немецких умлаутов (ä, ö, ü) и цифр, удаляются;
- Редкие буквы кириллицы, такие как
ё
ий
, заменяются на общие эквиваленты —е
ии
; - Похожие пары латиницы и кириллицы нормализуются к латинским буквам:
В (в)
превращается вВ (b)
. Автор призывает проверить все заменяющиеся пары через командуWithCyrillicToLookAlike
; - Немецкие умлауты
ä
,ö
,ü
преобразуются в латинскиеa
,o
,u
; - Вся строка преобразуется в нижний регистр.
Расстояние Левенштейна используется для вычисления расстояния между строками:
package main import ( "fmt" "github.com/avito-tech/normalize" ) func main() { fuzzy := "Hyundai-Kia" otherFuzzy := "HYUNDAI" similarityThreshold := 0.3 result := normalize.AreStringsSimilar(fuzzy, otherFuzzy, similarityThreshold) // distance(hyundaikia, hyundai) = 3 // 3 / len(hyundaikia) = 0.3 fmt.Print(result) // true }
Конфигурация
Свойства AreStringsSimilar
и Normalize
принимают произвольное количество нормализаторов в качестве обязательного параметра. Автор отмечает, что здесь нормализатор — это любая функция, которая принимает строку и возвращает ее.
Например, опция ниже оставить строку без изменений:
package main import "github.com/avito-tech/normalize" func WithNoNormalization() normalize.Option { return func(str string) string { return str } }
Согласно документации, нормализацию можно настроить только на нужные параметры. Например, использовать только нижний регистр или преобразование кириллицы в латиницу.
package main import ( "fmt" "github.com/avito-tech/normalize" ) func main() { fuzzy := "АВ-123" clean := normalize.Normalize(fuzzy, normalize.WithLowerCase(), normalize.WithCyrillicToLatinLookAlike()) fmt.Print(clean) // ab-123 }
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: