wikimedica-disease-search/app/src/data/fuzzy.js

79 lines
1.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import * as diacritics from 'diacritics';
/**
* Motifs de désuffixation des mots français.
*/
const stemPatterns = [
[/aux$/, 'al'],
[/(.)s$/, '$1'],
[/(.)e$/, '$1'],
];
/**
* Motif de séparation des mots.
*/
const splitPattern = /[\s-]+/g;
/**
* Désuffixe un mot français.
*
* @param word Mot originel.
* @return Mot désuffixé.
*/
const stemWord = word =>
{
let result = word;
for (let [pattern, replacement] of stemPatterns)
{
result = result.replace(pattern, replacement);
}
return result;
};
/**
* Met le nom dun terme sous forme normalisée pour la recherche approximative.
*
* Dans la forme normalisée, tous les accents sont ôtés, la casse est réduite
* en minuscules et les mots sont désuffixés.
*
* @param name Nom à normaliser.
* @return Liste des mots du nom de terme normalisé.
*/
const normalizeName = name =>
name.toLowerCase()
.split(splitPattern)
.map(stemWord)
.map(word => diacritics.remove(word));
/**
* Filtre une liste de termes pour ne garder que ceux qui sont similaires à une
* saisie.
*
* @param search Contenu de la saisie.
* @param term Terme à vérifier.
* @return Ensemble des termes sélectionnés.
*/
export const filterTerms = (search, terms) =>
{
// Normalisation des mots recherchés
const needle = normalizeName(search);
console.log(needle);
return terms.filter(term =>
{
// Normalisation du nom et des alias du terme
const haystack = [term.name].concat(term.alias)
.map(normalizeName)
.reduce((prev, next) => prev.concat(next), []);
return needle.every(item =>
haystack.some(word =>
word.startsWith(item)
)
);
});
};