Vamos escrever um conjunto de ferramentas simples de linha de comando para exibir estatísticas básicas sobre um arquivo de texto ou conjunto de arquivos de texto. Algumas estatísticas básicas incluem ...
Também trabalharemos para adicionar a capacidade de ...
Aqui está uma captura de tela de um programa que baixa todo o texto de Moby Dick, do Project Gutenberg, e imprime um histograma das frequências das letras.
Acontece que a letra "T" representa 9,25% de todas as cartas em Moby Dick.
Para começar, você precisará ...
npm install para instalar os pacotes necessários.textalyze.js é o código -fonte deste projetosample_data é um diretório que contém arquivos de texto de amostra a serem analisados, principalmente do Projeto Gutenberg. O arquivo textalyze.js que vem com este repositório é preenchido com comentários projetados para ajudar você a começar. Você deve se sentir à vontade para excluí -los para facilitar a leitura do programa.
Pense nas perguntas que você precisa para responder para fazê -lo funcionar:
Essas perguntas variam de rubi da Nitty Gritty à experiência do usuário, além de nos iniciar o caminho de se sentir confortável com a forma como a web funciona.
Para solicitar feedback sobre seu código, use o processo de fluxo do GitHub padrão.
Este projeto é estruturado como uma sequência de iterações, cada uma das quais se baseia nas iterações anteriores. As iterações desempenham três papéis importantes:
Usando exemplos codificados, escreva uma função que pegue uma Array contendo itens arbitrários e possivelmente duplicados como entrada e retorna um Object que contém pares de item/contagem. Nós escrevemos alguns
Esta iteração tem testes escritos para você. Correr
npm test para ver os testes de falha. Lembre -se de executar npm install primeiro!
Isto é, se a entrada tiver 100 entradas e 20 delas são a letra "A", então Object resultante deve conter
{ 'a' : 20 } "Sensible" depende de você definir, mas aqui está um formato sugerido, fingindo que codificamos a entrada como ["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 $
Usando exemplos codificados, escreva uma função que pegue uma String arbitrária como entrada e retorna uma Array de todos os caracteres da sequência, incluindo espaços e pontuação.
Alimente isso na função de contagem de matrizes da iteração anterior para obter um Object contendo pares de letra/contagem. Imprima esses pares de maneira sensata.
Crie um arquivo lib/sanitize.js e defina uma função chamada sanitize dentro. Como em lib/itemCounts.js , a última linha deve ser
module . exports = sanitize A função sanitize deve tomar uma String arbitrária-talvez contendo espaços, pontuação, quebras de linha etc.-e retornar uma corda "higienizada" que substitui todas as letras superiores pelo seu equivalente em caso inferior. Isso garantirá que as letras 'A' e 'a' não sejam tratadas como duas letras distintas quando analisarmos nosso texto. Vamos lidar com pontuação e outros bits em uma iteração posterior.
Deve funcionar assim
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!'Para nossa sorte, o JavaScript vem com uma função integrada para nos ajudar: string.prototype.tolowercase.
Integrar essa função ao programa atual para que o Object de resultados contenha, por exemplo,
{ 'a' : 25 }em vez de
{ 'a' : 19 , 'A' : 6 } Muitas vezes, os dados que queremos não estão em um formato que facilite a análise. O processo de tomar dados mal formados e transformá-los em algo que podemos usar é chamado de higienizar nossos dados.
O que conta como "higienizando" varia dependendo dos dados subjacentes e de nossas necessidades. Por exemplo, se quiséssemos examinar todo o texto em um documento HTML, não gostaríamos de contar todas as tags HTML. Por outro lado, se quiséssemos um relatório sobre as tags mais usadas em um documento HTML, queremos manter as tags, mas remover o texto.
No nosso caso, projetamos nosso programa de modo que trata as letras do caso superior e as letras de baixo caso como letras distintas, ou seja, nosso Object de resultados pode conter
{ 'a' : 20 , 'A' : 5 }Mas provavelmente preferiríamos que ele apenas contenha
{ 'a' : 25 }Da mesma forma, provavelmente não nos importamos com pontuação (períodos, vírgulas, hífens, cônjuges etc.), embora isso seja mais difícil de lidar do que as diferenças entre as letras de casos superiores e de baixo caso.
O repositório base contém um diretório chamado sample_data que contém um punhado de arquivos de texto. Código rígido O nome de um desses arquivos em seu programa e leia o conteúdo desse arquivo em uma string. Passe essa string para o seu programa atual, para que agora imprima as estatísticas da contagem de cartas para esse arquivo específico, em vez das seqüências de codificadas que você teve na iteração anterior.
Para ler o conteúdo de um arquivo em uma string, consulte Fs.Readfile e Fs.Readfilesync.
Não queremos editar nosso código JavaScript toda vez que precisamos alterar o arquivo do qual estamos lendo dados. Vamos alterá -lo para que o usuário executando o programa possa passar o nome do arquivo para ler. Faremos isso usando argumentos da linha de comando.
Esta iteração marca v1.0 do nosso programa. Assim, nosso programa-embora limitado-é independente o suficiente para que você possa entregá-lo a outra pessoa e eles poderiam usá-lo como você pretendia sem precisar saber como editar o código JavaScript.
Parabéns!
Considere o seguinte comando executado no terminal:
node some-program.js first_argument second_argument banana
Os argumentos da linha de comando são first_argument , second_argument e banana , com um espaço que denota a separação entre cada argumento. first_argument é o argumento da primeira linha de comando e banana é o terceiro argumento da linha de comando.
Usando exemplos codificados, escreva uma função que pegue uma Array contendo entradas arbitrárias e possivelmente duplicadas como entrada e retorna um Object que contém pares de item/frequência. Imprima esses pares de maneira sensata.
Isto é, se a entrada tiver 100 entradas e 20 da letra "A", então Object retornado deve ter
{ 'a' : 0.20 } Você já escreveu uma função que pega uma Array e retorna um Object que contém pares de entrada/contagem e você precisará dessas contagens (de uma maneira ou de outra) para calcular a frequência geral. Se você deseja se alongar, tente escrever sua função "Estatísticas de frequência" de uma maneira que utilize sua função de "estatística de contagem", para que você não precise duplicar tanto código ou trabalho em seu programa.
Esta é uma "abordagem de alongamento", o que significa que não é absolutamente necessário que você escreva seu programa dessa maneira. Como estamos dizendo, é muito melhor escrever algo e obter feedback sobre isso do que ficar preso ao tentar entender um "melhor", "mais rápido", "mais elegante", etc..
Imprima um histograma de frequências de letras que se parecem com o seguinte:
O objetivo é produzir uma saída útil e bem projetada. Não precisa parecer idêntico à saída acima.
Dica: você pode usar a frequência para cada item como uma maneira de escalar o comprimento do histograma.
Aqui estão alguns recursos adicionais que você pode adicionar:
Instale e use o módulo de solicitação para adicionar suporte para a passagem nos URLs, bem como nomes de arquivos. Por exemplo, em vez de ter que baixar Moby Dick primeiro, você pode correr
node textalyze.js http://www.gutenberg.org/cache/epub/2701/pg2701.txt Adicione suporte para exibir as 5 (ou N ) palavras mais comuns em vez de apenas frequências de letras.
Adicione suporte para exportar os dados em um formato que você pode carregar no Excel, como um arquivo CSV. Você pode instalar e usar o módulo CSV-Writer para fazer isso.
Encontre textos de vários idiomas e compare a frequência da letra entre os idiomas. A frequência da carta de um idioma atua como uma espécie de impressão digital, e você se surpreendeu com o pouco o texto necessário para identificar um idioma depois de conhecer as frequências das letras.
Use uma biblioteca de gráficos como o AnyChart para exportar um histograma gráfico.
Para instalar um módulo, execute o seguinte comando (substituindo nameOfModule pelo nome do módulo desejado):
npm install --save nameOfModule Isso atualizará package.json e adicionará o módulo como uma dependência. Leia a documentação de cada módulo para ver como require e use -o.