比较对象数组并分配相似度得分

时间:2019-10-21 16:56:37

标签: javascript

我正在尝试比较两个对象数组,并根据该数组中的常见项目为它们分配相似性得分。

我能够比较数组,但是在对象数组上使用相同的概念时遇到了问题。

let array1 = [{key1:['item1','item2','item3','item4']},{key2:['event3','event4']}];
let array2 = [{key1:['item1','item4','item2','item8']},{key2:['event4','event2']}];

let arrayA=['item1','item2','item3','item4'];
let arrayB=['item1','item4','item2','item8'];
function SimilarityPercentage(arrayA,arrayB){
  let answer =arrayA.filter(function(item) {
     return arrayB.indexOf(item) >= 0;
  }).length
  return answer/(Math.max(arrayA.length,arrayB.length))*100
}
console.log(SimilarityPercentage(arrayA,arrayB));// 75 

给出array1和array2,我希望结果分成相似度得分,类似于上面的函数。我想使用rand指数计算:https://en.wikipedia.org/wiki/Rand_index#targetText=The%20Rand%20index%20or%20Rand,is%20the%20adjusted%20Rand%20index

3 个答案:

答案 0 :(得分:1)

您可以获取值并计算共同得分。

function similarityPercentage(arrayA, arrayB) {            
    return 100 * arrayA.filter(Set.prototype.has, new Set(arrayB)).length / Math.max(arrayA.length, arrayB.length);
}

function similarities(a, b) {
    var parts = a.map((o, i) => similarityPercentage(Object.values(o)[0], Object.values(b[i])[0]));
    return parts.reduce((a, b) => a + b, 0) / parts.length;
}

var array1 = [{ key1: ['item1', 'item2', 'item3', 'item4'] }, { key2: ['event3', 'event4'] }],
    array2 = [{ key1: ['item1', 'item4', 'item2', 'item8'] }, { key2: ['event4', 'event2'] }],
    arrayA = ['item1', 'item2', 'item3', 'item4'],
    arrayB = ['item1', 'item4', 'item2', 'item8'];

console.log(similarityPercentage(arrayA, arrayB)); // 75
console.log(similarities(array1, array2));         // 62.5

答案 1 :(得分:0)

您可以执行以下操作:

var array1 = [val1,val2,val3];
var array2 = [val1,val4,val5];
var sim = [];
var simscore = 9;

if (array1.length > array2.length) {
      for (var i = 0; i < array1.length; i++) {
            if(array1[i] == array2[i]) {
                   sim.push(i);
                   simarr = array1;
                   simscore ++;
             }
       }
}else{
       for (var i = 0; i < array2.length; i++) {
            if(array1[i] == array2[i]) {
                   sim.push(i);
                   simarr = array2;
                   simscore ++;
             }
       }
}
console.log(sim);
console.log("Percent similar: ", simscore/simarr.length);

这会将相似的索引添加到数组sim并将相似索引的计数增加1(始终用于较长的数组),然后打印相似性百分比。

答案 2 :(得分:0)

首先,示例数组的结构不正确,如果您对它们进行重组,可以更快地解决问题。

由于您尚未提供用于计算 array1 array2 之间相似度的公式,因此我假设这些数组中的每个数组都具有相等的长度,并且其中的每个项目表示一个仅具有一个属性(具有相同名称)的对象,并且该属性本身是一个数组。一种明显的方法是计算要计算的这两个数组的相关子数组的每个相似度分数,然后通过平均每个键的相似度分数来计算总相似度。

假设:

  • array1 array2 的长度相等
  • array1 nth 元素仅具有一个名称为 keyFoo nth 元素为< em> array2 也只有一个名称为 keyFoo keyFoo 的属性,这两个数组本身就是数组,必须相互比较。

可以使用已经提供的SimilarityPercentage函数来快速完成此操作:

function SimilarityPercentage2 (array1, array2) {
  let similaritySum = 0;
  
  for (let i = 0; i < array1.length; i++) {
    const elem = array1[i];
    
    const key = Object.keys(elem)[0];
    
    similaritySum += SimilarityPercentage(elem[key], array2[i][key]);
  }
  
  return similaritySum / array1.length;
}

console.log(SimilarityPercentage2(array1, array2));
// output: 62.5