agentsqripts
Version:
Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems
43 lines (37 loc) • 2.11 kB
JavaScript
/**
* @file Content-based similarity calculator using advanced string distance algorithms
* @description Single responsibility: Assess code block similarity through normalized textual content analysis
*
* This calculator implements sophisticated content-based similarity using Levenshtein distance
* to detect textual similarity between code blocks. It serves as the foundation layer for
* similarity assessment, catching cases where structural analysis might miss surface-level
* code duplication or near-duplicate implementations.
*
* Design rationale:
* - Content normalization reduces noise from formatting and naming differences
* - Levenshtein distance provides accurate measurement of textual similarity between implementations
* - Normalized scoring (0.0 to 1.0) enables consistent similarity comparison across content lengths
* - Fallback to raw content ensures analysis continues when normalization unavailable
* - Edge case handling for empty content prevents calculation errors
*
* Content similarity methodology:
* - Normalized content preferred for cleaner similarity assessment without formatting noise
* - Levenshtein distance measures minimum edit operations needed to transform one block to another
* - Distance normalization by maximum content length provides proportional similarity scoring
* - Perfect similarity (1.0) for identical content after normalization
* - Zero similarity (0.0) for completely different implementations requiring full rewrite
*/
const levenshtein = require('../../../../utils/levenshtein');
/**
* Calculate content similarity using normalized content
*/
function calculateContentSimilarity(block1, block2) {
const content1 = block1.normalizedContent || block1.content;
const content2 = block2.normalizedContent || block2.content;
// Use Levenshtein distance for content similarity
const distance = levenshtein(content1, content2);
const maxLength = Math.max(content1.length, content2.length);
if (maxLength === 0) return 1.0;
return 1 - (distance / maxLength);
}
module.exports = calculateContentSimilarity;