我们将编写一组简单的命令行工具,以显示有关文本文件或文本文件集的基本统计信息。一些基本统计数据包括...
我们还将努力增加...
这是一个程序的屏幕截图,该程序从Project Gutenberg下载Moby Dick的整个文本,并打印出字母频率的直方图。
事实证明,字母“ T”占Moby Dick所有字母的9.25%。
要开始,您需要...
npm install以安装所需的软件包。textalyze.js是该项目的源代码sample_data是一个包含用于分析的示例文本文件的目录,主要来自Project Gutenberg。此存储库随附的textalyze.js文件充满了旨在帮助您入门的注释。您应该随时删除它们,以使程序易于阅读。
考虑一下您需要回答的问题以使其正常工作:
这些问题从Nitty-Gritty Ruby到用户体验,同时也开始我们对Web的工作方式感到满意的道路。
要在您的代码上请求反馈,请使用标准的github流程过程。
该项目的结构是一系列迭代,每个迭代均基于先前的迭代。迭代扮演三个重要角色:
使用硬编码的示例,编写一个功能,该功能将包含任意且可能重复的项目的Array作为输入,并返回包含项目/计数对的Object 。我们写了一些
此迭代具有为您编写的测试。跑步
npm test查看失败的测试。切记首先运行npm install !
也就是说,如果输入有100个条目,而其中20个是字母“ A”,则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个是字母“ a”,则返回的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和使用它。