Tags 创建标记的可表示签名

Tags 创建标记的可表示签名,tags,compression,signature,Tags,Compression,Signature,比如说,我有一些带有指定标签的项目,比如“蓝色”、“大”、“灵活”。假设我还有一个包含所有可能标签的字典 现在的问题是:如何将所有标记压缩为单个小签名,比如一个浮点数。要求具有相似标签的项目具有相似的签名 所有的标签永远都是已知的。签名应该相对较小,例如一个浮点数或一组少数整数。坦率地说,我认为将其浓缩为单个数字的方案不值得。只需使用16位int或32位int来表示标记。并为要应用于项目的每个标记使用其中一个字段。你对节省空间的追求只会增加不必要的复杂性 为每个标签分配一个ID号。您可能希望将标

比如说,我有一些带有指定标签的项目,比如“蓝色”、“大”、“灵活”。假设我还有一个包含所有可能标签的字典

现在的问题是:如何将所有标记压缩为单个小签名,比如一个浮点数。要求具有相似标签的项目具有相似的签名


所有的标签永远都是已知的。签名应该相对较小,例如一个浮点数或一组少数整数。

坦率地说,我认为将其浓缩为单个数字的方案不值得。只需使用16位int或32位int来表示标记。并为要应用于项目的每个标记使用其中一个字段。你对节省空间的追求只会增加不必要的复杂性

为每个标签分配一个ID号。您可能希望将标记到ID的映射存储在单独的表中。调用标记总数N和给定项可以有M个标记的数量。标记签名将是以M位为基数N的ID

所以如果N=50k,M=3

标签1=49999 标签2=1 标签3=2

标签签名=49999+1*50000^1+2*50000^2=5000099999


您将需要超过64位来表示这一点。请使用足够大的整数类型来表示此值。如有必要,请使用多个整数。不要使用浮动,否则会失去精度。

还有其他假设吗?每个项目的标签数量有限?标签集是永久固定的吗?项目和标记存储在SQL数据库中?刚刚更新了要求。如果您希望签名具有有限的大小(例如浮点数),如何执行此操作。它们将存储在哪里?数据库?您希望多久读取和写入一个项目的标记一次?您希望多久搜索一组给定标记的所有项目?您希望从所有项目中删除单个标记的频率如何?有多少个标签?有多少项?每个项目有多少个标签?比如说1M个项目,每个项目有10个标签,总共50K个不同的标签,存储在MySQL中,标签和签名更新。请继续。我也询问了运营情况。你不需要非常精确,只要“很少”、“经常”、“从不”。引用我自己的话:“您希望多久读取和写入一个项目的标签?您希望多久搜索一组给定标签的所有项目?您希望多久从所有项目中删除一个标签?”项目的标签永远不会更改。一般来说,标签永远不会改变。新项目将频繁添加。可以频繁地(如果有效的话)进行搜索,也可以不频繁地(如果无效的话)进行缓存。