Выбор совпадений подстрок в названиях

Был у меня список клиник, который забивали руками.
Хотелось найти сетевые клиники путём поиска похожих названий, а именно — совпадений подстрок.
Делал на go. Из-за скорости и наколеночности делал всё в одном файле, без тестов и код там не так чтобы хорош.
Код здесь — https://github.com/bullgare/lzd_cllinics/blob/master/utils/parser/main.go#L312. Реализация не самая удачная, нет тестов, и всё в одном файле — так получилось, потому что директория проекта не занесена в GOPATH.
Идея такая:
1. Делим все названия на токены по последовательным словам (т.е. любая комбинация слов, которые идут в тексте последовательно, переставлять слова местами нельзя).
Например, для названия ЗАО "ЦЕНТРАЛЬНАЯ ПОЛИКЛИНИКА ЛИТФОНДА" получим:

https://github.com/bullgare/lzd_cllinics/blob/master/utils/parser/main.go#L356
2. Для каждого токена записываем id поликлиник, которые к ней относятся.
https://github.com/bullgare/lzd_cllinics/blob/master/utils/parser/main.go#L317
3. Сортируем строки по длине строки (чтобы потом найти все «надстроки» текущей)
https://github.com/bullgare/lzd_cllinics/blob/master/utils/parser/main.go#L425
4. Для каждой такой строки ищем строку, которая включает эту строку и содержит не меньше id поликлиник (на этом этапе для простоты считаем, что одна поликлиника содержится только в одном подмножестве названий). Если строка включает нашу текущую строку, и в ней не меньше id-шников, то считаем её нужной нам (заменяем проверяемую строку ей), если клиник меньше, то отбрасываем такую строку (больше мы её проверять не будем).
https://github.com/bullgare/lzd_cllinics/blob/master/utils/parser/main.go#L438
5. Для каждой оставшейся строки строим мапу id клиники => все названия => количество клиник с таким названием. Затем ищем в цикле название с максимальным количеством клиник для нашей клиники. Все остальные названия — дубликаты, их отфильтровываем.
https://github.com/bullgare/lzd_cllinics/blob/master/utils/parser/main.go#L462

На выходе получаем список сетевых клиник с id клиник для каждой из них.

Код здесь — https://github.com/bullgare/lzd_cllinics/blob/master/utils/parser/main.go#L312. Реализация не самая удачная, нет тестов, и всё в одном файле — так получилось, потому что директория проекта не занесена в GOPATH.

LEAVE A COMMENT