{"version":3,"file":"computeSimilarity.cjs","names":[],"sources":["../../../src/docReview/computeSimilarity.ts"],"sourcesContent":["/**\n * Generate the set of character shingles (substrings of a fixed length) for a\n * piece of text. Whitespace is collapsed so the result is language agnostic.\n *\n * @param text - The text to shingle.\n * @param shingleLength - The length of each shingle.\n * @returns The set of unique shingles found in the text.\n */\nexport const generateCharacterShingles = (\n  text: string,\n  shingleLength: number\n): Set<string> => {\n  const normalized = text.replace(/\\s+/g, ' ').trim();\n  const set = new Set<string>();\n  if (normalized.length < shingleLength) {\n    if (normalized.length > 0) {\n      set.add(normalized);\n    }\n    return set;\n  }\n  for (let index = 0; index <= normalized.length - shingleLength; index += 1) {\n    set.add(normalized.slice(index, index + shingleLength));\n  }\n  return set;\n};\n\n/**\n * Compute the Jaccard similarity between two strings using character shingles.\n *\n * @param a - First string.\n * @param b - Second string.\n * @param shingleLength - The shingle length (defaults to 3).\n * @returns A score between 0 (disjoint) and 1 (identical).\n */\nexport const computeJaccardSimilarity = (\n  a: string,\n  b: string,\n  shingleLength: number = 3\n): number => {\n  const setA = generateCharacterShingles(a, shingleLength);\n  const setB = generateCharacterShingles(b, shingleLength);\n  if (setA.size === 0 && setB.size === 0) return 1;\n  const intersectionSize = Array.from(setA).filter((token) =>\n    setB.has(token)\n  ).length;\n  const unionSize = new Set([...Array.from(setA), ...Array.from(setB)]).size;\n  return unionSize === 0 ? 0 : intersectionSize / unionSize;\n};\n"],"mappings":";;;;;;;;;;AAQA,MAAa,6BACX,MACA,kBACgB;CAChB,MAAM,aAAa,KAAK,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK;CAClD,MAAM,sBAAM,IAAI,IAAY;CAC5B,IAAI,WAAW,SAAS,eAAe;EACrC,IAAI,WAAW,SAAS,GACtB,IAAI,IAAI,UAAU;EAEpB,OAAO;CACT;CACA,KAAK,IAAI,QAAQ,GAAG,SAAS,WAAW,SAAS,eAAe,SAAS,GACvE,IAAI,IAAI,WAAW,MAAM,OAAO,QAAQ,aAAa,CAAC;CAExD,OAAO;AACT;;;;;;;;;AAUA,MAAa,4BACX,GACA,GACA,gBAAwB,MACb;CACX,MAAM,OAAO,0BAA0B,GAAG,aAAa;CACvD,MAAM,OAAO,0BAA0B,GAAG,aAAa;CACvD,IAAI,KAAK,SAAS,KAAK,KAAK,SAAS,GAAG,OAAO;CAC/C,MAAM,mBAAmB,MAAM,KAAK,IAAI,CAAC,CAAC,QAAQ,UAChD,KAAK,IAAI,KAAK,CAChB,CAAC,CAAC;CACF,MAAM,6BAAY,IAAI,IAAI,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,EAAC,CAAC;CACtE,OAAO,cAAc,IAAI,IAAI,mBAAmB;AAClD"}