Пользовательский метод Rails group_by (расстояние Левенштейна) - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть эти ActiveRecords

items = [{title: "Title 1"}, {title: "Title 2"}, {title: "Title 3"}]

Теперь я хочу сгруппировать элементы с похожим названием (используя функцию расстояния Левенштейна> 70%).

Я думал что-то вроде item.group_by{} но мне интересно, как рассчитать счет для каждой комбинации? Я должен сравнить title1 с title3 и title2 с title3 et c ..

def levenshtein_distance(title_a, title_b)
    ... 
    return score
end

Я пытался использовать алгоритм кластеризации (KMedoids с неевклидовым метри c), но я не знаю размер кластера (k) a-priori.

1 Ответ

0 голосов
/ 22 апреля 2020

Я решил с этим.

matrix = {}
items.each_with_index do |item_a, i|
  matrix["#{items[i].id}"] = []
  items.each_with_index do |item_b, j|
    if String::Similarity.cosine(item_a.title, item_b.title) > 0.9
      matrix["#{items[i].id}"] << items[j] 
    end
  end
end

puts matrix.inspect

 matrix.each do |key, items|
  ....
 end
...