推荐系统:将 UUID 转换为推荐库的 32 位整数
recommender systems: Convert UUIDs to 32 bit ints for recommender libraries
LightFM 和其他库要求 32 位整数 ID,例如用户。但是,我们的用户 ID 是一个 UUID,例如0003374a-a35c-46ed-96d2-0ea32b753199
。我想知道在这样的情况下你会推荐什么。我想出的是:
- 在内存或数据库中创建双向字典以保留 UUID <-> Int 映射。例如https://github.com/jab/bidict
- 使用非加密哈希函数,如 MurmurHash3 或 xxHash。例如对于 1000 万个 UUID,我使用
xxhash
得到了大约 11,521 或 0.1% 的冲突。这对于推荐系统来说可以忽略不计吗?
我也很好奇这将如何应用于在线预测场景,其中给定 UUID、用户交互和模型,我必须预测需要 32 位整数的模型的建议。如果我使用内存中的 bidict 方法,那么在这种情况下这将不起作用,因此在最坏的情况下我可能必须创建一个持久的键值存储。
- 这肯定行得通,而且可能是绝大多数用户会选择的解决方案。当然,缺点在于必须维护映射。
- 散列函数也可以。事实上,有一些方法使用散列到 reduce the dimensionality 所需的嵌入层。值得记住的一件事是生成的散列范围应该相对紧凑:大多数实现会为所有可能的值分配参数,因此可以散列为非常大的值的散列函数将需要大量内存。模函数后的散列可以很好地工作;然后权衡是在保存所有参数所需的内存和碰撞概率之间。
在 LightFM 以及大多数其他实现中,只能针对训练期间存在的用户和项目(或至少针对用户和项目特征)进行推荐。然后映射将成为模型本身的一部分,并有效地冻结,直到训练新模型。
LightFM 和其他库要求 32 位整数 ID,例如用户。但是,我们的用户 ID 是一个 UUID,例如0003374a-a35c-46ed-96d2-0ea32b753199
。我想知道在这样的情况下你会推荐什么。我想出的是:
- 在内存或数据库中创建双向字典以保留 UUID <-> Int 映射。例如https://github.com/jab/bidict
- 使用非加密哈希函数,如 MurmurHash3 或 xxHash。例如对于 1000 万个 UUID,我使用
xxhash
得到了大约 11,521 或 0.1% 的冲突。这对于推荐系统来说可以忽略不计吗?
我也很好奇这将如何应用于在线预测场景,其中给定 UUID、用户交互和模型,我必须预测需要 32 位整数的模型的建议。如果我使用内存中的 bidict 方法,那么在这种情况下这将不起作用,因此在最坏的情况下我可能必须创建一个持久的键值存储。
- 这肯定行得通,而且可能是绝大多数用户会选择的解决方案。当然,缺点在于必须维护映射。
- 散列函数也可以。事实上,有一些方法使用散列到 reduce the dimensionality 所需的嵌入层。值得记住的一件事是生成的散列范围应该相对紧凑:大多数实现会为所有可能的值分配参数,因此可以散列为非常大的值的散列函数将需要大量内存。模函数后的散列可以很好地工作;然后权衡是在保存所有参数所需的内存和碰撞概率之间。
在 LightFM 以及大多数其他实现中,只能针对训练期间存在的用户和项目(或至少针对用户和项目特征)进行推荐。然后映射将成为模型本身的一部分,并有效地冻结,直到训练新模型。