From 0cbbd4bfb0bf5ee7e3bd5286e065209ad819000a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=AF=D1=80=D0=BE=D1=81=D0=BB=D0=B0=D0=B2?= Date: Sun, 22 Apr 2018 23:38:12 +0300 Subject: [PATCH] Complete with bug --- Tasks/tweets_analysis/index.js | 210 +++++++++++++++++++++-- Tasks/tweets_analysis/languages.js | 45 +++++ Tasks/tweets_analysis/newIndex.js | 213 ++++++++++++++++++++++++ Tasks/tweets_analysis/parser.js | 61 +++++++ Tasks/tweets_analysis/populateAutors.js | 25 +++ Tasks/tweets_analysis/printRetweets.js | 20 +++ Tasks/tweets_analysis/retweet.js | 62 +++++++ Tasks/tweets_analysis/words.js | 58 +++++++ 8 files changed, 680 insertions(+), 14 deletions(-) create mode 100644 Tasks/tweets_analysis/languages.js create mode 100644 Tasks/tweets_analysis/newIndex.js create mode 100644 Tasks/tweets_analysis/parser.js create mode 100644 Tasks/tweets_analysis/populateAutors.js create mode 100644 Tasks/tweets_analysis/printRetweets.js create mode 100644 Tasks/tweets_analysis/retweet.js create mode 100644 Tasks/tweets_analysis/words.js diff --git a/Tasks/tweets_analysis/index.js b/Tasks/tweets_analysis/index.js index 04f5ea8..89ad055 100644 --- a/Tasks/tweets_analysis/index.js +++ b/Tasks/tweets_analysis/index.js @@ -1,24 +1,108 @@ 'use strict'; -const LineByLineReader = require('line-by-line'), - lr = new LineByLineReader('./input/dataSet.csv'); +// let pa = require('./populateAutors'), +// printPopulateAuthors = pa.printPopulateAuthors; +// let pr = require('./printRetweets'), +// printRetwits = pr.printRetwits; +// let ra = require('./retweet'), +// RetweetsAnalyse = ra.RetweetsAnalyse; +let tp = require('./parser'), + TwitParser = tp.TwitParser; +let wca = require('./words'), + WordCountAnalyse = wca.WordCountAnalyse; +// let pl = require('./languages'), +// printLanguages = pl.printLanguages; -const data = []; + + + +function RetweetsAnalyse() { + let twits = {}; + + //hазбиваем строки на слова + function parseWords(ss) { + const delimeters = " \"\t\n,.:;?!/-+="; //разделители слов + const url_symbols = ":/."; //урлы как отдельный элемент + const exclude_words = [ "#" ]; //исключения + let words = []; //массив слов + let ws = 0; //счетчик слов + for (let i = 0; i <= ss.length; i++) { //для каждого элемента строки + if (i == ss.length || delimeters.indexOf(ss[i]) >= 0) { //если счетчик равен длине строки или элемент строки в разделителях + if (i > ws) { //если счетчик символов больше счетчика слов + let word = ss.substring(ws, i); //слово - равно подстроке от счетчика слов до счетчика + let is_url = word.startsWith('http') && url_symbols.indexOf(ss[i]) >= 0; //проверка на урл + if (!is_url) { //если не урл + if (exclude_words.indexOf(word) < 0) { //если в слове нет исключений + words.push(word.toLowerCase()); //в нижний регистр и в массив слов + } + ws = i + 1; //счетчик слов счетчик +1 + } + } else { + ws = i + 1; //счетчик слов счетчик +1 + } + } + } + return words; //возвращаем массив слов + } + + //анализируем количество повторений + this.analyse = (twit) => { //стрелочная функция приинимает твит на вход + for (let word of parseWords(twit.content)) { //для каждого слова в теле твита + if (!words[word]) { //если слово не встречалось ранее + words[word] = 0; //рейтинг 0 + } + words[word]++; //добавляем рейтинг + } + } + + //выводим данные по словам + this.printWords = (count) => { + let word_array = []; + for (let word in words) { + word_array.push(word); + } + + //сортируем полученный массив + word_array.sort((w1, w2) => { + if (words[w1] < words[w2]) return 1; + if (words[w1] > words[w2]) return -1; + return 0; + }); + + + console.log(count + " наиболее часто встречающихся слов"); + for (let i = 0; i < count; i++) { + console.log(' ', words[word_array[i]], '-->', word_array[i]); + } + } +} + +const LineByLineReader = require('line-by-line'), //импортируем модуль, npm install line-by-line + lr = new LineByLineReader('./input/dataSet.csv'); //реализуем ридер, в параметр датасет с относительным путем + +const twits = []; +let line_count = 0; + +const twitParser = new TwitParser(); +const wordAnalysator = new WordCountAnalyse(); lr.on('error', function (err) { - // 'err' contains error object + console.log('error', err); }); lr.on('line', function (line) { - // pause emitting of lines... - lr.pause(); - - // ...do your asynchronous line processing.. - setTimeout(function () { - // ...and continue emitting lines. - data.push(line); - lr.resume(); - }, 100); + if (line_count > 0) { // Первую строку не обрабатываем (в ней заголовок CSV файла) + const twit = twitParser.parse(line); + if (twit) { + // Обрабытываем твит + wordAnalysator.analyse(twit); + twits.push(twit); + } + } + line_count++; + if (line_count % 5000 == 0) { + console.log('обработано', line_count, 'строк'); + } }); lr.on('end', function () { @@ -26,6 +110,104 @@ lr.on('end', function () { main(); }); -function main () { +function printRetwits(count) { + twits.sort((t1, t2) => { + let rt1 = Number(t1.rts); + let rt2 = Number(t2.rts); + if (rt1 < rt2) return 1; + if (rt1 > rt2) return -1; + return 0; + }); + + console.log(''); + console.log(count + " наиболее популярных твитов"); + for (let i = 0; i < count; i++) { + const twit = twits[i]; + console.log(''); + console.log(' Автор', twit.nickname); + console.log(' Содержимое', twit.content); + console.log(' ', twit.rts, 'ретвитов'); + } +} + +function printPopulateAuthors(count) { + const authors = {}; + for (let twit of twits) { + authors[twit.username] = { nickname : twit.nickname, followers : Number(twit.followers)}; + } + + let authors_array = []; + for (let username in authors) { + authors_array.push(username); + } + + authors_array.sort((a1, a2) => { + if (authors[a1].followers < authors[a2].followers) return 1; + if (authors[a1].followers > authors[a2].followers) return -1; + return 0; + }); + + console.log(''); + console.log(count + " наиболее популярных авторов"); + for (let i = 0; i < count; i++) { + let author = authors[authors_array[i]]; + console.log(' ', author.followers, 'фолловеров -->', author.nickname); + } +} + +//отображение используемых языков +function printLanguages(count) { + const langs = {}; //пустой объект языков + for (let twit of twits) { //для каждого твита из свиска + if (!langs[twit.language]) { // + langs[twit.language] = { twitCount : 0, retwitCount : 0}; + } + if (twit.content.startsWith("RT @")) { + langs[twit.language].retwitCount++; + } else { + langs[twit.language].twitCount++; + } + } + + let langs_array = []; + for (let lang in langs) { + langs_array.push(lang); + } + + langs_array.sort((l1, l2) => { + if (langs[l1].twitCount < langs[l2].twitCount) return 1; + if (langs[l1].twitCount > langs[l2].twitCount) return -1; + return 0; + }); + + console.log(""); + console.log(count + " стран-производителей твитов"); + for (let i = 0; i < count; i++) { + let lang = langs[langs_array[i]]; + console.log(' ', lang.twitCount, 'твитов -->', langs_array[i]); + } + + langs_array.sort((l1, l2) => { + if (langs[l1].retwitCount < langs[l2].retwitCount) return 1; + if (langs[l1].retwitCount > langs[l2].retwitCount) return -1; + return 0; + }); + + console.log(""); + console.log(count + " стран-потребителей твитов"); + for (let i = 0; i < count; i++) { + let lang = langs[langs_array[i]]; + console.log(' ', lang.retwitCount, 'ретвитов -->', langs_array[i]); + } +} + +function main() { + console.log('обработано', line_count, 'строк'); + console.log(""); + console.log('обработано', twits.length, 'твитов'); + wordAnalysator.printWords(10); + printRetwits(10); + printPopulateAuthors(10); + printLanguages(10); } \ No newline at end of file diff --git a/Tasks/tweets_analysis/languages.js b/Tasks/tweets_analysis/languages.js new file mode 100644 index 0000000..4fbd4df --- /dev/null +++ b/Tasks/tweets_analysis/languages.js @@ -0,0 +1,45 @@ +function printLanguages(count) { + const langs = {}; //пустой объект языков + for (let twit of twits) { //для каждого твита из свиска + if (!langs[twit.language]) { // + langs[twit.language] = { twitCount : 0, retwitCount : 0}; + } + if (twit.content.startsWith("RT @")) { + langs[twit.language].retwitCount++; + } else { + langs[twit.language].twitCount++; + } + } + + let langs_array = []; + for (let lang in langs) { + langs_array.push(lang); + } + + langs_array.sort((l1, l2) => { + if (langs[l1].twitCount < langs[l2].twitCount) return 1; + if (langs[l1].twitCount > langs[l2].twitCount) return -1; + return 0; + }); + + console.log(""); + console.log(count + " стран-производителей твитов"); + for (let i = 0; i < count; i++) { + let lang = langs[langs_array[i]]; + console.log(' ', lang.twitCount, 'твитов -->', langs_array[i]); + } + + langs_array.sort((l1, l2) => { + if (langs[l1].retwitCount < langs[l2].retwitCount) return 1; + if (langs[l1].retwitCount > langs[l2].retwitCount) return -1; + return 0; + }); + + console.log(""); + console.log(count + " стран-потребителей твитов"); + for (let i = 0; i < count; i++) { + let lang = langs[langs_array[i]]; + console.log(' ', lang.retwitCount, 'ретвитов -->', langs_array[i]); + } +} +module.exports = {printLanguages} \ No newline at end of file diff --git a/Tasks/tweets_analysis/newIndex.js b/Tasks/tweets_analysis/newIndex.js new file mode 100644 index 0000000..23de36c --- /dev/null +++ b/Tasks/tweets_analysis/newIndex.js @@ -0,0 +1,213 @@ +'use strict'; + +// let pa = require('./populateAutors'), +// printPopulateAuthors = pa.printPopulateAuthors; +// let pr = require('./printRetweets'), +// printRetwits = pr.printRetwits; +// let ra = require('./retweet'), +// RetweetsAnalyse = ra.RetweetsAnalyse; +let tp = require('./parser'), + TwitParser = tp.TwitParser; +let wca = require('./words'), + WordCountAnalyse = wca.WordCountAnalyse; +// let pl = require('./languages'), +// printLanguages = pl.printLanguages; + + + + +function RetweetsAnalyse() { + let twits = {}; + + //разбиваем строки на слова + function parseWords(ss) { + const delimeters = " \"\t\n,.:;?!/-+="; //разделители слов + const url_symbols = ":/."; //урлы как отдельный элемент + const exclude_words = [ "#" ]; //исключения + let words = []; //массив слов + let ws = 0; //счетчик слов + for (let i = 0; i <= ss.length; i++) { //для каждого элемента строки + if (i == ss.length || delimeters.indexOf(ss[i]) >= 0) { //если счетчик равен длине строки или элемент строки в разделителях + if (i > ws) { //если счетчик символов больше счетчика слов + let word = ss.substring(ws, i); //слово - равно подстроке от счетчика слов до счетчика + let is_url = word.startsWith('http') && url_symbols.indexOf(ss[i]) >= 0; //проверка на урл + if (!is_url) { //если не урл + if (exclude_words.indexOf(word) < 0) { //если в слове нет исключений + words.push(word.toLowerCase()); //в нижний регистр и в массив слов + } + ws = i + 1; //счетчик слов счетчик +1 + } + } else { + ws = i + 1; //счетчик слов счетчик +1 + } + } + } + return words; //возвращаем массив слов + } + + //анализируем количество повторений + this.analyse = (twit) => { //стрелочная функция приинимает твит на вход + for (let word of parseWords(twit.content)) { //для каждого слова в теле твита + if (!words[word]) { //если слово не встречалось ранее + words[word] = 0; //рейтинг 0 + } + words[word]++; //добавляем рейтинг + } + } + + //выводим данные по словам + this.printWords = (count) => { + let word_array = []; + for (let word in words) { + word_array.push(word); + } + + //сортируем полученный массив + word_array.sort((w1, w2) => { + if (words[w1] < words[w2]) return 1; + if (words[w1] > words[w2]) return -1; + return 0; + }); + + + console.log(count + " наиболее часто встречающихся слов"); + for (let i = 0; i < count; i++) { + console.log(' ', words[word_array[i]], '-->', word_array[i]); + } + } +} + +const LineByLineReader = require('line-by-line'), //импортируем модуль, npm install line-by-line + lr = new LineByLineReader('./input/dataSet.csv'); //реализуем ридер, в параметр датасет с относительным путем + +const twits = []; +let line_count = 0; + +const twitParser = new TwitParser(); +const wordAnalysator = new WordCountAnalyse(); + +lr.on('error', function (err) { + console.log('error', err); +}); + +lr.on('line', function (line) { + if (line_count > 0) { // Первую строку не обрабатываем (в ней заголовок CSV файла) + const twit = twitParser.parse(line); + if (twit) { + // Обрабытываем твит + wordAnalysator.analyse(twit); + twits.push(twit); + } + } + line_count++; + if (line_count % 5000 == 0) { + console.log('обработано', line_count, 'строк'); + } +}); + +lr.on('end', function () { + // All lines are read, file is closed now. + main(); +}); + +function printRetwits(count) { + twits.sort((t1, t2) => { + let rt1 = Number(t1.rts); + let rt2 = Number(t2.rts); + if (rt1 < rt2) return 1; + if (rt1 > rt2) return -1; + return 0; + }); + + console.log(''); + console.log(count + " наиболее популярных твитов"); + for (let i = 0; i < count; i++) { + const twit = twits[i]; + console.log(''); + console.log(' Автор', twit.nickname); + console.log(' Содержимое', twit.content); + console.log(' ', twit.rts, 'ретвитов'); + } +} + +function printPopulateAuthors(count) { + const authors = {}; + for (let twit of twits) { + authors[twit.username] = { nickname : twit.nickname, followers : Number(twit.followers)}; + } + + let authors_array = []; + for (let username in authors) { + authors_array.push(username); + } + + authors_array.sort((a1, a2) => { + if (authors[a1].followers < authors[a2].followers) return 1; + if (authors[a1].followers > authors[a2].followers) return -1; + return 0; + }); + + console.log(''); + console.log(count + " наиболее популярных авторов"); + for (let i = 0; i < count; i++) { + let author = authors[authors_array[i]]; + console.log(' ', author.followers, 'фолловеров -->', author.nickname); + } +} + +//отображение используемых языков +function printLanguages(count) { + const langs = {}; //пустой объект языков + for (let twit of twits) { //для каждого твита из свиска + if (!langs[twit.language]) { // + langs[twit.language] = { twitCount : 0, retwitCount : 0}; + } + if (twit.content.startsWith("RT @")) { + langs[twit.language].retwitCount++; + } else { + langs[twit.language].twitCount++; + } + } + + let langs_array = []; + for (let lang in langs) { + langs_array.push(lang); + } + + langs_array.sort((l1, l2) => { + if (langs[l1].twitCount < langs[l2].twitCount) return 1; + if (langs[l1].twitCount > langs[l2].twitCount) return -1; + return 0; + }); + + console.log(""); + console.log(count + " стран-производителей твитов"); + for (let i = 0; i < count; i++) { + let lang = langs[langs_array[i]]; + console.log(' ', lang.twitCount, 'твитов -->', langs_array[i]); + } + + langs_array.sort((l1, l2) => { + if (langs[l1].retwitCount < langs[l2].retwitCount) return 1; + if (langs[l1].retwitCount > langs[l2].retwitCount) return -1; + return 0; + }); + + console.log(""); + console.log(count + " стран-потребителей твитов"); + for (let i = 0; i < count; i++) { + let lang = langs[langs_array[i]]; + console.log(' ', lang.retwitCount, 'ретвитов -->', langs_array[i]); + } +} + +function main() { + console.log('обработано', line_count, 'строк'); + console.log(""); + console.log('обработано', twits.length, 'твитов'); + + wordAnalysator.printWords(10); + printRetwits(10); + printPopulateAuthors(10); + printLanguages(10); +} \ No newline at end of file diff --git a/Tasks/tweets_analysis/parser.js b/Tasks/tweets_analysis/parser.js new file mode 100644 index 0000000..185dbdb --- /dev/null +++ b/Tasks/tweets_analysis/parser.js @@ -0,0 +1,61 @@ +function TwitParser() { + let items = []; //массив элементов твита + let item = ''; //отдельный элемент твита + let is_string = false; //флаг "строка", по умолчанию false + + this.parse = line => { //метод parse принимает на вход строку из датасета + for (let i = 0; i < line.length; i++) { //цикл обходит всю принятую строку + if (line[i] == ';' && !is_string) { //если один элемент строки - ";" и флаг строка true + items.push(item); //добавляем элемент в массив элементов + item = ''; //приводим элемент в исходное состояние + } else if (line[i] == '"') { //если элемент является двойными ковычками + is_string = !is_string; //флаг "строка" вы ставляется в true + if (i > 0 && line[i - 1] == '"') { // Двойная кавычка превращаются в одинарные + item += '"'; + } + } else { //если не первое и не второе условие, то + item += line[i]; //добавляем текущий элемент к элементу твита + } + } + + // Если строка символов закончилась с открытой кавычной - значит это перенос, возврщаем null и ждем другу строку + if (is_string) { + item += "\n"; + return null; + } + + // Вставляем последний элемент + items.push(item); + + // Формируем объект твита + // Tweet Id;Date;Hour;User Name;Nickname;Bio;Tweet content;Favs;RTs;Latitude;Longitude;Country;Place (as appears on Bio);Profile picture;Followers;Following;Listed;Tweet language (ISO 639-1);Tweet Url + const twit = { + id : items[0], + date : items[1], + hour : items[2], + username : items[3], + nickname : items[4], + bio : items[5], + content : items[6], + favs : items[7], + rts : items[8], + latitude : items[9], + longitude : items[10], + country : items[11], + place : items[12], + picture : items[13], + followers : items[14], + following : items[15], + listed : items[16], + language : items[17], + url : items[18] + } + + items = []; + item = ''; + + return twit; //возвращаем твит как набор распределенный полей + } +} + +module.exports = {TwitParser} \ No newline at end of file diff --git a/Tasks/tweets_analysis/populateAutors.js b/Tasks/tweets_analysis/populateAutors.js new file mode 100644 index 0000000..b2942a3 --- /dev/null +++ b/Tasks/tweets_analysis/populateAutors.js @@ -0,0 +1,25 @@ +function printPopulateAuthors(count) { + const authors = {}; + for (let twit of twits) { + authors[twit.username] = { nickname : twit.nickname, followers : Number(twit.followers)}; + } + + let authors_array = []; + for (let username in authors) { + authors_array.push(username); + } + + authors_array.sort((a1, a2) => { + if (authors[a1].followers < authors[a2].followers) return 1; + if (authors[a1].followers > authors[a2].followers) return -1; + return 0; + }); + + console.log(''); + console.log(count + " наиболее популярных авторов"); + for (let i = 0; i < count; i++) { + let author = authors[authors_array[i]]; + console.log(' ', author.followers, 'фолловеров -->', author.nickname); + } +} +module.exports = {printPopulateAuthors} \ No newline at end of file diff --git a/Tasks/tweets_analysis/printRetweets.js b/Tasks/tweets_analysis/printRetweets.js new file mode 100644 index 0000000..95e0d2b --- /dev/null +++ b/Tasks/tweets_analysis/printRetweets.js @@ -0,0 +1,20 @@ +function printRetwits(count) { + twits.sort((t1, t2) => { + let rt1 = Number(t1.rts); + let rt2 = Number(t2.rts); + if (rt1 < rt2) return 1; + if (rt1 > rt2) return -1; + return 0; + }); + + console.log(''); + console.log(count + " наиболее популярных твитов"); + for (let i = 0; i < count; i++) { + const twit = twits[i]; + console.log(''); + console.log(' Автор', twit.nickname); + console.log(' Содержимое', twit.content); + console.log(' ', twit.rts, 'ретвитов'); + } +} +module.exports = {printRetwits} \ No newline at end of file diff --git a/Tasks/tweets_analysis/retweet.js b/Tasks/tweets_analysis/retweet.js new file mode 100644 index 0000000..3fff4a2 --- /dev/null +++ b/Tasks/tweets_analysis/retweet.js @@ -0,0 +1,62 @@ +function RetweetsAnalyse() { + let twits = {}; + + //разбиваем строки на слова + function parseWords(ss) { + const delimeters = " \"\t\n,.:;?!/-+="; //разделители слов + const url_symbols = ":/."; //урлы как отдельный элемент + const exclude_words = [ "#" ]; //исключения + let words = []; //массив слов + let ws = 0; //счетчик слов + for (let i = 0; i <= ss.length; i++) { //для каждого элемента строки + if (i == ss.length || delimeters.indexOf(ss[i]) >= 0) { //если счетчик равен длине строки или элемент строки в разделителях + if (i > ws) { //если счетчик символов больше счетчика слов + let word = ss.substring(ws, i); //слово - равно подстроке от счетчика слов до счетчика + let is_url = word.startsWith('http') && url_symbols.indexOf(ss[i]) >= 0; //проверка на урл + if (!is_url) { //если не урл + if (exclude_words.indexOf(word) < 0) { //если в слове нет исключений + words.push(word.toLowerCase()); //в нижний регистр и в массив слов + } + ws = i + 1; //счетчик слов счетчик +1 + } + } else { + ws = i + 1; //счетчик слов счетчик +1 + } + } + } + return words; //возвращаем массив слов + } + + //анализируем количество повторений + this.analyse = (twit) => { //стрелочная функция приинимает твит на вход + for (let word of parseWords(twit.content)) { //для каждого слова в теле твита + if (!words[word]) { //если слово не встречалось ранее + words[word] = 0; //рейтинг 0 + } + words[word]++; //добавляем рейтинг + } + } + + //выводим данные по словам + this.printWords = (count) => { + let word_array = []; + for (let word in words) { + word_array.push(word); + } + + //сортируем полученный массив + word_array.sort((w1, w2) => { + if (words[w1] < words[w2]) return 1; + if (words[w1] > words[w2]) return -1; + return 0; + }); + + + console.log(count + " наиболее часто встречающихся слов"); + for (let i = 0; i < count; i++) { + console.log(' ', words[word_array[i]], '-->', word_array[i]); + } + } +} + +module.exports = {RetweetsAnalyse} \ No newline at end of file diff --git a/Tasks/tweets_analysis/words.js b/Tasks/tweets_analysis/words.js new file mode 100644 index 0000000..4819368 --- /dev/null +++ b/Tasks/tweets_analysis/words.js @@ -0,0 +1,58 @@ +function WordCountAnalyse() { + let words = {}; //объект слова, пустой + + + function parseWords(ss) { //какая-то строка на вход + const delimeters = " \"\t\n,.:;?!/-+="; //разделители слов + const url_symbols = ":/."; //урлы + const exclude_words = [ "#" ]; //исключения из слов + let words = []; //массив слов + let ws = 0; //счетчик слов + for (let i = 0; i <= ss.length; i++) { //пока итератор не больше длины строки + if (i === ss.length || delimeters.indexOf(ss[i]) >= 0) { //если итератор равен длине строки или иекущий элемент строки присутствует в разделителях + if (i > ws) { //если итератор больше счетчика слов + let word = ss.substring(ws, i); //создаем слово из подстроки начальной строки + let is_url = word.startsWith('http') && url_symbols.indexOf(ss[i]) >= 0; //проверка на урлы: подстрока начинается с хттп и присуутствуют символы урла + if (!is_url) { //если урл == false + if (exclude_words.indexOf(word) < 0) { //если не в исключениях + words.push(word.toLowerCase()); //добавляем слово в мвссив + } + ws = i + 1; //увеличиваем счетчик слов + } + } else { + ws = i + 1; //увеличиваем счетчик слов + } + } + } + return words; //возвращаем список слов + } + + this.analyse = (twit) => { //метод - стрелочная функция принимающая на вход один твит + for (let word of parseWords(twit.content)) { //для каждого слова в теле твита + if (!words[word]) { //если слова нет в списке + words[word] = 0; //рейтинг равен 0 + } + words[word]++; //Если слово есть в списке прибавляем частоту + } + } + + this.printWords = (count) => { + let word_array = []; + for (let word in words) { + word_array.push(word); + } + + word_array.sort((w1, w2) => { + if (words[w1] < words[w2]) return 1; + if (words[w1] > words[w2]) return -1; + return 0; + }); + + console.log(""); + console.log(count + " наиболее часто встречающихся слов"); + for (let i = 0; i < count; i++) { + console.log(' ', words[word_array[i]], '-->', word_array[i]); + } + } +} +module.exports = {WordCountAnalyse} \ No newline at end of file