My titles are too similar - added a title similarity threshold  🤪 📑

In yesterday's email I recommended reading the article How to Create List of Related Content in Gatsby.JS.

I liked the approach of using both titles and tags to find similar content, especially since I can be a little sloppy with my tags and have not retroactively added it all emails yet.

However, my titles are a little too similar... Loads of "How to" and "Gatsby" give us some false positives.

The similarity is calculated using: # of matching tags + 3.0 * title string similarity in the article.

I decided to remove "Gatsby" from the titles when comparing and set a threshold for when title similarity is activated to combat my issue.

I wanted to play around with the threshold, so I made it an argument so I would not have to run develop again and again to test threshold changes.

exports.createResolvers = ({ createResolvers }) =>
  createResolvers({
    QueenEmail: {
      relatedEmails: {
        type: "[QueenEmail!]",
        args: { limit: "Int", titleTreshold: "Float" },
        async resolve(source, args, context, info) {
          const limit = args.limit || 3;
          const titleTreshold = args.titleTreshold || 0.7;

          let otherEmails = await context.nodeModel.runQuery({
            firstOnly: false,
            type: `QueenEmail`,
            query: {
              filter: {
                slug: {
                  ne: source.slug,
                }, // not current email
              },
            },
          });

          return otherEmails
            .map((email) => {
              const intersectingTags = intersectionBy(
                source.tags,
                email.tags,
                "slug"
              );

              const titleScore = stringSimilarity.compareTwoStrings(
                source.title.replace("Gatsby", ""),
                email.title
              );

              // titleSimilarity = 0 if treshold is not met
              const titleSimilarity =
                titleScore > titleTreshold ? titleScore : 0;

              return {
                ...email,
                similarity: intersectingTags.length + 3.0 * titleSimilarity,
              };
            })
            .filter(({ similarity }) => similarity !== 0)
            .sort((a, b) => {
              return b.similarity - a.similarity;
            })
            .slice(0, limit);
        },
      },
    },
  });

What would you compare?

 
All the best,
Queen Raae

Stuck on a reef in the sharky waters around the Gatsby islands?

Book a 1-on-1 Gatsby Call with Queen Raae. Friendly advice you can put into action immediately, guaranteed!

Serious about Gatsby? Sign up for emails sent every weekday to help you get the most out of Gatsby!