这是我的代码,为什么一个字母和另一个字母的交和并总是等于一,我从这里提取了代码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/

10-10 23:59