{"id":30613968,"url":"https://github.com/gdfreitasdev/emotion-mining-python","last_synced_at":"2025-08-30T06:49:34.169Z","repository":{"id":45620952,"uuid":"126919605","full_name":"gdfreitasdev/emotion-mining-python","owner":"gdfreitasdev","description":"Estudos sobre mineração de emoção em textos em Python","archived":false,"fork":false,"pushed_at":"2020-03-09T01:40:24.000Z","size":670,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-07T01:12:21.398Z","etag":null,"topics":["emotion-detection","machine-learning","naive-bayes-algorithm","nltk","python"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gdfreitasdev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-03-27T02:52:31.000Z","updated_at":"2023-04-20T12:21:35.000Z","dependencies_parsed_at":"2022-07-19T03:47:18.756Z","dependency_job_id":null,"html_url":"https://github.com/gdfreitasdev/emotion-mining-python","commit_stats":null,"previous_names":["gdfreitasdev/emotion-mining-python"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gdfreitasdev/emotion-mining-python","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gdfreitasdev%2Femotion-mining-python","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gdfreitasdev%2Femotion-mining-python/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gdfreitasdev%2Femotion-mining-python/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gdfreitasdev%2Femotion-mining-python/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gdfreitasdev","download_url":"https://codeload.github.com/gdfreitasdev/emotion-mining-python/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gdfreitasdev%2Femotion-mining-python/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272815815,"owners_count":24997661,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-30T02:00:09.474Z","response_time":77,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["emotion-detection","machine-learning","naive-bayes-algorithm","nltk","python"],"created_at":"2025-08-30T06:49:32.879Z","updated_at":"2025-08-30T06:49:34.105Z","avatar_url":"https://github.com/gdfreitasdev.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# emotion-mining-python\n\nMineração de emoção em textos utilizando a linguagem Python.\n\n## Mineração de textos\n\nAtualmente temos inúmeras fontes de armazenamento de textos:\n\n- Livros\n- Jornais\n- Revistas\n- Páginas Web\n- Blogs\n- **Redes Sociais**\n- E-mails\n- Arquivos em PDF, XML e JSON\n- ... etc\n\nEstas fontes são ricas para se encontrar e extrair padrões de textos.\n\nUma característica importante é que estes tipos de dados normalmente não possuem um esquema para descrever sua estrutura de armazenamento, eles estão armazenados em diversos formatos, o que dificulta a interpretação do dado.\n\nHá basicamente dois tipos de textos\n\n- **Formatado**: possuem _tags_ que definem onde que está o título, os autores, etc.\n  - Ex: Arquivo XML, JSON, HTML, etc\n- **Livre**: não possuem indicadores explícitos, estão num formato puro\n  - Ex: O corpo de um e-mail, uma postagem de rede social, etc.\n\n## Técnicas de Mineração de Textos\n\n### Classificação\n\nÉ utilizada para reconhecer padrões que **descrevem** o grupo ao qual um determinado item pertence. Chega numa saída por meio do exame dos itens já classificados e pela inferência de um conjunto de regras.\n\n#### Classificação Exemplo 1\n\nPode ser usado para **classificação de mensagens de spam** através mensagens recebidas em caixas de e-mails como Gmail, Outlook para determinar e-mails de spam\n\n1. **Entrada**: Mensagem (assunto, texto)\n1. **Classificador**\n1. **Saída**: Classe da Mensagem (normal, spam, etc)\n\n#### Classificação Exemplo 2\n\nPode ser utilizado para **classificação de notícia**, onde um jornalista cadastra um texto de uma notícia e o mesmo é processado para determinar automáticamente os tópicos para indexação da notícia.\n\n1. **Entrada**: Texto da notícia\n1. **Classificador Multirrótulo**\n1. **Saída**: Tópicos (esporte, rio de janeiro, economia, etc)\n\n\u003e ℹ️ Outros exemplos mais aprofundados podem ser encontrados em [`docs/classificacao.md`](docs/classificacao.md)\n\n### Agrupamento _(Clustering)_\n\nÉ semelhante a **Classificação** só que para grupos ainda não definidos.\n\n#### Agrupamento Exemplo 1\n\nPode ser utilizado numa fonte como o IBGE para a **descoberta de bairros similares** (Jardim Angélica e Jdim Angélica), evitando problemas como erros de digitação\n\n#### Agrupamento Exemplo 2\n\nÉ utilizado por revistas científicas para **detecção de plágio** na submissão de artigos com frases e palavras similares à outros já publicados.\n\n### Extração de Informação\n\nTer um texto livre e extrair atributos que estão descritos neste texto.\n\n#### Extração de Informação Exemplo 1\n\nDado o **texto**:\n\n\u003e \"Apesar de ter sido escrito em 1516, Utopia continua sendo um dos mais interessantes livros sobre pensamento político. A obra de Thomas More descreve uma ilha imaginária onde não existe propriedade privada e todos se preocupam com o bem da coletividade. A nova edição foi lançada pela Editora XYZ e está sendo vendida por R$ 9,90\"\n\nPode ser extraído o **template** abaixo:\n\n- Livro: Utopia\n- Ano: 1516\n- País: -\n- Autor: Thomas More\n- Editora: XYZ\n- Preço: 9,90\n\n#### Extração de Informação Exemplo 2\n\nBaseado no exemplo acima, é possível ainda fazer a utilização de **ontologias** para representar **conceitos e relacionamentos** em um determinado domínio (a biblioteca NLTK possui algumas funcionalidades para trabalhar com isso)\n\nExemplo de um relacionamento de entidades:\n\n\u003e `Livro {nome: \"Utopia\"}` é escrito por `Autor {nome: \"Thomas More\"}` em `País {nome: \"Brasil\"}` quando `Data {ano: 1516}`\n\n### Associação\n\nÉ utilizada para se obter a correlação entre palavras\n\nNesta técnica temos um exemplo clássico, do Walmart, onde foi identificado que sempre que se vendia fralda também se vendia cerveja, fazendo-os reposicionar fisicamente os objetos nos supermercados para aprimorar vendas.\n\n#### Associação Exemplo 1\n\nDado que:\n\n\u003e 60% dos textos que contêm a palavra 'Internacional' também contêm a palavra 'Grêmio'. 3% de todos os textos contêm ambas as palavras\n\nTemos a **Representação de Correlação: {\"Internacional\"} \u003c-\u003e {\"Grêmio}**\n\n#### Associação Exemplo 2\n\nDado que:\n\n\u003e A presença do termo 'Pelé' aumenta 5 vezes a chance de ocorrência dos termos 'Copa' e '1970'\n\nTemos a **Representação de Correlação: {\"Pelé\"} \u003c-\u003e {\"Copa\", \"1970\"}**\n\n### Casamento de Esquemas\n\nPode ser utilizado para entender correspondências semânticas (mesmos significados)\n\n#### Casamento de Esquemas Exemplo 1\n\nMigração de dados entre duas bases de dados, onde possuem tabela origem e destino porém com a **primary_key** com nomes diferentes. É usado então entender automáticamente o de-para dos campos.\n\n#### Casamento de Esquemas Exemplo 2\n\nAtravés de um algorítimo de correspondência **(matcher)** permitir que um usuário esquema uma consulta em linguagem natural e a mesma ser convertida para um select no banco de dados.\n\nConsulta do usuário:\n\n\u003e Encontre os livros do Robert C. Martin ***via texto ou voz com técnicas de processamento de linguagem natural (PLN)***\n\nSaída:\n\n```sql\nSELECT titulo, ano, resumo FROM publicacoes WHERE autor like '%Robert C. Martin%' and tipo = 'livro'\n```\n\n### Recuperação da Informação\n\nÉ utilizada para **localizar e ranquear** documentos relevantes em uma coleção de documentos. Esta técnica é utilizada pela ferramenta **Apache Lucene**\n\nOnde podemos ter uma tabela hash de palavras que apontam para documentos que a contenham.\n\n| Palavra    | Ponteiro 1      | Ponteiro 2      | Ponteiro 3   | Ponteiro 4   |\n| ---------- | --------------- | --------------- | ------------ | ------------ |\n| \"goleador\" | Documento 3     | Documento 12    |              |              |\n| \"goleiro\"  | Documento 7     | **Documento 1** | Documento 27 | Documento 19 |\n| \"gol\"      | **Documento 1** | **Documento 2** |              |              |\n\n**Documento 1**: \"... um belo **gol** no segundo tempo...\"\n\n**Documento 2**: \"Não aconteceu nenhum **gol** por conta de ...\"\n\n### Sumarização de Documentos\n\nÉ aplicado algoritmo de sumarização em um texto com bastante linhas e obtêm-se um **resumo do texto** com os principais pontos em poucas linhas.\n\n## Abordagens para Mineração de Texto\n\n1. **Estatística**: Frequência dos termos, ignorando informações semânticas.\n1. **Processamento de Linguagem Natural (PLN)**:\n   - Interpretação sintática e semântica das frases.\n   - Fazer o computador entender textos escritos em linguagem humana.\n\n## Mineração de Emoção\n\nA **mineração de emoção em textos** faz parte da **mineração de textos** e é utilizado a técnica de **classificação**\n\nEm que cenários se faz útil?\n\n- Monitoramento de marcas, entidades, figuras sociais\n  - Ex: uma pessoa compra uma televisão, e faz um review na Internet, dependendo da emoção transmitida a empresa pode tomar uma decisão, como por exemplo, caso não esteja insatisfeito é bastante provavel que a emoção seja **raiva**\n- Gestão de crises;\n- Entender o que as pessoas pensam;\n\n### Classificação por Polaridade\n\nTambém chamada de **valência** é submetido um texto em um algoritmo e recebe-se uma categoria dessas três: \"Positivo\", \"Neutro\" e \"Negativo\".\n\n### Classificação por Emoção (Paul Ekman)\n\nSegundo estudo do Paul Ekman, o ser humano consegue expressar 6 emoções bases:\n\n1. Supresa\n2. Alegria\n3. Tristeza\n4. Medo\n5. Disgosto\n6. Raiva\n\n## Classificação em Textos\n\n- **Atributos previsores**: As próprias palavras\n- **Atributo meta (classe)**: Emoção (alegria e medo)\n\n| Frase                        | Classe  |\n| ---------------------------- | ------- |\n| Me sinto completamente amado | Alegria |\n| Eu estou muito bem hoje      | Alegria |\n| Isso me deixa apavorada      | Medo    |\n| Este lugar é apavorante      | Medo    |\n\nAbaixo, temos como ficaria uma base de dados da classificação acima.\n\nTodas as características (atributos previsores) são dispostas nas colunas, **eliminando duplicados**, **eliminando stop words**.\n\n\u003e É comum em uma base real de trabalho possuir mais de 70.000 características.\n\n\u003e **\"stop words\"** são palavras que não são utilizadas devido ao seu baixo valor de relevância, diminuindo assim dimensão da base de dados (Ex: \"a\", \"é\", \"ou\", \"e\", \"do\", \"deu\")\n\u003e Há também outras técnicas como **\"stemming\"** que remove os radicais das palavras também para diminuir a dimensão da base de dados (Ex: livro, livrinho, livreto, livretiol) [Estrutura e Formação das Palavras - Morfologia - Raiz/Radical](https://www.soportugues.com.br/secoes/morf/morf2.php)\n\n| Me  | Sinto | Completamente | Amado | Eu  | Estou | Muito | Bem | Hoje | Isso | Deixa | Apavorada | Este | Lugar | Apavorante | Classe  |\n| --- | ----- | ------------- | ----- | --- | ----- | ----- | --- | ---- | ---- | ----- | --------- | ---- | ----- | ---------- | ------- |\n| S   | S     | S             | S     | N   | N     | N     | N   | N    | N    | N     | N         | N    | N     | N          | Alegria |\n| N   | N     | N             | N     | S   | S     | S     | S   | S    | N    | N     | N         | N    | N     | N          | Alegria |\n| S   | N     | N             | N     | N   | N     | N     | N   | N    | S    | S     | S         | N    | N     | N          | Medo    |\n| N   | N     | N             | N     | N   | N     | N     | N   | N    | N    | N     | N         | S    | S     | S          | Medo    |\n\n## Ambiente em Python\n\n- Instalar o Python `python v3+`\n- Instalar dependências `pip install -r requirements.txt`\n\n### Natural Language ToolKit - NLTK\n\nÉ uma biblioteca para processamento de linguagem natural, escrita em Python\n\nPossui varios recursos, como: classificação, tokenização, *stemming*, *tagging*, *parsing* e raciocínio semântico.\n\nUm script de atualização da biblioteca pode ser encontrado em [`scripts/nltk_gui_update.py`](scripts/nltk_gui_update.py)\n\nCriar um script em python para atualizar as coleções do NLTK\n\n### Naive Bayes\n\nÉ um algoritmo de abordagem probabilística (Teorema de Bayes)\n\nÉ bastante utilizado em:\n\n- Filtros de spam em e-mails, analizando a probabilidade das palavras do seu conteúdo estarem relacionadas a e-mails de spam.\n- Mineração de emoções, área de computação afetiva (sub área de inteligência artificial), dado um texto é identificado a emoção do texto, podendo ser usado para avaliar o grau de satisfação dos clientes por comentários relativos a um produto.\n\nExemplo em [./docs/naive_bayes.md](./docs/naive_bayes.md)\n\n## Scripts\n\nExemplos práticos em no diretório [`./scripts`](`./scripts`)\n\n## Avaliação do algoritmo\n\n- Base de dados de teste\n- Base de dados de treinamento (bem maior que a de testes)\n\nAmbas já possuem registros classificados, onde serão aplicados cada registro da base de teste num algoritmo da base de treinamento, e os erros e acertos serão medidos. É importante que os **registros das bases sejam diferentes**, para não influenciar no teste do algoritmo, um cenário de exemplo é um professor passar 10 questões no quadro para revisão um dia antes da prova, e no dia da prova, passar as mesmas 10 questões, isso não irá de fato medir o conhecimento.\n\n### Características para se levar em consideração antes do uso\n\n1. Cenário\n2. Número de classes (com as 6 emoções, o algoritmo alcançou acerto de 39%)\n3. \"zero-rules\" dependendo da aplicação este método é mais aplicável (classifica todas as frases com base na classe mais utilizada)\n\n## Referências\n\n- [Top Five Emotion / Sentiment Analysis APIs for understanding user sentiment trends.](https://medium.com/@Mandysidana/top-five-emotional-sentiment-analysis-apis-116cd8d42055)\n- [Mineração de Emoção em Textos com Python e NLKT @ Udemy](https://www.udemy.com/mineracao-de-emocao-em-textos-com-python-e-nltk)\n- [Introdução ao NLTK na Prática](https://www.youtube.com/watch?v=siVUal-TeMc)\n- [NLTK em Português](http://www.nltk.org/howto/portuguese_en.html)\n- [Penn Part of Speech Tags](https://cs.nyu.edu/grishman/jet/guide/PennPOS.html)\n- [Estrutura e formação de palavras - Raiz e radical](https://www.soportugues.com.br/secoes/morf/morf2.php)\n- [Stemming words with NLTK](https://pythonprogramming.net/stemming-nltk-tutorial/)\n- [Markdown Table Generator](https://www.tablesgenerator.com/markdown_tables)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgdfreitasdev%2Femotion-mining-python","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgdfreitasdev%2Femotion-mining-python","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgdfreitasdev%2Femotion-mining-python/lists"}