O(n^2) – побеждаем сложность
#АнатомияФункций – приёмы
Всем привет!
В чат прилетела задачка на поиск пар подобных текстов (сразу обращаю внимание – не кластеризация, а именно расчёт подобия и вынимание избранных, причём с линейной метрикой). Соответственно на больших данных это очень ресурсозатратно. Что смог – сократил, по этому поводу код:
let
from = List.Distinct(Excel.CurrentWorkbook(){[Name="база"]}[Content][Наименование]),
lst = List.Buffer(List.Transform(List.Zip({from,{1..List.Count(from)}}),(x)=>{x{0},Text.ToList(Text.Upper(x{0})),Text.Length(x{0}),x{1}})),
g=(x,y)=>2*List.Count(List.Intersect({x{1},y{1}}))/(x{2}+y{2}),
f=(x)=>List.Select(List.Transform(List.Skip(lst,x{3}),(y)=>{x{0},y{0},g(x,y)}),(z)=>z{2}>0.86),
tr = List.TransformMany(lst,f,(x,y)=>y),
to = Table.FromList(tr,(x)=>x,{"Наименование","Похожее","Подобие"})
in
to
Ну а что тут к чему смотрим -
С исходниками на
sponsr - там же и
курс по языку М
На
дзен
и если повезет на
ютуб
Лайки, комменты, подписки приветствуются )))
Надеюсь, было полезно.
Всех благ!
@buchlotnik