这是我的代码,为什么一个字母和另一个字母的交和并总是等于一,我从这里提取了代码jaccard,因为我知道两个集合a和B之间的Jaccard相似性,它是a∩B和a∪B的基数的比值,我想把一个字符串看作一组字符
#include <stdlib.h>
#include <stdio.h>
void main() {
char source[5] = "salam";
char cible[5] = "Salam";
int i, in = 0, un = 0;
float Jaccard = 0;
for (i = 0; i < 5; ++i) {
un += (source[i] || cible[i]);
in += (source[i] && cible[i]);
}
printf("un :: %d\n", un);
printf("in :: %d\n", in);
Jaccard = (float)in / un * 100.0;
printf("jaccard :: %f\n", Jaccard);
}
最佳答案
您选择了set intersection和union的逻辑,但没有将输入转换为它们使用逻辑的表示。
不能直接作用于输入字符串你需要在地图上操作。
以下逻辑可以帮助您从字符串中获取位图。
uint8_t Bitmap1[256] = {0};
uint8_t Bitmap2[256] = {0};
for (i=0;input1[i];i++){
Bitmap1[input1[i]] = 1;
}
for (i=0;input2[i];i++){
Bitmap2[input2[i]] = 1;
}
现在可以使用逻辑来计算集合并集和交集。
in = 0;
un = 0;
for(i=0;i<256;i++){
in+=Bitmap1[i] && Bitmap2[i];
un+=Bitmap1[i] || Bitmap2[i];
}
// Rest of the logic
这是对您输入的有效结果的DEMO。
关于c - J语言的Jaccard距离实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45590032/