labo-components
Version:
510 lines (497 loc) • 8.24 kB
JavaScript
export const sanitize = s => s.replace(/\.|,|:|;|\)|\(|"|'/g, '').toLowerCase();
export const createWordList = (words, searchTerm, size) => {
// sanitize words and remove short strings
words = words.map(w => sanitize(w)).filter(w => w.length > 1);
// Add word combinations [n, n+1]
for (let i = 0, len = words.length - 1; i < len; i++) {
words.push(words[i] + '_' + words[i + 1]);
}
// Filter by searchTerm
if (searchTerm) {
const searchTerms = searchTerm
.toLowerCase()
.trimLeft()
.trimRight()
.split(' ');
words = words.filter(w => searchTerms.some(s => w.indexOf(s) !== -1));
}
// Build word index
const wordIndex = {};
words.forEach(w => {
if (!(w in wordIndex)) {
wordIndex[w] = 1;
} else {
wordIndex[w] = wordIndex[w] + 1;
}
});
// generate items from index
const items = Object.keys(wordIndex)
// filter out combined words that have only score 1
.filter(w => wordIndex[w] > 1 || w.indexOf('_') == -1)
.map(w => ({
id: w,
label: w,
score: wordIndex[w],
size: 1
}))
.sort((a, b) => (a.score == b.score ? 0 : b.score - a.score))
// Optimization: As filtering the stopwords is quite heavy:
// 1. first slice to required size + length of stop words set
.slice(0, size + DutchStopWords.length)
// 2. exclude stopwords
.filter(item => {
// single word in stopwords
if (DutchStopWords.includes(item.id)) {
return false;
}
// combined word
if (item.id.indexOf('_') !== -1) {
const parts = item.id.split('_');
for (let i = 0, len = parts.length; i < len; i++) {
if (DutchStopWords.includes(parts[i])) {
return false;
}
}
}
return true;
})
// 3. slice again to get required size
.slice(0, size);
// get max score
let maxScore = items.reduce(
(maxScore, item) => (item.score > maxScore ? item.score : maxScore),
0
);
// calculate sqrt normalized size
items.forEach(item => {
item.size = Math.sqrt(item.score / maxScore);
});
return items;
};
// copy/adapted from https://github.com/stopwords-iso/stopwords-nl/blob/master/stopwords-nl.json
export const DutchStopWords = [
'aan',
'aangaande',
'aangezien',
'achte',
'achter',
'achterna',
'af',
'afgelopen',
'al',
'aldaar',
'aldus',
'alhoewel',
'alias',
'alle',
'allebei',
'alleen',
'alles',
'als',
'alsnog',
'altijd',
'altoos',
'ander',
'andere',
'anders',
'anderszins',
'beetje',
'behalve',
'behoudens',
'beide',
'beiden',
'ben',
'beneden',
'bent',
'bepaald',
'betreffende',
'bij',
'bijna',
'bijv',
'binnen',
'binnenin',
'blijkbaar',
'blijken',
'boven',
'bovenal',
'bovendien',
'bovengenoemd',
'bovenstaand',
'bovenvermeld',
'buiten',
'bv',
'daar',
'daardoor',
'daarheen',
'daarin',
'daarna',
'daarnet',
'daarom',
'daarop',
'daaruit',
'daarvanlangs',
'dan',
'dat',
'de',
'deden',
'deed',
'der',
'derde',
'derhalve',
'dertig',
'deze',
'dhr',
'die',
'dikwijls',
'dit',
'doch',
'doe',
'doen',
'doet',
'door',
'doorgaand',
'drie',
'duizend',
'dus',
'echter',
'een',
'eens',
'eer',
'eerdat',
'eerder',
'eerlang',
'eerst',
'eerste',
'eigen',
'eigenlijk',
'elk',
'elke',
'en',
'enig',
'enige',
'enigszins',
'enkel',
'er',
'erdoor',
'erg',
'ergens',
'etc',
'etcetera',
'even',
'eveneens',
'evenwel',
'gauw',
'ge',
'gedurende',
'geen',
'gehad',
'gekund',
'geleden',
'gelijk',
'gemoeten',
'gemogen',
'genoeg',
'geweest',
'gewoon',
'gewoonweg',
'haar',
'haarzelf',
'had',
'hadden',
'hare',
'heb',
'hebben',
'hebt',
'hedden',
'heeft',
'heel',
'hem',
'hemzelf',
'hen',
'het',
'hetzelfde',
'hier',
'hierbeneden',
'hierboven',
'hierin',
'hierna',
'hierom',
'hij',
'hijzelf',
'hoe',
'hoewel',
'honderd',
'hun',
'hunne',
'ieder',
'iedere',
'iedereen',
'iemand',
'iets',
'ik',
'ikzelf',
'in',
'inderdaad',
'inmiddels',
'intussen',
'inzake',
'is',
'ja',
'je',
'jezelf',
'jij',
'jijzelf',
'jou',
'jouw',
'jouwe',
'juist',
'jullie',
'kan',
'klaar',
'kon',
'konden',
'krachtens',
'kun',
'kunnen',
'kunt',
'laatst',
'later',
'liever',
'lijken',
'lijkt',
'maak',
'maakt',
'maakte',
'maakten',
'maar',
'mag',
'maken',
'me',
'meer',
'meest',
'meestal',
'men',
'met',
'mevr',
'mezelf',
'mij',
'mijn',
'mijnent',
'mijner',
'mijzelf',
'minder',
'miss',
'misschien',
'missen',
'mits',
'mocht',
'mochten',
'moest',
'moesten',
'moet',
'moeten',
'mogen',
'mr',
'mrs',
'mw',
'na',
'naar',
'nadat',
'nam',
'namelijk',
'nee',
'neem',
'negen',
'nemen',
'nergens',
'net',
'niemand',
'niet',
'niets',
'niks',
'noch',
'nochtans',
'nog',
'nogal',
'nooit',
'nu',
'nv',
'of',
'ofschoon',
'om',
'omdat',
'omhoog',
'omlaag',
'omstreeks',
'omtrent',
'omver',
'ondanks',
'onder',
'ondertussen',
'ongeveer',
'ons',
'onszelf',
'onze',
'onzeker',
'ooit',
'ook',
'op',
'opnieuw',
'opzij',
'over',
'overal',
'overeind',
'overige',
'overigens',
'paar',
'pas',
'per',
'precies',
'recent',
'redelijk',
'reeds',
'rond',
'rondom',
'samen',
'sedert',
'sinds',
'sindsdien',
'slechts',
'sommige',
'spoedig',
'steeds',
'tamelijk',
'te',
'tegen',
'tegenover',
'tenzij',
'terwijl',
'thans',
'tien',
'tiende',
'tijdens',
'tja',
'toch',
'toe',
'toen',
'toenmaals',
'toenmalig',
'tot',
'totdat',
'tussen',
'twee',
'tweede',
'u',
'uit',
'uitgezonderd',
'uw',
'vaak',
'vaakwat',
'van',
'vanaf',
'vandaan',
'vanuit',
'vanwege',
'veel',
'veeleer',
'veertig',
'verder',
'verscheidene',
'verschillende',
'vervolgens',
'via',
'vier',
'vierde',
'vijf',
'vijfde',
'vijftig',
'vol',
'volgend',
'volgens',
'voor',
'vooraf',
'vooral',
'vooralsnog',
'voorbij',
'voordat',
'voordezen',
'voordien',
'voorheen',
'voorop',
'voorts',
'vooruit',
'vrij',
'vroeg',
'waar',
'waarom',
'waarschijnlijk',
'wanneer',
'want',
'waren',
'was',
'wat',
'we',
'wederom',
'weer',
'weg',
'wegens',
'weinig',
'wel',
'weldra',
'welk',
'welke',
'werd',
'werden',
'werder',
'wezen',
'whatever',
'wie',
'wiens',
'wier',
'wij',
'wijzelf',
'wil',
'wilden',
'willen',
'word',
'worden',
'wordt',
'zal',
'ze',
'zei',
'zeker',
'zelf',
'zelfde',
'zelfs',
'zes',
'zeven',
'zich',
'zichzelf',
'zij',
'zijn',
'zijne',
'zijzelf',
'zo',
'zoals',
'zodat',
'zodra',
'zonder',
'zou',
'zouden',
'zowat',
'zulk',
'zulke',
'zullen',
'zult',
// additions
"z'n",
'één',
"d'r",
'nou',
'mmm',
'hè',
'ie',
'oh',
'dr',
'zn'
];