查找具有类似产品的类别-低效率-Go



你好,对不起,我的英语


我有一份与每个类别相关的类别和产品列表

cats = [cat1, cat2, cat3]

prod = {
cat1 = [a, b, c]
cat2 = [d, e, c]
cat3 = [z, x, w]
}

我想要什么

{
group1: [cat1, cat2]
group2: [cat3]
}

我需要对共享您的一些产品的类别进行分组

一切对我来说都很好,但我有400000类别,这样做两个循环是不好的。我的算法需要4天才能完成

我刚从戈兰开始,有人知道如何处理这个问题吗?谢谢

  • 组可以是任何大小
  • 产品的数量因类别而异
  • 相似性百分比可能会发生变化

func main() {
cats, prod := getDataDB()
for _, cat1 := range cats {
for _, cat2 := range cats {
result := percentageSimilarity(prod[cat1], prod[cat2])
if result > 50{
// save group
}

}

}
}
func percentageSimilarity(a, b []string) int {
sum := 0
percentage := 0
if len(a) > len(b) {
for _, key := range a {
if contains(b, key) {
sum++
}
}
percentage = sum * 100 / len(b)
} else {
for _, key := range b {
if contains(a, key) {
sum++
}
}
percentage = sum * 100 / len(a)
}
return percentage
}
func contains(s []string, e string) bool {
for _, a := range s {
if a == e {
return true
}
}
return false
}

首先,从最少的产品到最多的产品对您的类别进行排序。

接下来,创建一个从产品到包含该产品的类别数组的映射。

现在这样做:

for each category
create empty category_shared_products map from category to count of shared products
for each product
for each other_category containing that product
add/increment category_shared_products[other_category]
decide what to merge this category into (if anything)

有很多细节需要纠正。但现在,我们不再关注每一对类别,而是只关注实际上共享产品的类别。

最新更新