All files / packages/utils/src/server trigram.ts

27.27% Statements 6/22
0% Branches 0/2
0% Functions 0/6
27.27% Lines 6/22

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 356x               6x                 6x     6x           6x             6x  
const trigramsForWord = (word: string) => {
	const paddedWord = `  ${word} `;
	return paddedWord
		.slice(0, -2)
		.split("")
		.map((_, index) => paddedWord.slice(index, index + 3));
};
 
const jaccardSize = (a: Set<string>, b: Set<string>) => {
	const intersectionSize = a.intersection(b).size;
	const unionSize = a.union(b).size;
	if (unionSize === 0) {
		return 0;
	}
	return intersectionSize / unionSize;
};
 
export const trigramsForString = (text: string): Set<string> =>
	new Set(text.toLowerCase().split(" ").flatMap(trigramsForWord));
 
export const trigramSimilarity = (a: string, b: string) => {
	const trigramsA = trigramsForString(a);
	const trigramsB = trigramsForString(b);
	return jaccardSize(trigramsA, trigramsB);
};
 
export const wordSimilarity = (a: string, b: string) => {
	const trigramsA = trigramsForString(a);
	const trigramsB = trigramsForString(b);
	const intersectionSize = trigramsA.intersection(trigramsB).size;
	return intersectionSize / trigramsA.size;
};
 
export const SIMILARTY_THRESHOLD = 0.33;