You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Data-Science-For-Beginners/translations/pt-PT/1-Introduction/01-defining-data-science/notebook.ipynb

322 lines
11 KiB

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Desafio: Analisando Texto sobre Ciência de Dados\n",
"\n",
"Neste exemplo, vamos fazer um exercício simples que cobre todos os passos de um processo tradicional de ciência de dados. Não tem de escrever nenhum código, pode simplesmente clicar nas células abaixo para as executar e observar o resultado. Como desafio, é incentivado a experimentar este código com dados diferentes.\n",
"\n",
"## Objetivo\n",
"\n",
"Nesta lição, temos discutido diferentes conceitos relacionados com Ciência de Dados. Vamos tentar descobrir mais conceitos relacionados fazendo alguma **mineração de texto**. Vamos começar com um texto sobre Ciência de Dados, extrair palavras-chave deste, e depois tentar visualizar o resultado.\n",
"\n",
"Como texto, vou usar a página sobre Ciência de Dados da Wikipédia:\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"url = 'https://en.wikipedia.org/wiki/Data_science'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Passo 1: Obter os Dados\n",
"\n",
"O primeiro passo em qualquer processo de ciência de dados é obter os dados. Vamos usar a biblioteca `requests` para isso:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import requests\n",
"\n",
"# Define a custom header.\n",
"headers = {\n",
" 'User-Agent': 'DataScienceChallenge/1.0 (myemail@gmail.com)'\n",
"}\n",
"\n",
"# Pass the headers into the get request\n",
"response = requests.get(url, headers=headers)\n",
"\n",
"if response.status_code == 200:\n",
" text = response.content.decode('utf-8')\n",
" print(text[:1000])\n",
"else:\n",
" print(f\"Error: {response.status_code}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Passo 2: Transformar os Dados\n",
"\n",
"O passo seguinte é converter os dados para a forma adequada ao processamento. No nosso caso, descarregámos código fonte HTML da página, e precisamos de o converter em texto simples.\n",
"\n",
"Existem muitas maneiras de fazer isto. Vamos usar [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/), uma biblioteca Python popular para parsing de HTML. O BeautifulSoup permite-nos selecionar elementos HTML específicos, para que possamos focar no conteúdo principal do artigo da Wikipédia e reduzir alguns menus de navegação, barras laterais, rodapés e outro conteúdo irrelevante (embora algum texto padrão possa ainda permanecer).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Primeiro, precisamos de instalar a biblioteca BeautifulSoup para a análise de HTML:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"!{sys.executable} -m pip install beautifulsoup4"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from bs4 import BeautifulSoup\n",
"\n",
"# Parse the HTML content\n",
"soup = BeautifulSoup(text, 'html.parser')\n",
"\n",
"# Extract only the main article content from Wikipedia\n",
"# Wikipedia uses 'mw-parser-output' class for the main article content\n",
"content = soup.find('div', class_='mw-parser-output')\n",
"\n",
"def clean_wikipedia_content(content_node):\n",
" \"\"\"Remove common non-article elements from a Wikipedia content node.\"\"\"\n",
" # Strip jump links, navboxes, reference lists/superscripts, edit sections, TOC, sidebars, etc.\n",
" selectors = [\n",
" '.mw-jump-link',\n",
" '.navbox',\n",
" '.reflist',\n",
" 'sup.reference',\n",
" '.mw-editsection',\n",
" '.hatnote',\n",
" '.metadata',\n",
" '.infobox',\n",
" '#toc',\n",
" '.toc',\n",
" '.sidebar',\n",
" ]\n",
" for selector in selectors:\n",
" for el in content_node.select(selector):\n",
" el.decompose()\n",
"\n",
"if content:\n",
" # Clean the content node to better approximate article text only.\n",
" clean_wikipedia_content(content)\n",
" text = content.get_text(separator=' ', strip=True)\n",
" print(text[:1000])\n",
"else:\n",
" print(\"Could not find main content. Using full page text.\")\n",
" text = soup.get_text(separator=' ', strip=True)\n",
" print(text[:1000])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Passo 3: Obter Perceções\n",
"\n",
"O passo mais importante é transformar os nossos dados numa forma a partir da qual possamos tirar perceções. No nosso caso, queremos extrair palavras-chave do texto e ver quais são as mais significativas.\n",
"\n",
"Vamos usar a biblioteca Python chamada [RAKE](https://github.com/aneesha/RAKE) para a extração de palavras-chave. Primeiro, vamos instalar esta biblioteca caso não esteja presente: \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"!{sys.executable} -m pip install nlp_rake"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A funcionalidade principal está disponível a partir do objeto `Rake`, que podemos personalizar utilizando alguns parâmetros. No nosso caso, vamos definir o comprimento mínimo de uma palavra-chave para 5 caracteres, a frequência mínima de uma palavra-chave no documento para 3, e o número máximo de palavras numa palavra-chave - para 2. Sinta-se à vontade para experimentar outros valores e observar o resultado.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import nlp_rake\n",
"extractor = nlp_rake.Rake(max_words=2,min_freq=3,min_chars=5)\n",
"res = extractor.apply(text)\n",
"res"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"Obtivemos uma lista de termos juntamente com o grau de importância associado. Como pode ver, as disciplinas mais relevantes, como machine learning e big data, estão presentes na lista nas posições superiores.\n",
"\n",
"## Passo 4: Visualizar o Resultado\n",
"\n",
"As pessoas conseguem interpretar melhor os dados em forma visual. Assim, muitas vezes faz sentido visualizar os dados para retirar algumas conclusões. Podemos usar a biblioteca `matplotlib` em Python para traçar uma distribuição simples das palavras-chave com a sua relevância:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"def plot(pair_list):\n",
" k,v = zip(*pair_list)\n",
" plt.bar(range(len(k)),v)\n",
" plt.xticks(range(len(k)),k,rotation='vertical')\n",
" plt.show()\n",
"\n",
"plot(res)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Existe, no entanto, uma forma ainda melhor de visualizar as frequências das palavras - usando **Word Cloud** (Nuvem de Palavras). Vamos precisar de instalar outra biblioteca para desenhar a nuvem de palavras a partir da nossa lista de palavras-chave.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"!{sys.executable} -m pip install wordcloud"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"O objeto `WordCloud` é responsável por receber texto original ou uma lista pré-calculada de palavras com as suas frequências, e devolver uma imagem, que pode depois ser exibida usando `matplotlib`:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from wordcloud import WordCloud\n",
"import matplotlib.pyplot as plt\n",
"\n",
"wc = WordCloud(background_color='white',width=800,height=600)\n",
"plt.figure(figsize=(15,7))\n",
"plt.imshow(wc.generate_from_frequencies({ k:v for k,v in res }))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Também podemos passar o texto original para `WordCloud` - vamos ver se conseguimos obter um resultado semelhante:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(15,7))\n",
"plt.imshow(wc.generate(text))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"wc.generate(text).to_file('images/ds_wordcloud.png')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pode ver que a nuvem de palavras agora parece mais impressionante, mas também contém muito ruído (por exemplo, palavras não relacionadas como `Retrieved on`). Além disso, obtemos menos palavras-chave que consistem em duas palavras, como *data scientist* ou *computer science*. Isto acontece porque o algoritmo RAKE faz um trabalho muito melhor ao selecionar boas palavras-chave a partir do texto. Este exemplo ilustra a importância do pré-processamento e limpeza dos dados, porque uma imagem clara no final nos permitirá tomar melhores decisões.\n",
"\n",
"Neste exercício, percorremos um processo simples de extração de algum significado do texto da Wikipédia, na forma de palavras-chave e nuvem de palavras. Este exemplo é bastante simples, mas demonstra bem todos os passos típicos que um data scientist segue ao trabalhar com dados, começando pela aquisição de dados até à visualização.\n",
"\n",
"No nosso curso, discutiremos todos esses passos em detalhe.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Aviso Legal**:\nEste documento foi traduzido utilizando o serviço de tradução automática [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos pela precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se tradução profissional humana. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas resultantes da utilização desta tradução.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
"metadata": {
"interpreter": {
"hash": "c28e7b6bf4e5b397b8288a85bf0a94ea8d3585ce2b01919feb195678ec71581b"
},
"kernelspec": {
"display_name": "Python 3.8.11 64-bit ('base': conda)",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.11"
}
},
"nbformat": 4,
"nbformat_minor": 2
}