Algoritmos NLP

Aqui estão alguns dos algoritmos mais utilizados em processamento de linguagem natural (NLP):

  1. Análise de sentimentos: Regressão Logística, Naive Bayes, Support Vector Machines (SVM)
  2. Classificação de documentos: Naive Bayes, SVM, Árvores de Decisão
  3. Extração de entidades: Conditional Random Fields (CRF), Named Entity Recognition (NER), Hidden Markov Models (HMM)
  4. Modelos de linguagem: BERT, GPT-3, ELMo, ULMFiT
  5. Processamento de sequências: Recurrent Neural Networks (RNN), Long Short-Term Memory Networks (LSTM), Gated Recurrent Units (GRU)
  6. Sumarização de texto: TextRank, LexRank, Luhn’s Algorithm

Novamente, a NLP está em constante evolução e novos algoritmos são desenvolvidos com frequência, por isso esta lista pode não ser exaustiva ou estar desatualizada em algum momento. Além disso, é importante lembrar que a escolha do algoritmo mais adequado depende do contexto específico do problema de NLP em questão.

Naive Bayes

O Algoritmo Naive Bayes é uma técnica de aprendizado de máquina baseada em probabilidade que é amplamente utilizada em classificação de texto, análise de sentimentos e outras tarefas de NLP. O algoritmo assume que cada feature (palavra, frase, etc.) de um documento é independente dos outros features, o que é conhecido como o “pressuposto ingênuo” ou “Naive” do algoritmo.

A idéia básica por trás do Naive Bayes é calcular a probabilidade condicional de uma classe dada um conjunto de features. Em outras palavras, dado um documento, o algoritmo calcula a probabilidade de pertencer a cada classe (por exemplo, positivo ou negativo em uma tarefa de análise de sentimentos). A classe com a probabilidade mais alta é então atribuída ao documento.

Existem três tipos principais de Naive Bayes: GaussianNB, MultinomialNB e BernoulliNB. Cada um deles se baseia em uma distribuição diferente de probabilidade e é adequado para diferentes tipos de dados e tarefas.

Naive Bayes é geralmente rápido e fácil de implementar, o que o torna uma escolha popular para problemas de classificação de texto. No entanto, o pressuposto de independência entre features pode ser inadequado em muitos casos e resultar em desempenho insuficiente. Além disso, o algoritmo pode ser afetado por features irrelevantes ou ruído nos dados.

Em resumo, o Naive Bayes é uma técnica de classificação de probabilidade simples e eficiente que pode ser uma boa escolha para tarefas de NLP específicas, mas pode ter limitações em outros casos.

SVM

A classificação de documentos por Support Vector Machines (SVM) é uma técnica de aprendizado de máquina utilizada para classificar documentos em diferentes categorias. SVM é uma abordagem de classificação linear que procura encontrar uma linha ou hiperplano que melhor separa os dados em duas ou mais classes.

Na classificação de documentos, o SVM pode ser usado para determinar se um determinado documento é positivo ou negativo, se pertence a uma categoria específica ou se é irrelevante para uma determinada tarefa. Para realizar essa tarefa, o algoritmo primeiro transforma cada documento em uma representação vetorial, por exemplo, contando a frequência de cada palavra no documento. Essa representação é então usada como entrada para o modelo de SVM.

O SVM é capaz de lidar com problemas de classificação linearmente inseparáveis, onde os dados não podem ser separados por uma linha reta, usando uma técnica chamada mapeamento não linear. Isso é feito criando uma representação não linear dos dados, onde eles podem ser separados linearmente.

Uma das vantagens do SVM é a capacidade de lidar com problemas de alta dimensionalidade, o que é comum em tarefas de NLP, onde os documentos podem ter centenas ou mesmo milhares de palavras. Além disso, o SVM é considerado um algoritmo robusto e é capaz de lidar com ruído e outros tipos de desequilíbrios de dados.

Em resumo, a classificação de documentos por SVM é uma abordagem de classificação poderosa e flexível que pode ser usada em muitas tarefas de NLP, mas pode ser computacionalmente intensiva em grandes conjuntos de dados.

Árvore de Decisão

A classificação de documentos por árvore de decisão é uma técnica de aprendizado de máquina que pode ser usada para classificar documentos em diferentes categorias. A árvore de decisão é um modelo de aprendizado supervisionado que consiste em uma série de regras de decisão que são aplicadas aos dados para prever uma categoria.

Na classificação de documentos, a árvore de decisão pode ser usada para determinar se um determinado documento é positivo ou negativo, se pertence a uma categoria específica ou se é irrelevante para uma determinada tarefa. Para realizar essa tarefa, o algoritmo primeiro transforma cada documento em uma representação vetorial, por exemplo, contando a frequência de cada palavra no documento. Essa representação é então usada como entrada para a construção da árvore de decisão.

A árvore de decisão é construída a partir da raiz até as folhas, onde cada nó representa uma decisão baseada em um atributo e as folhas representam as categorias finais. A decisão é tomada seguindo caminhos a partir da raiz até a folha correta. Para construir a árvore, o algoritmo usa critérios como entropia e ganho de informação para escolher o atributo que melhor divide os dados.

Uma das vantagens da classificação de documentos por árvore de decisão é que o modelo resultante é fácil de interpretar e compreender, o que é útil para tarefas como avaliação da categoria de uma notícia. Além disso, a árvore de decisão é capaz de lidar com dados categóricos e numéricos e pode ser usada em conjunto com outros algoritmos de aprendizado de máquina.

No entanto, a árvore de decisão pode sofrer com overfitting, onde o modelo se ajusta muito bem aos dados de treinamento, mas tem um desempenho ruim em dados não vistos. Isso pode ser resolvido usando técnicas como poda de árvore, que remove parte da árvore para evitar o overfitting.

Em resumo, a classificação de documentos por árvore de decisão é uma abordagem simples e fácil de usar que pode ser eficaz em muitas tarefas de NLP, mas pode sofrer com overfitting se não for usada com cuidado.

Regressão Logística

A regressão logística é um algoritmo de aprendizado supervisionado que é usado para resolver problemas de classificação binária, isto é, classificar objetos em duas categorias (por exemplo, sim/não, positivo/negativo). A ideia básica por trás da regressão logística é modelar a probabilidade de pertencimento a uma dada categoria como uma função logística dos valores das características ou atributos do objeto.

A equação da função logística é geralmente expressa como:

p = 1 / (1 + exp(-z))

onde z é uma combinação linear dos valores das características. Esse modelo pode ser ajustado aos dados de treinamento usando métodos como o gradiente descendente. O resultado final é uma equação que relaciona as características dos objetos a uma probabilidade de pertencimento à categoria positiva.

Para classificar novos objetos, o algoritmo simplesmente avalia a equação da função logística para determinados valores de características e atribui o objeto à categoria positiva se a probabilidade for maior que 0,5, ou à categoria negativa caso contrário.

A regressão logística tem a vantagem de ser uma abordagem simples e fácil de implementar, além de ser rápida e eficiente para problemas de classificação binária. Além disso, a regressão logística é capaz de lidar com atributos numéricos e categóricos e é uma boa escolha quando o número de características é relativamente pequeno e o número de exemplos de treinamento é grande.

No entanto, a regressão logística pode sofrer com overfitting se houver muitas características irrelevantes, e sua capacidade de lidar com múltiplas categorias é limitada. Além disso, a regressão logística não é adequada para problemas de classificação multiclasses, onde os objetos podem pertencer a mais de uma categoria. Nesses casos, é necessário usar outros algoritmos, como árvores de decisão ou redes neurais.

Conditional Random Fields

Conditional Random Fields (CRF) é um algoritmo de aprendizado supervisionado utilizado para resolver problemas de previsão de sequências, como, por exemplo, reconhecimento de entidades nomeadas (NER), segmentação de frases, previsão de pos-tagging, entre outros.

O CRF difere dos algoritmos de classificação tradicionais pois considera as relações entre as entidades a serem previstas. Isso é útil, por exemplo, para reconhecimento de entidades nomeadas, uma vez que a entidade “Londres” pode ter um significado diferente dependendo do contexto.

O CRF modela a probabilidade condicional de uma sequência de etiquetas dadas as características dos tokens na sequência. Isso é feito através de uma equação de energia, que é uma soma de funções de custo ou recompensa para cada etiqueta em relação ao seu contexto imediato. Essas funções são previamente definidas pelo usuário e ajustadas aos dados de treinamento.

Para prever a etiqueta de um novo token, o algoritmo utiliza uma técnica de “descida de energia” para encontrar a sequência de etiquetas que maximiza a probabilidade condicional. Esse é um processo iterativo que é realizado até que não haja mais mudanças na sequência de etiquetas.

O CRF tem a vantagem de considerar as relações entre as entidades a serem previstas, o que é importante em muitos problemas de NLP. Além disso, ele é capaz de lidar com dependências entre as etiquetas, o que o torna uma boa escolha para problemas que requerem previsão de sequências. No entanto, o CRF pode ser computacionalmente caro, especialmente quando se trata de sequências longas, e também pode sofrer com overfitting se não houver suficientes dados de treinamento.

Named Entity Recognition

Named Entity Recognition (NER) é uma tarefa de processamento de linguagem natural que visa identificar e classificar entidades nomeadas em texto, como pessoas, lugares, organizações, datas, entre outros. O NER é uma das tarefas básicas em NLP e é uma etapa importante em muitas aplicações, incluindo análise de sentimentos, análise de relações entre entidades, extração de informações, entre outras.

O NER pode ser abordado como um problema de classificação de tokens, onde cada token é classificado como uma das várias categorias de entidades nomeadas. Algoritmos como Conditional Random Fields (CRF), Support Vector Machines (SVM), entre outros, podem ser usados para realizar a classificação.

Outra abordagem comum é o uso de Deep Learning, onde são utilizadas redes neurais profundas, como a rede neural recorrente (RNN) ou a rede neural de atenção (Attention-based Neural Network). Essas redes neurais são treinadas usando exemplos anotados de texto e aprendem a identificar padrões importantes nas sequências de tokens que são característicos de entidades nomeadas.

Além disso, muitos sistemas de NER também usam dicionários e recursos externos, como gazetas, para complementar e melhorar a precisão do reconhecimento de entidades nomeadas.

Em resumo, o NER é uma tarefa importante em NLP que visa identificar entidades nomeadas em texto. Ele pode ser abordado usando algoritmos de classificação tradicionais, como CRF e SVM, ou redes neurais profundas, como RNN e Attention-based Neural Network. Além disso, muitos sistemas de NER usam dicionários e recursos externos para complementar e melhorar a precisão do reconhecimento de entidades nomeadas.

Hidden Markov Models

Hidden Markov Models (HMMs) são modelos probabilísticos usados para representar sistemas dinâmicos que mudam de estado ao longo do tempo. HMMs são amplamente usados em várias áreas, incluindo reconhecimento de fala, processamento de linguagem natural, bioinformática e finanças.

Um HMM consiste em dois componentes principais: um modelo de transição que representa as probabilidades de mudanças de estado ao longo do tempo, e um modelo de observação que representa as probabilidades de observações para cada estado.

A tarefa principal de um HMM é estimar a probabilidade de um determinado caminho de estados a partir de observações, ou seja, a probabilidade de um caminho dado a sequência de observações. Este caminho é chamado de caminho oculto, daí o nome “Hidden Markov Model”.

O algoritmo de Viterbi é um algoritmo eficiente para calcular a probabilidade do caminho mais provável dado uma sequência de observações. Outro algoritmo importante é o algoritmo Baum-Welch, que é usado para estimar os parâmetros do modelo a partir de dados de treinamento.

Em resumo, Hidden Markov Models (HMMs) são modelos probabilísticos que representam sistemas dinâmicos que mudam de estado ao longo do tempo. Eles são compostos por dois componentes principais: um modelo de transição e um modelo de observação. HMMs são amplamente usados em várias áreas, incluindo reconhecimento de fala, processamento de linguagem natural, bioinformática e finanças, e são usados para estimar a probabilidade de caminhos ocultos dado uma sequência de observações.

BERT

BERT (Bidirectional Encoder Representations from Transformers) é um modelo de processamento de linguagem natural desenvolvido pela OpenAI que usa transformers para codificar sentenças e documentos. Ele é considerado um dos mais avançados modelos de processamento de linguagem natural e tem sido amplamente utilizado em várias tarefas, incluindo classificação de sentimentos, extração de entidades nomeadas e resposta a perguntas.

O algoritmo BERT funciona codificando cada sentença ou documento em um vetor de representação de tamanho fixo, onde cada elemento representa uma característica ou feature da sentença ou documento. A codificação é realizada de forma bidirecional, o que significa que o modelo processa tanto o contexto anterior quanto o posterior de cada palavra, ao invés de apenas o contexto anterior como em outros modelos como o ELMO ou o GPT.

O modelo é treinado em grandes quantidades de dados de texto para aprender a prever a palavra faltante em uma frase ou para classificar a sentença em uma categoria específica, por exemplo. O resultado é uma codificação que captura a semântica e o contexto das palavras e frases, permitindo ao modelo realizar tarefas avançadas de processamento de linguagem natural.

BERT tem sido muito bem sucedido em várias tarefas de NLP, e muitos modelos subsequentes, incluindo RoBERTa, ALBERT, e outros, são baseados em seu design e funcionamento.

Em resumo, BERT é um modelo de processamento de linguagem natural que usa transformers para codificar sentenças e documentos em representações vetoriais fixas. Ele é treinado em grandes quantidades de dados de texto e é capaz de capturar a semântica e o contexto das palavras e frases, permitindo ao modelo realizar tarefas avançadas de NLP.

GPT-3

GPT-3 (Generative Pre-trained Transformer 3) é um modelo de linguagem natural avançado desenvolvido pela OpenAI. É uma rede neural de transformers treinada com grandes quantidades de dados de texto na internet para prever a próxima palavra em uma frase ou para gerar texto completo a partir de uma prompt ou tópico.

O algoritmo GPT-3 funciona codificando cada sentença ou documento em um vetor de representação de tamanho fixo, onde cada elemento representa uma característica ou feature da sentença ou documento. A codificação é realizada de forma unidirecional, o que significa que o modelo processa apenas o contexto anterior de cada palavra.

O modelo é treinado em grandes quantidades de dados de texto para aprender a prever a próxima palavra em uma frase. O resultado é uma codificação que captura a semântica e o contexto das palavras e frases, permitindo ao modelo realizar tarefas avançadas de processamento de linguagem natural.

GPT-3 é considerado um dos modelos de linguagem natural mais avançados e tem sido usado em uma ampla gama de aplicações, incluindo geração de texto, tradução automática, resposta a perguntas, classificação de sentimentos e extração de informações.

Em resumo, GPT-3 é um modelo de linguagem natural avançado que usa transformers para codificar sentenças e documentos em representações vetoriais fixas. Ele é treinado em grandes quantidades de dados de texto e é capaz de capturar a semântica e o contexto das palavras e frases, permitindo ao modelo realizar tarefas avançadas de NLP.

Recurrent Neural Networks

Recurrent Neural Networks (RNNs) são tipos de redes neurais que são projetadas para trabalhar com sequências de dados. A ideia principal por trás desses tipos de redes é que a informação anterior pode ser usada para prever o próximo elemento na sequência. Isso é conseguido ao incorporar ciclos em sua arquitetura, permitindo que a informação da sequência anterior seja “lembrada” e usada como entrada para a próxima previsão.

A arquitetura básica de uma RNN consiste em uma camada escondida que é usada para processar cada elemento da sequência. A saída da camada escondida é usada como entrada para a próxima previsão, permitindo que a informação da sequência anterior seja lembrada e usada para prever o próximo elemento.

RNNs são amplamente usadas em aplicações de processamento de linguagem natural, como classificação de sentimento, tradução automática, geração de texto e análise de séries temporais. Também são úteis em outras áreas, como o processamento de áudio e imagem.

Uma limitação importante das RNNs é a dificuldade em lembrar informações a longo prazo. Para resolver esse problema, surgiram variações mais avançadas, como as Long-Short-Term-Memory (LSTMs) e as Gated Recurrent Units (GRUs). Essas variações permitem que as informações a longo prazo sejam preservadas por mais tempo, tornando-as mais úteis para aplicações que requerem memória a longo prazo.

Em resumo, Recurrent Neural Networks (RNNs) são tipos de redes neurais projetadas para trabalhar com sequências de dados, usando a informação anterior para prever o próximo elemento. São amplamente usadas em aplicações de processamento de linguagem natural, mas também podem ser úteis em outras áreas. Sua capacidade de lembrar informações a longo prazo é limitada, mas pode ser melhorada com variações avançadas, como LSTMs e GRUs.

Long-Short-Term-Memory

Long-Short-Term-Memory (LSTM) é uma variação avançada da Recurrent Neural Network (RNN) que é projetada para resolver a limitação de memória a longo prazo das RNNs convencionais.

A ideia básica por trás das LSTMs é permitir que a rede controle a quantidade de informação que é mantida na memória e a quantidade que é descartada. Isso é conseguido com o uso de três portas na camada escondida da rede: a porta de entrada, a porta de esquecimento e a porta de saída.

A porta de entrada controla a quantidade de informação que é permitida entrar na memória. A porta de esquecimento controla a quantidade de informação que é descartada da memória. E a porta de saída controla a quantidade de informação que é usada como entrada para a próxima previsão.

Além dessas três portas, as LSTMs também incluem uma memória interna, que é usada para armazenar informações a longo prazo. Essa memória é acessada e atualizada a cada passo da sequência, permitindo que a rede lembre informações a longo prazo.

LSTMs são amplamente usadas em aplicações de processamento de linguagem natural, como previsão de séries temporais, análise de sentimento, tradução automática e geração de texto. Também são úteis em outras áreas, como o processamento de áudio e imagem.

Em resumo, as Long-Short-Term-Memory (LSTMs) são uma variação avançada da Recurrent Neural Network (RNN) projetada para resolver a limitação de memória a longo prazo das RNNs convencionais. Elas incluem três portas de controle e uma memória interna para armazenar informações a longo prazo, permitindo que a rede lembre informações a longo prazo e seja mais útil em aplicações que requerem memória a longo prazo.

Gated Recurrent Units

Gated Recurrent Units (GRUs) são uma variação da arquitetura de redes neurais recorrentes que foram projetadas para lidar com a questão da explosão e colapso de gradientes. GRUs são uma alternativa mais simples e eficiente às Long-Short-Term-Memory (LSTMs), com uma estrutura menos complexa e maior eficiência computacional.

GRUs possuem duas portas de controle que permitem a rede controlar a quantidade de informação que é mantida na memória e a quantidade que é descartada. A porta de atualização controla a quantidade de informação nova que é permitida entrar na memória, e a porta de reset controla a quantidade de informação antiga que é descartada da memória.

Ao contrário das LSTMs, GRUs não possuem uma memória interna separada, em vez disso, a memória é representada pelo estado oculto da rede. Esse estado oculto é atualizado a cada passo da sequência com base nas entradas e nas portas de controle.

GRUs são amplamente utilizadas em aplicações de processamento de linguagem natural, como análise de sentimento, tradução automática, geração de texto e classificação de texto. Eles também são úteis em outras áreas, como o processamento de áudio e imagem.

Em resumo, Gated Recurrent Units (GRUs) são uma variação da arquitetura de redes neurais recorrentes projetadas para lidar com a questão da explosão e colapso de gradientes. GRUs possuem duas portas de controle que permitem a rede controlar a quantidade de informação que é mantida na memória e a quantidade que é descartada. A memória é representada pelo estado oculto da rede e é atualizada a cada passo da sequência com base nas entradas e nas portas de controle. GRUs são amplamente utilizadas em aplicações de processamento de linguagem natural e em outras áreas.

Luhn’s Algorithm

Luhn’s Algorithm, também conhecido como o “Algoritmo de Módulo 10”, é uma técnica de validação de números de cartão de crédito, telefone e outros números de identificação similar. Ele foi criado por Hans Peter Luhn, da IBM, em 1954.

O algoritmo funciona da seguinte maneira:

  1. Inverta a ordem dos dígitos na string de número.
  2. Multiplique por 2 cada segundo dígito, começando pelo último.
  3. Se o resultado de uma multiplicação é maior que 9, subtraia 9 do resultado.
  4. Adicione todos os dígitos da string de número modificada.
  5. Se o resultado é divisível por 10, o número é válido. Caso contrário, o número é inválido.

Este algoritmo é amplamente utilizado pelas empresas que emitem cartões de crédito para garantir que as transações com cartão de crédito sejam autênticas e evitar fraudes. Além disso, o algoritmo também é usado por muitos serviços de pagamento para verificar a integridade dos números de cartão de crédito fornecidos pelos clientes.

Em resumo, Luhn’s Algorithm é uma técnica de validação de números de cartão de crédito, telefone e outros números de identificação similar. É amplamente utilizado pelas empresas que emitem cartões de crédito para garantir a autenticidade das transações com cartão de crédito e evitar fraudes.

TextRank

TextRank é um algoritmo de processamento de linguagem natural que é usado para realizar summarização de texto e extração de palavras-chave. Ele foi baseado no algoritmo PageRank, utilizado pelo Google para classificar páginas da web.

O algoritmo funciona da seguinte maneira:

  1. Segmentação do texto em sentenças: O texto é dividido em sentenças para que se possa realizar uma análise independente de cada uma.
  2. Construção de um grafo de sentenças: As sentenças são vistas como nós de um grafo, e as relações entre as sentenças são determinadas pela semelhança semântica.
  3. Calcular a similaridade entre sentenças: A similaridade semântica é calculada entre cada par de sentenças através de técnicas como TF-IDF, WMD, etc.
  4. Aplicação do algoritmo PageRank: O algoritmo PageRank é aplicado no grafo de sentenças para determinar a importância de cada sentença em relação às outras.
  5. Sumarização do texto: As sentenças mais importantes, identificadas pelo algoritmo PageRank, são selecionadas como a representação mais condensada e resumida do texto original.

Além da summarização de texto, o algoritmo TextRank também pode ser usado para extrair palavras-chave relevantes do texto. Esta tarefa é realizada pela seleção das palavras mais importantes das sentenças selecionadas.

Em resumo, TextRank é um algoritmo de processamento de linguagem natural que é baseado no algoritmo PageRank e é usado para summarização de texto e extração de palavras-chave. É uma técnica eficaz e amplamente utilizada para análise de textos grandes.

LexRank

LexRank é um algoritmo de summarização de texto baseado em grafos. Ele foi desenvolvido como uma alternativa ao algoritmo TextRank e utiliza conceitos semelhantes, mas com algumas diferenças importantes.

O LexRank funciona da seguinte maneira:

  1. Segmentação do texto em sentenças: O texto é dividido em sentenças para que se possa realizar uma análise independente de cada uma.
  2. Construção de um grafo de sentenças: As sentenças são vistas como nós de um grafo e as relações entre as sentenças são determinadas pela semelhança semântica.
  3. Calcular a similaridade entre sentenças: A similaridade semântica é calculada entre cada par de sentenças através de técnicas como TF-IDF, WMD, etc.
  4. Aplicação do algoritmo de espalhamento de importância: A importância de cada sentença é determinada através da aplicação do algoritmo de espalhamento de importância, o qual determina a importância relativa das sentenças em relação ao todo.
  5. Sumarização do texto: As sentenças mais importantes, identificadas pelo algoritmo de espalhamento de importância, são selecionadas como a representação mais condensada e resumida do texto original.

Em resumo, o LexRank é um algoritmo de sumarização de texto que utiliza conceitos semelhantes ao TextRank, mas com algumas diferenças importantes, como o uso de um algoritmo de espalhamento de importância ao invés de PageRank. É uma técnica eficaz e amplamente utilizada para análise de textos grandes.

Algoritmos de Inteligência Artificial

A eficiência de um algoritmo de Inteligência Artificial (IA) depende de vários fatores, incluindo o tipo de problema que ele está sendo aplicado, o volume de dados disponíveis e as restrições de tempo e recursos computacionais. Aqui estão alguns dos algoritmos mais eficazes de IA, classificados por categoria:

  1. Aprendizado de máquina supervisionado: Regressão linear, árvores de decisão, florestas aleatórias, suporte a máquina de vetores (SVM)
  2. Aprendizado não supervisionado: K-Means, Hierarchical clustering, DBSCAN
  3. Aprendizado profundo: Redes neurais feedforward, Convolutional Neural Networks (CNN), Recurrent Neural Networks (RNN)
  4. Aprendizado por reforço: Q-Learning, Sarsa, Proximal Policy Optimization (PPO)

Cabe destacar que a IA está em constante evolução e novos algoritmos são desenvolvidos regularmente, por isso esta lista pode não ser exaustiva ou estar desatualizada em algum momento. Além disso, é importante lembrar que a escolha do algoritmo mais adequado depende do contexto específico do problema em questão.

Receita de sorvete com Tang

Aqui está uma receita simples de sorvete feito com Tang e emulsificante:

Ingredientes:

  • 2 xícaras de Tang
  • 1 xícaras de açúcar
  • 2 colheres de sopa de emulsificante
  • 4 xícaras de leite
  • 1 colher de chá de essência de baunilha (opcional)

Instruções:

  1. Em uma tigela, misture o Tang, o açúcar e o emulsificante até ficar homogêneo.
  2. Adicione o leite e a essência de baunilha (se desejar) à mistura de Tang e misture bem.
  3. Despeje a mistura em uma forma de sorvete e congele por pelo menos 6 horas ou até ficar firme.
  4. Sirva o sorvete e aproveite!

Nota: O tempo de congelamento pode variar de acordo com o tamanho da forma e o tipo de freezer. Verifique o sorvete de vez em quando para garantir que esteja congelando uniformemente.

Onde baixar legendas da série Friends

Você pode encontrar legendas para a série “Friends” em vários sites na internet, incluindo:

  1. Subscene: um site que oferece legendas em vários idiomas para filmes e programas de TV.
  2. OpenSubtitles: um site que oferece legendas para uma ampla gama de programas de TV e filmes.
  3. Yify Subtitles: um site que oferece legendas para filmes e programas de TV em vários idiomas.
  4. Addic7ed: um site que oferece legendas para vários programas de TV, incluindo “Friends”.

Lembre-se de sempre verificar a precisão das legendas antes de baixá-las e de evitar sites que possam conter malware ou vírus. Além disso, lembre-se de verificar se a utilização de legendas está de acordo com as leis de direitos autorais do seu país.