C# 余弦相似性计算问题

C# 余弦相似性计算问题,c#,cosine-similarity,C#,Cosine Similarity,我在计算两个字符串之间的余弦相似性时遇到问题。 我使用一个函数计算每个字符串的二进制向量格式。它给出了二进制向量的形式,比如说,(1,1,1,1,0,0,0) 公共静态元组句子到向量(字符串[]单词数组1,字符串[]单词数组2) { String[]unique_word_array1=word_array1.Distinct().ToArray(); String[]unique_word_array2=word_array2.Distinct().ToArray(); String[]lis

我在计算两个字符串之间的余弦相似性时遇到问题。 我使用一个函数计算每个字符串的二进制向量格式。它给出了二进制向量的形式,比如说,
(1,1,1,1,0,0,0)

公共静态元组句子到向量(字符串[]单词数组1,字符串[]单词数组2)
{
String[]unique_word_array1=word_array1.Distinct().ToArray();
String[]unique_word_array2=word_array2.Distinct().ToArray();
String[]list_all_words=unique_word_array1.Concat(unique_word_array2.ToArray();
String[]list_all_words_unique=list_all_words.Distinct().ToArray();
int count_all_unique_words=列表_all_words_unique.Length;
int[]语句1_vector=新int[count_all_unique_words];
int[]语句2_vector=新int[count_all_unique_words];
for(int i=0;i=0)
{
句子1_向量[i]=1;
}
其他的
{
句子1_向量[i]=0;
}
}
for(int i=0;i=0)
{
句子2_向量[i]=1;
}
其他的
{
句子2_向量[i]=0;
}
} 
返回元组。创建(语句1_向量,语句2_向量);;
}
在我计算了向量表示之后,我进行了余弦相似性计算

代码随函附上:

public static float get_cosine_similarity(int[] sentence1_vector, int[] sentence2_vector)
{
    int vector_length = sentence1_vector.Length;
    int i = 0;
    float numerator = 0, denominator = 0;
    int temp1 = 0, temp2 = 0;
    double square_root1 = 0, square_root2 = 0;

    for (i = 0; i < vector_length; i++)
    {
        numerator += sentence1_vector[i] * sentence2_vector[i];
        temp1 += sentence1_vector[i] * sentence1_vector[i];
        temp2 += sentence2_vector[i] * sentence2_vector[i];
    }

    //TextWriter tw = new StreamWriter("E://testpdf/date2.txt");
    square_root1 = Math.Sqrt(temp1);
    square_root2 = Math.Sqrt(temp2);
    denominator = (float)(square_root1 * square_root2);

    if (denominator != 0){
        return (float)(numerator / denominator);
        //return (float)(numerator);
    }
    else{
        return 0;
    }
}
公共静态浮点获取余弦相似性(int[]语句1\u向量,int[]语句2\u向量)
{
int vector_length=句子1_vector.length;
int i=0;
浮点数分子=0,分母=0;
int temp1=0,temp2=0;
双平方根1=0,平方根2=0;
对于(i=0;i
我检查了一个网站,在那里我可以指定2个字符串,并找到它们之间的余弦相似性。网站随函附上:

public static float get_cosine_similarity(int[] sentence1_vector, int[] sentence2_vector)
{
    int vector_length = sentence1_vector.Length;
    int i = 0;
    float numerator = 0, denominator = 0;
    int temp1 = 0, temp2 = 0;
    double square_root1 = 0, square_root2 = 0;

    for (i = 0; i < vector_length; i++)
    {
        numerator += sentence1_vector[i] * sentence2_vector[i];
        temp1 += sentence1_vector[i] * sentence1_vector[i];
        temp2 += sentence2_vector[i] * sentence2_vector[i];
    }

    //TextWriter tw = new StreamWriter("E://testpdf/date2.txt");
    square_root1 = Math.Sqrt(temp1);
    square_root2 = Math.Sqrt(temp2);
    denominator = (float)(square_root1 * square_root2);

    if (denominator != 0){
        return (float)(numerator / denominator);
        //return (float)(numerator);
    }
    else{
        return 0;
    }
}

函数实现cosin(){
var string1=document.DPAform.str1.value;
var s1=stringBlankCheck(string1);
var string2=document.DPAform.str2.value;
var s2=stringBlankCheck(string2);
如果(s1.长度<1){
警报(“请输入字符串1”);
回来
}
如果(s2.1长度<1){
警报(“请输入字符串2”);
回来
}
document.DPAform.displayArea2.value=“”;
var sDT=新日期();
//var begin=new Date().getTime();
var cosin_相似性_值=相似性(s1,s2);
document.DPAform.displayArea2.value+='Cosin_相似度('+s1+','+s2+')='+Cosin_相似度_值+'%\n';
var eDT=新日期();
var timediff=sDT.dateDiff(“ms”,eDT);
//var timediff=(new Date().getTime()-begin);
document.DPAform.displayArea 2.value+=“总转义时间为:“+timediff+”(毫秒)。\n”;
}

即使两个句子有0%的相似性,我的代码也表示它们之间有一定程度的相似性。

请删除不需要重现问题的代码,例如注释中的代码。调试并缩小哪些部分的行为不符合预期。。。考虑更新你的帖子,只是用代码> GoCosiNeSimILimult函数和硬编码的输入值来显示你期望0但却得到其他东西的情况。@ BiJu:你尝试过从你所提供的网站转换确切的CousSimple(…)函数吗?如果我将代码转换为C#,我可以看到与网站类似的结果。或者你想采取与网站不同的方法?@Alexei Levenkov和@Siva Gopal,我已经通过调试发现了错误。我已经按照指示使用了硬编码输入,并找出了错误。谢谢你们两位。:-)
function implementationCosin(){
    var string1 = document.DPAform.str1.value;
    var s1 = stringBlankCheck(string1);

    var string2 = document.DPAform.str2.value;
    var s2 = stringBlankCheck(string2);

    if (s1.length < 1) {
        alert("Please input the string1.");
        return;
    }
    if (s2.length < 1) {
        alert("Please input the string2.");
        return;
    }

    document.DPAform.displayArea2.value = "";

    var sDT = new Date();
   // var begin = new Date().getTime();

    var cosin_similarity_value = consinSimilarity(s1, s2);
    document.DPAform.displayArea2.value += 'Cosin_Similarity(' + s1 + ',' + s2 + ')=' + cosin_similarity_value + '%\n';

    var eDT = new Date();
      var timediff = sDT.dateDiff("ms", eDT);
   // var timediff = (new Date().getTime() - begin);

    document.DPAform.displayArea2.value += "The total escaped time is: " + timediff + " (ms).\n";
}