【问题标题】:Rails group_by custom method (Levenshtein distance)Rails group_by 自定义方法(Levenshtein 距离)
【发布时间】:2020-04-21 15:13:55
【问题描述】:

我有这些 ActiveRecords

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

现在我想对标题相似的项目进行分组(使用函数 Levenshtein distance > 70%)。

我在想item.group_by{} 之类的东西,但我想知道如何计算每个组合的分数?我必须将 title1title3title2title3 等进行比较。

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

我尝试使用聚类算法(具有非欧几里得度量的 KMedoids),但我不知道先验的聚类大小 (k)。

【问题讨论】:

  • group_by 仅适用于绝对指标。你想要的是clustering
  • @Stefan 我尝试使用 Kmedoids,但我没有先验群集大小 (k)。
  • 你可以使用模糊匹配 gem github.com/seamusabshere/fuzzy_match
  • 这不一定是与数据库无关的问题。例如,Postgres 有一个显式的LEVENSHTEIN 方法,因此 Postgres 的解决方案与 SQLite 或 MySQL 的解决方案不同。你用的是什么数据库?

标签: ruby-on-rails ruby ruby-on-rails-6


【解决方案1】:

我解决了这个问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 2014-08-04
    • 2015-01-28
    相关资源
    最近更新 更多