我們將編寫一組簡單的命令行工具,以顯示有關文本文件或文本文件集的基本統計信息。一些基本統計數據包括...
我們還將努力增加...
這是一個程序的屏幕截圖,該程序從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和使用它。