Примитивный скрипт на JavaScript
, подсчитывающий кол-во повторений английских слов без учёта морфологии и пр. лингво-хитростей:
"use strict"; /* eslint-env es6 */ const fs = require('fs'); function calculate(source) { const words = source .toLowerCase() .replace(/[^a-z0-9'’]+/gm, ' ') .split(/\s+/) .filter(s => s.length) .reduce((map, word) => { if(!map.get(word)) map.set(word, 0); map.set(word, map.get(word) + 1); return map; }, new Map()); return Array.from(words) .sort((a, b) => a[1] < b[1] ? 1 : -1); } const [,, sourceF, destinationF ] = process.argv; if(!fs.existsSync(sourceF)) throw new Error('Couldn\'t find "' + sourceF + '" file'); const source = fs.readFileSync(sourceF).toString(); const words = calculate(source); console.info('Found ' + words.length + ' words.'); const str = words .map(([word, count]) => `${word} = ${count}`) .join('\n'); fs.writeFileSync(destinationF, str); console.info('Count-map\'s written into "' + destinationF + '" file');
Из простых, но действенных, решений можно фильтровать все слова:
- с апострофами (Mike’s, I’m, You’re, Can’t, Don’t, You’ll, etc)
- отдельно стоящие числа (или вообще все слова с числами)
Если хочется больше заморочиться, то можно сподобиться и написать морфологическую “определялку” является ли слово множественной формой какого-то из других представленных слов. Но, по сути, чем глубже закопаешься, тем очевиднее будет, что для серьёзных задач стоит взять серьёзную лингво-либу.