Eu uso regularmente um dicionário de sinônimos, tanto ao escrever cópias para documentação e READMEs, quanto ao escrever código para nomear variáveis e funções.
Eu costumava usar tesauros online, especialmente thesaurus.com, mas odiava a experiência. Embora os resultados sejam úteis e muito bem organizados, eles não são compatíveis com o teclado e são lentos para navegar, especialmente quando os resultados se estendem por muitas páginas.
Então fiz meu próprio dicionário de sinônimos. Eu o uso com muito mais frequência do que jamais usei o thesaurus.com. Possui menos recursos, mas é muito mais rápido de acessar e menos perturbador do processo criativo.
Em uma janela de terminal, digite th
seguido de uma palavra. Por exemplo, para procurar a palavra atenção :
Invocando th por atenção |
A saída é uma lista de palavras e frases relacionadas, organizadas em colunas, com linhas de contexto acima e abaixo, e uma lista de opções de navegação na parte inferior.
Resultado da pesquisa por atenção |
A linha inferior da exibição de resultados mostra a lista de ações disponíveis. Inicie uma ação digitando a primeira letra da ação (destacada na tela para dar ênfase).
Os dados são organizados como entradas do dicionário de sinônimos, cada uma com uma coleção de palavras e frases relacionadas. Uma entrada é um tronco e as palavras e frases relacionadas são os ramos .
A visualização padrão está no modo ramificações. As palavras exibidas são as palavras e frases listadas após a entrada no dicionário de sinônimos de origem. Mudar para o modo trunks mostrará as entradas que contêm a palavra. Isso é demonstrado mais claramente por um exemplo sem ramificações:
gatilho é uma palavra sem entrada |
Não há entrada no dicionário de sinônimos para a palavra trigger . A palavra gatilho está no dicionário de sinônimos, entretanto, como ramificações de outras entradas. Mude para o modo trunks para ver as entradas que incluem trigger :
Lista de palavras para as quais o gatilho é uma palavra relacionada |
Este programa não está disponível como pacote; o código-fonte deve ser baixado e o projeto construído. As etapas a seguir produzirão um tesauro funcional:
git clone https://www.github.com/cjungmann/th.git
cd th
make
make thesaurus.db
Brinque com o programa para ver se você gosta. Se você deseja que ele fique disponível fora do diretório de construção, invoque o seguinte comando:
sudo make install
É fácil remover o programa se você decidir que não precisa dele.
Se você instalou o programa, primeiro desinstale com sudo make uninstall
Isso removerá o programa, os arquivos de suporte e o diretório no qual os arquivos de suporte foram instalados.
Se o programa não estiver instalado, você pode simplesmente excluir com segurança o diretório clonado.
O material a seguir interessará principalmente aos desenvolvedores, se houver.
O projeto é fácil de construir, mas depende de outro software. A seguir está uma lista de dependências, das quais apenas a primeira (o banco de dados Berkeley) pode exigir alguma intervenção. Os itens 3 e 4 abaixo são baixados em um subdiretório no diretório build, e o código encontrado lá está vinculado estaticamente ao executável, portanto, não afetarão seu ambiente.
db versão 5 (Berkeley Database) é necessária para os bancos de dados B-Tree no projeto. Se você estiver usando git , você já deve ter isso, mesmo no FreeBSD , que de outra forma inclui apenas uma versão mais antiga de db . O Make terminará imediatamente com uma mensagem se não conseguir encontrar um db apropriado; nesse caso, cabe a você usar seu gerenciador de pacotes para instalar o db ou compilá-lo a partir dos fontes.
git é usado para baixar algumas dependências. Embora as dependências do projeto possam ser baixadas diretamente sem git , isso requer conhecimento não documentado sobre os arquivos de origem, um problema que é evitado quando o make pode usar o git para baixar as dependências.
readargs é um dos meus projetos que processa argumentos de linha de comando. Embora este projeto ainda seja usado por th , não é mais necessário instalar esta biblioteca para que th funcione. O Makefile agora baixa o projeto readargs em um subdiretório, constrói-o e usa a biblioteca estática.
c_patterns é outro dos meus projetos, um experimento em gerenciar código reutilizável sem precisar de uma biblioteca. O Makefile usa git para baixar o projeto e, em seguida, cria links para alguns módulos c_patterns no diretório src para serem incluídos na compilação .
Este projeto, embora útil (pelo menos para mim), é também um experimento. Um dos meus objetivos aqui é melhorar minhas habilidades de escrita de makefile. Algumas das decisões de construção e instalação que tomei podem não ser práticas recomendadas ou podem até ser desaprovadas por desenvolvedores mais experientes. Se você está preocupado com o que acontecerá ao seu sistema se você instalar th
, espero que o seguinte informe sua decisão.
Como esperado, make irá compilar a aplicação. De forma não convencional, talvez, make execute outras tarefas que podem levar algum tempo:
Baixa meu repositório de módulos C e usa vários deles criando links para o diretório src .
Em vez de usar configure
para verificar dependências, o makefile identifica e termina imediatamente com uma mensagem útil se detectar dependências ausentes.
Baixe e importe o dicionário de sinônimos moby de domínio público do Projeto Gutenberg. Isso preenche o banco de dados de palavras do aplicativo.
Abandonado Baixe e importe um banco de dados de contagem de palavras. A ideia é oferecer ordens de classificação alternativas para facilitar a localização de uma palavra em uma lista mais longa. Isso não está funcionando agora. Não tenho certeza se voltarei a isso porque estou descobrindo que o benefício de ler uma lista alfapética supera em muito o benefício duvidoso de tentar colocar primeiro as palavras mais usadas. A razão é que é muito mais fácil acompanhar as palavras em consideração quando elas não estão espalhadas aleatoriamente em uma longa lista de palavras.
Acabei de notar que há um recurso de lista de classes gramaticais de Moby que pode ajudar a organizar a saída. É intrigante, mas não tenho certeza se será útil, com base no quanto a classificação alfabética ajuda no uso da saída. Veremos.
Eu tinha vários objetivos quando comecei este projeto.
Eu queria mais experiência com o banco de dados Berkeley . Esse banco de dados de armazenamento de chaves sustenta muitos outros aplicativos, incluindo git e sqlite .
Eu queria praticar o uso de alguns dos módulos do meu projeto c_patterns. Usar esses módulos em um projeto real me ajuda a entender suas falhas de design e recursos ausentes. eu uso
columnize.c para gerar a saída colunar,
prompter.c para o menu de opções mínimas na parte inferior da saída,
get_keypress.c para pressionamentos de teclas sem eco, usado principalmente por prompter.c .
Eu queria praticar o projeto de um processo de construção que funcionasse tanto no Gnu Linux quanto no BSD. Isso inclui a identificação de módulos ausentes (especialmente db , dos quais o BSD inclui uma biblioteca muito antiga) e processamento condicional redesenhado.
Não estou visando o Windows porque ele varia mais significativamente do Linux do que do BSD, e não espero que muitos usuários do Windows se sintam confortáveis em usar um aplicativo de linha de comando.
O banco de dados Berkeley ( bdb ) parece um produto de banco de dados interessante. Sua abordagem de biblioteca C de baixo nível parece semelhante ao mecanismo FairCom DB que usei no final dos anos 1990.
O banco de dados Berkeley é atraente porque faz parte das distribuições Linux e BSD e ocupa pouco espaço. Ele recompensa o planejamento detalhado dos dados e é uma desculpa para explorar algumas de minhas ideias em linguagem C.
Este projeto é uma reinicialização do meu projeto de palavras, que pretende ser um dicionário de sinônimos e dicionário de sinônimos de linha de comando. Esse projeto foi meu primeiro uso de bdb , então parte do meu trabalho é um pouco desajeitado. Quero projetar o código bdb novamente do zero. Copiarei parte do código de análise de texto do projeto de palavras que será aplicável aqui.
Usando os grandes conjuntos de dados que são o tesauro e o dicionário, também quero testar as diferenças de desempenho entre os métodos de acesso a dados Queue e Recno. Espero que a fila seja mais rápida, com o início e o fim dos registros de comprimento fixo podendo ser calculados. O acesso pelo número de registro de um determinado registro de comprimento variável exigiria uma pesquisa do local do arquivo. Gostaria de medir a diferença de desempenho para comparar essa vantagem com a eficiência de armazenamento de registros de comprimento variável.
Existem duas fontes de tesauros de domínio público:
Estou usando o dicionário de sinônimos Moby porque sua organização é muito mais simples e, portanto, mais fácil de analisar. O problema é que os sinônimos são numerosos e, na falta de organização, muito mais difíceis de serem escaneados na busca por um sinônimo adequado.
Com centenas de sinônimos para muitas palavras, é muito difícil examinar a lista para encontrar uma palavra apropriada. Tentarei impor alguma ordem na lista para facilitar o uso. Depois de usar a ferramenta por algum tempo, concluí que a ordem alfabética é a melhor. É muito mais fácil retornar a uma palavra em uma lista alfabética. Removi a opção de selecionar outras ordens de palavras.
A classificação mais fácil de usar é a frequência de uso das palavras. Pretendo listar as palavras da maior para a menor frequência de uso. Presumivelmente, palavras mais populares podem ser as melhores escolhas, enquanto palavras menos populares podem ser obsoletas.
Existem várias fontes de frequências de palavras. O que estou usando é baseado no Google ngrams:
Dados Corpus de Linguagem Natural: Belos Dados
Eu realmente não estudei a fonte Norvig, então é possível que contenha muitas bobagens. Existe outra fonte que pode ter uma lista mais higienizada, hackerb9/gwordlist. Se Norvig for um problema, quero lembrar esta lista alternativa pela qual posso substituí-lo.
Esta parte não é mais tentada. A interpretação dos dados de origem é complicada pela necessidade de reconhecer e converter a notação exclusiva do dicionário em caracteres Unicode. Resolvi muitos desses problemas, mas muitos ainda permanecem. O Makefile ainda inclui instruções para baixar essas informações e o repositório retém alguns scripts de conversão caso eu queira voltar a isso.
Agrupar sinônimos por classes gramaticais (ou seja, substantivo, verbo, adjetivo, etc.) também pode ser útil. O primeiro problema está em identificar a classe gramatical representada por cada palavra. O segundo problema está na apresentação: seria melhor, porém mais difícil de programar, ter uma interface que permitisse ao usuário escolher a classe gramatical antes de exibir as palavras.
Dicionários eletrônicos de domínio público
Minha primeira tentativa é usar o GNU Collaborative International Dictionary of English (GCIDE). É baseado em uma versão antiga (1914) do Webster, com algumas palavras adicionadas por editores mais modernos.