Мы собираемся написать набор простых инструментов командной строки для отображения основной статистики о текстовом файле или наборе текстовых файлов. Некоторые основные статистические данные включают ...
Мы также будем работать над тем, чтобы добавить возможность ...
Вот скриншот программы, которая загружает весь текст Moby Dick из Project Gutenberg и распечатывает гистограмму частот букв.
Оказывается, буква «T» составляет 9,25% всех букв в Moby Dick.
Чтобы начать, вам понадобится ...
npm install , чтобы установить необходимые пакеты.textalyze.js является исходным кодом для этого проектаsample_data - это каталог, содержащий образцы текстовых файлов для анализа, в основном из проекта Гутенберга. Файл textalyze.js , который поставляется с этим репозиторием, заполнен комментариями, предназначенными для того, чтобы помочь вам начать. Вы должны не стесняться удалить их, чтобы облегчить чтение программы.
Подумайте о вопросах, которые вам понадобятся, чтобы ответить, чтобы заставить его работать, хотя:
Эти вопросы запускают гамму от Nitty-Pritty Ruby до пользовательского опыта, а также начинают с того, как работает веб-сайт.
Чтобы запросить отзывы о вашем коде, используйте стандартный процесс потока GitHub.
Этот проект структурирован как последовательность итераций, каждый из которых основан на предыдущих итерациях. Итерации служат три важных роли:
Используя жесткие примеры, напишите функцию, которая принимает Array , содержащий произвольные и, возможно, дублированные элементы в качестве входных данных, и возвращает Object , содержащий пары элемента/графа. Мы написали некоторые
В этой итерации есть тесты, написанные для вас. Бегать
npm test Чтобы увидеть провальные тесты. Не забудьте сначала запустить npm install !
То есть, если вход имеет 100 записей, а 20 из них - буква «а», тогда полученные Object должны содержать
{ 'a' : 20 } «Ощущение» зависит от вас, чтобы определить, но вот предлагаемый формат, притворяясь, что мы жестко кодировали ввод как ["a", "a", "a", "b", "b", "c"] .
user@host project-js-textalyze $ node textalyze.js
The counts for ["a", "a", "a", "b", "b", "c"] are...
a 3
b 2
c 1
user@host project-js-textalyze $
Используя жесткие примеры, напишите функцию, которая принимает произвольную String в качестве ввода и возвращает Array всех символов в строке, включая пространства и пунктуацию.
Поднимите это в функцию подсчета массива от предыдущей итерации, чтобы получить Object , содержащий пары букв/графа. Распечатайте эти пары разумно.
Создайте файл lib/sanitize.js и определите функцию, называемую sanitize внутри. Как и в lib/itemCounts.js , последняя строка должна быть
module . exports = sanitize Функция sanitize должна взять произвольную String -возможно, содержащую пространства, пунктуацию, разрывы линий и т. Д.-и вернуть «дезинфекционную» строку, которая заменяет все буквы верхнего часа своим эквивалентом нижнего часа. Это гарантирует, что буквы 'A' и 'a' не рассматриваются как две различные буквы, когда мы анализируем наш текст. Мы обратимся с пунктуацией и другими битами в более поздней итерации.
Это должно работать так
sanitize ( 'This is a sentence.' ) // => 'this is a sentence.'
sanitize ( 'WHY AM I YELLING?' ) // => 'why am i yelling?'
sanitize ( 'HEY: ThIs Is hArD tO rEaD!' ) // => 'hey: this is hard to read!'К счастью для нас, JavaScript поставляется со встроенной функцией, которая помогает нам: String.Prototype.TolowerCase.
Интегрировать эту функцию в текущую программу так, чтобы Object результатов содержит, например,
{ 'a' : 25 }вместо
{ 'a' : 19 , 'A' : 6 } Часто данные, которые мы хотим, не в формате, который облегчает анализ. Процесс получения плохо форматированных данных и преобразования их в то, что мы можем использовать, называется дезинфекцией наших данных.
То, что считается «дезинфекцией», варьируется в зависимости от основных данных и наших потребностей. Например, если мы хотим посмотреть на весь текст в HTML -документе, мы не хотели бы считать все теги HTML. И наоборот, если бы мы хотели отчет по наиболее часто используемым тегам в HTML-документе, мы хотели бы сохранить теги, но удалить текст.
В нашем случае мы разработали нашу программу так, чтобы она рассматривала буквы в верхнем случае и буквы с более низкими частями как отдельные буквы, то есть наш Object результатов может содержать
{ 'a' : 20 , 'A' : 5 }Но мы, вероятно, скорее это просто содержат
{ 'a' : 25 }Аналогичным образом, мы, вероятно, не заботимся о пунктуации (периоды, запятые, дефисы, колоны и т. Д.), Хотя с этим труднее справиться, чем различия между буквами в верхнем и более низком количестве.
Базовый репозиторий содержит каталог, называемый sample_data , который содержит несколько текстовых файлов. Жестко кодируйте имя одного из этих файлов в вашу программу и прочитайте содержимое этого файла в строку. Передайте эту строку в вашу текущую программу, чтобы теперь она распечатала статистику по отсеиванию букв для этого конкретного файла вместо жестких строк, которые у вас были в предыдущей итерации.
Чтобы прочитать содержимое файла в строку, см. Fs.ReadFile и fs.ReadFilesync.
Мы не хотим редактировать наш код JavaScript каждый раз, когда нам нужно изменить файл, из которого мы читаем данные. Давайте изменим его так, чтобы пользователь, запускающий программу, мог пройти во имя файла для чтения. Мы сделаем это с помощью аргументов командной строки.
Эта итерация знаменует собой v1.0 нашей программы. В настоящее время наша программа-хотя и ограничена-достаточно автономна, чтобы вы могли дать ее другому человеку, и они могли бы использовать ее так, как вы намеревались, не зная, как редактировать код JavaScript.
Поздравляю!
Рассмотрим следующую команду, запускающуюся с терминала:
node some-program.js first_argument second_argument banana
Аргументы командной строки - first_argument , second_argument и banana , с пространством, обозначающим разделение между каждым аргументом. first_argument - это первый аргумент командной строки, а banana - третий аргумент командной строки.
Используя жесткие примеры, напишите функцию, которая принимает Array , содержащий произвольные и, возможно, дублированные записи в качестве входных данных, и возвращает Object , содержащий пары элементов/частот. Распечатайте эти пары разумно.
То есть, если ввод имеет 100 записей и 20 из букв «А», тогда возвращаемый Object должен иметь
{ 'a' : 0.20 } Вы уже написали функцию, которая принимает Array и возвращает Object , содержащий пары входа/подсчета, и вам понадобятся эти подсчеты (так или иначе), чтобы рассчитать общую частоту. Если вы хотите растянуть себя, попробуйте написать свою функцию «частотная статистика» таким образом, чтобы использовать вашу функцию «Статистика подсчета», чтобы вам не приходилось дублировать столько кода или работы в своей программе.
Это «растягивающий подход», что означает, что вам абсолютно не нужно писать свою программу таким образом. Как мы уже говорили, гораздо лучше написать что -то и получить отзывы об этом, чем застрять, пытаясь избавиться от подхода «лучше», «быстрее», «более элегантно» и т. Д.
Распечатайте гистограмму частот букв, которая выглядит примерно как следующее:
Цель состоит в том, чтобы произвести полезный, хорошо разработанный выход. Это не должно выглядеть идентично вышеуказанному выходу.
Подсказка: вы можете использовать частоту для каждого элемента в качестве способа масштабирования длины гистограммы.
Вот некоторые дополнительные функции, которые вы можете добавить:
Установите и используйте модуль запроса, чтобы добавить поддержку для передачи URL -адресов, а также имена файлов. Например, вместо того, чтобы сначала скачать Moby Dick , вы можете запустить
node textalyze.js http://www.gutenberg.org/cache/epub/2701/pg2701.txt Добавьте поддержку для отображения 5 (или N ) самых распространенных слов вместо просто частоты букв.
Добавьте поддержку для экспорта данных в формате, который вы можете загрузить в Excel, например, файл CSV. Вы можете установить и использовать модуль CSV-Writer для этого.
Найдите тексты из нескольких языков и сравните частоту букв между языками. Частота букв языка действует как своего рода отпечаток пальца, и вы удивлены тем, как мало текста требуется для определения языка, как только вы узнаете частоты букв.
Используйте библиотеку, например, AnyChart, чтобы экспортировать графическую гистограмму.
Чтобы установить модуль, запустите следующую команду (заменив nameOfModule на имя желаемого модуля):
npm install --save nameOfModule Это будет обновлять package.json и добавить модуль в качестве зависимости. Прочитайте документацию каждого модуля, чтобы увидеть, как require и использовать ее.