0
votes

Comment écrire un algorithme de regroupement qui regroupe des éléments dans DataSet en ayant 3 propriétés similaires ou plus

Je construis un outil pour mon client qui regroupe des mots-clés basés sur les 10 meilleures URL de recherche Google. Le mot-clé est représenté comme objet JavaScript contenant une gamme d'URL. Les critères de regroupement sont que deux mots-clés appartiennent au même groupe s'ils ont 3 ou plus en commun . De plus, il devrait y avoir aucune duplication de mots-clés en groupes générés et le nombre total de groupes générés n'est pas prédéfini avant le regroupement. J'apprécierais tous les conseils sur la partie la partie de ce problème, merci!

Jusqu'à présent, j'ai réussi à développer l'algorithme fourni ci-dessous, mais il fait encore des doublons et ne groupez pas le mot-clé 100% à droite (Certains mots-clés doivent être dans le même groupe, mais ils ne sont pas). xxx

Je m'attendais à la sortie de INPUT.JSON à être sortie.csv , mais ma solution soit met moins de mots-clés dans un groupe ou fait les mauvais groupes.


1 commentaires

Dites aux mots-clés 1, 13 et 47 partagent les mêmes 3 URL [A, B, C]. Votre code créera des groupes de [1,13,47], puis [13,47] - est que le comportement souhaité? Il est vraiment difficile d'aller au regard de votre ensemble de données et des résultats attendus pouvez-vous indiquer que quelque chose qui montre le problème au sein de 10 enregistrements?


3 Réponses :


1
votes

L'un des problèmes possibles pourrait être la façon dont vous filtrez le tableau DataSet en boucle et filtré à l'intérieur de sa propre boucle. Vous pouvez filtrer le jeu de données Dataset lui-même.


0 commentaires

1
votes

Regarder le résultat, je ne pense pas que cela soit correct car il en résulte 135 "groupes" et le nombre attendu est 87 et le code d'origine produit 88

Je pense que votre problème est en haut de votre code xxx

vous mutation Dataset à l'intérieur de la DataSet.foreach fonction

Je pense que cela doit être xxx


0 commentaires

1
votes

Ceci peut être simplifié dans un seul Réduire Code> Invocation Fn pour éviter les effets secondaires et la confusion:

const out = data.reduce((acc, current, index) => {
  const maybeGroup = acc.findIndex(
    el => _.intersection(current.urls, el.urls).length > 3
  );
  if (maybeGroup !== -1 || maybeGroup === 0) {
    if(!acc[maybeGroup].searches.includes(current.keyword)) {
      acc[maybeGroup].searches.push(current.keyword);
      return acc;
    }
    return acc;
  } else {
    acc.push({
      mainKeyword: current.keyword,
      searches: [],
      urls: current.urls
    });
    return acc;
  }
}, []);
console.log(out.map(x => _.pick(x, ['mainKeyword', 'searches'])))


0 commentaires