discussion
Version:
Basic implementating to help altering between ongoing SpeechRecognition and intermittant SpeechSynthesis
49 lines (48 loc) • 1.86 kB
JavaScript
// copypaste from https://github.com/aceakash/string-similarity/blob/master/src/index.js but typed
export function compareTwoStrings(first, second) {
first = first.replace(/\s+/g, '');
second = second.replace(/\s+/g, '');
if (first === second)
return 1; // identical or empty
if (first.length < 2 || second.length < 2)
return 0; // if either is a 0-letter or 1-letter string
let firstBigrams = new Map();
for (let i = 0; i < first.length - 1; i++) {
const bigram = first.substring(i, i + 2);
const count = firstBigrams.has(bigram)
? firstBigrams.get(bigram) + 1
: 1;
firstBigrams.set(bigram, count);
}
;
let intersectionSize = 0;
for (let i = 0; i < second.length - 1; i++) {
const bigram = second.substring(i, i + 2);
const count = firstBigrams.has(bigram)
? firstBigrams.get(bigram)
: 0;
if (count > 0) {
firstBigrams.set(bigram, count - 1);
intersectionSize++;
}
}
return (2.0 * intersectionSize) / (first.length + second.length - 2);
}
export function findBestMatch(mainString, targetStrings) {
const ratings = [];
let bestMatchIndex = 0;
for (let i = 0; i < targetStrings.length; i++) {
const currentTargetString = targetStrings[i];
const currentRating = compareTwoStrings(mainString, currentTargetString);
ratings.push({ target: currentTargetString, rating: currentRating });
if (currentRating > ratings[bestMatchIndex].rating) {
bestMatchIndex = i;
}
}
const bestMatch = ratings[bestMatchIndex];
return { ratings: ratings, bestMatch: bestMatch, bestMatchIndex: bestMatchIndex };
}
export class BestMatchResult {
}
export class Rating {
}