{"id":23996,"date":"2023-09-11T04:58:16","date_gmt":"2023-09-11T07:58:16","guid":{"rendered":"https:\/\/maurinsoft.com.br\/?p=23996"},"modified":"2023-09-11T08:38:48","modified_gmt":"2023-09-11T11:38:48","slug":"grafos-teoria-e-pratica-parte-ii","status":"publish","type":"post","link":"https:\/\/maurinsoft.com.br\/wp\/grafos-teoria-e-pratica-parte-ii\/","title":{"rendered":"Grafos Teoria e Pr\u00e1tica &#8211; Parte II"},"content":{"rendered":"\n<p>Neste segundo artigo irei utilizar os grafos para realizar uma pesquisa.<\/p>\n\n\n\n<p>Para isso usarei partes do projeto j\u00e1 criado.<\/p>\n\n\n\n<p>Se voc\u00ea n\u00e3o viu o primeiro artigo, recomendo que veja ele primeiro:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-maurinsoft wp-block-embed-maurinsoft\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"TYxdzcenY3\"><a href=\"https:\/\/maurinsoft.com.br\/grafos-teoria-e-pratica\/\">Grafos Teoria e Pr\u00e1tica<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;Grafos Teoria e Pr\u00e1tica&#8221; &#8212; \" src=\"https:\/\/maurinsoft.com.br\/grafos-teoria-e-pratica\/embed\/#?secret=6UGEREa4uM#?secret=TYxdzcenY3\" data-secret=\"TYxdzcenY3\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>Este segundo artigo \u00e9 mais pr\u00e1tico, ent\u00e3o vamos a m\u00e3o na massa!<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Criando conex\u00e3o:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import mysql.connector\nimport nltk\nnltk.download(\"stopwords\")\nfrom nltk.corpus import stopwords\n\n\nstop_words = set(stopwords.words('portuguese'))\n\n# Configura\u00e7\u00e3o da conex\u00e3o com o banco\nDB_CONFIG = {\n    \"host\": \"localhost\",\n    \"user\": \"username\",\n    \"password\": \"password\",\n    \"database\": \"graph_db\"\n}\n\n\"\"\"Cria arestas com base em frases de exemplo.\"\"\"\nfrases = &#91;\n        \"Comece a grava\u00e7\u00e3o de \u00e1udio\",\n        \"Salve esse texto importante\",\n        \"Defina um alerta para amanh\u00e3\",\n        \"Quero a grava\u00e7\u00e3o dessa reuni\u00e3o\",\n        \"Salve a anota\u00e7\u00e3o rapidamente\"\n]\n\ncomandos = &#91;\n        \"Iniciar grava\u00e7\u00e3o\",\n        \"Salvar texto\",\n        \"Configurar alerta\",\n        \"Iniciar grava\u00e7\u00e3o\",\n        \"Salvar anota\u00e7\u00e3o\"\n]\n\n#Treinamento e teste\nmatriz = &#91;\r\n    &#91;\"Comece a gravar agora\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Inicie a grava\u00e7\u00e3o do \u00e1udio\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Por favor, ative a grava\u00e7\u00e3o\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Vamos come\u00e7ar a grava\u00e7\u00e3o\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Quero que comece a gravar\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"D\u00ea in\u00edcio \u00e0 grava\u00e7\u00e3o\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Preciso gravar isso\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Vamos gravar essa conversa\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Inicie a capta\u00e7\u00e3o do \u00e1udio\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Gostaria de gravar este momento\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Por gentileza, inicie a grava\u00e7\u00e3o\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Capture esse \u00e1udio\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Quero guardar esse som\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Vamos documentar esse \u00e1udio\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Grave essa sess\u00e3o\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Desejo registrar esse som\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Vamos dar start na grava\u00e7\u00e3o\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Por favor, comece a gravar\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Gostaria de iniciar a grava\u00e7\u00e3o\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Desejo capturar este \u00e1udio\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Preserve este texto\", \"Salvar texto\"],\r\n    &#91;\"Quero guardar essa informa\u00e7\u00e3o\", \"Salvar texto\"],\r\n    &#91;\"Salve estas palavras\", \"Salvar texto\"],\r\n    &#91;\"Documente este conte\u00fado\", \"Salvar texto\"],\r\n    &#91;\"Registre esta informa\u00e7\u00e3o\", \"Salvar texto\"],\r\n    &#91;\"Gostaria de salvar este documento\", \"Salvar texto\"],\r\n    &#91;\"Por favor, salve esse texto\", \"Salvar texto\"],\r\n    &#91;\"Desejo guardar este conte\u00fado\", \"Salvar texto\"],\r\n    &#91;\"Capture esta informa\u00e7\u00e3o em texto\", \"Salvar texto\"],\r\n    &#91;\"Guarde essa anota\u00e7\u00e3o\", \"Salvar texto\"],\r\n    &#91;\"Defina um alarme para 9h\", \"Configurar alerta\"],\r\n    &#91;\"Quero ser alertado \u00e0s 10h\", \"Configurar alerta\"],\r\n    &#91;\"Lembre-me de algo \u00e0s 11h\", \"Configurar alerta\"],\r\n    &#91;\"Ative um lembrete para o meio-dia\", \"Configurar alerta\"],\r\n    &#91;\"Preciso de um alerta para as 13h\", \"Configurar alerta\"],\r\n    &#91;\"Por favor, configure um alerta para 14h\", \"Configurar alerta\"],\r\n    &#91;\"Quero ser notificado \u00e0s 15h\", \"Configurar alerta\"],\r\n    &#91;\"Defina um lembrete para 16h\", \"Configurar alerta\"],\r\n    &#91;\"Lembre-me disso \u00e0s 17h\", \"Configurar alerta\"],\r\n    &#91;\"Configure um alerta para 18h\", \"Configurar alerta\"],\r\n    &#91;\"Fa\u00e7a uma nota disto\", \"Salvar anota\u00e7\u00e3o\"],\r\n    &#91;\"Quero que isso fique registrado\", \"Salvar anota\u00e7\u00e3o\"],\r\n    &#91;\"Documente esta observa\u00e7\u00e3o\", \"Salvar anota\u00e7\u00e3o\"],\r\n    &#91;\"Anote isto, por favor\", \"Salvar anota\u00e7\u00e3o\"],\r\n    &#91;\"Preserve esta anota\u00e7\u00e3o\", \"Salvar anota\u00e7\u00e3o\"],\r\n    &#91;\"Por favor, fa\u00e7a uma nota sobre isso\", \"Salvar anota\u00e7\u00e3o\"],\r\n    &#91;\"Desejo que isso seja anotado\", \"Salvar anota\u00e7\u00e3o\"],\r\n    &#91;\"Guarde este registro\", \"Salvar anota\u00e7\u00e3o\"],\r\n    &#91;\"Capture esta nota\", \"Salvar anota\u00e7\u00e3o\"],\r\n    &#91;\"Quero esta informa\u00e7\u00e3o documentada\", \"Salvar anota\u00e7\u00e3o\"],\r\n]<\/code><\/pre>\n\n\n\n<p>Agora criamos a fun\u00e7\u00e3o de conex\u00e3o com banco de dados:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def connect_to_database():\r\n    \"\"\"Retorna uma conex\u00e3o com o banco de dados.\"\"\"\r\n    return mysql.connector.connect(**DB_CONFIG)<\/code><\/pre>\n\n\n\n<p>Eu pedi ao chatGPT criar a matriz est\u00e1tica contendo varia\u00e7\u00f5es de solicita\u00e7\u00f5es de comando.<\/p>\n\n\n\n<p>Desta forma poderia apresentar o texto e testar os resultados.<\/p>\n\n\n\n<p>Lembrando que como uso grafos duplamente ligados, a qualidade dos resultados depende muito do treinamento.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>matriz_teste = &#91;\r\n    &#91;\"D\u00ea in\u00edcio \u00e0 captura de som\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Gostaria de ouvir isso depois\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Por gentileza, registre este momento\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Ative o modo grava\u00e7\u00e3o\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Preserve este \u00e1udio para mim\", \"Iniciar grava\u00e7\u00e3o\"],\r\n    &#91;\"Assegure que este texto esteja seguro\", \"Salvar texto\"],\r\n    &#91;\"Fa\u00e7a uma c\u00f3pia deste conte\u00fado\", \"Salvar texto\"],\r\n    &#91;\"Deixe este texto registrado\", \"Salvar texto\"],\r\n    &#91;\"Fixe esta informa\u00e7\u00e3o\", \"Salvar texto\"],\r\n    &#91;\"Quero ter este texto para depois\", \"Salvar texto\"],\r\n    &#91;\"Estabele\u00e7a um aviso para 19h\", \"Configurar alerta\"],\r\n    &#91;\"Preciso ser lembrado \u00e0s 20h\", \"Configurar alerta\"],\r\n    &#91;\"Por favor, defina um bip para 21h\", \"Configurar alerta\"],\r\n    &#91;\"Quero um aviso sonoro para as 22h\", \"Configurar alerta\"],\r\n    &#91;\"Fa\u00e7a um lembrete vibrar \u00e0s 23h\", \"Configurar alerta\"],\r\n    &#91;\"Gostaria de ter isso em minhas notas\", \"Salvar anota\u00e7\u00e3o\"],\r\n    &#91;\"Anote isto para mim\", \"Salvar anota\u00e7\u00e3o\"],\r\n    &#91;\"Mantenha esta informa\u00e7\u00e3o como uma nota\", \"Salvar anota\u00e7\u00e3o\"],\r\n    &#91;\"Quero isto em formato de anota\u00e7\u00e3o\", \"Salvar anota\u00e7\u00e3o\"],\r\n    &#91;\"Por favor, transforme isso em uma nota\", \"Salvar anota\u00e7\u00e3o\"]\r\n]\r\n<\/code><\/pre>\n\n\n\n<p>No artigo anterior, criamos apenas algumas frases para popular nossa base. <\/p>\n\n\n\n<p>Iremos modificar um pouco nosso programa<\/p>\n\n\n\n<p>Nas palavras vamos incluir a op\u00e7\u00e3o de cadastro, porem se j\u00e1 existir ja passamos o ID:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Fun\u00e7\u00e3o para cadastrar palavras\r\ndef CadastraWords(word_name):\r\n    connection = connect_to_database()\r\n    cursor = connection.cursor()\r\n    \r\n    # Verifica se a palavra j\u00e1 est\u00e1 cadastrada\r\n    cursor.execute(\"SELECT word_id FROM words WHERE word_name = %s\", (word_name,))\r\n    result = cursor.fetchone()\r\n    if result:\r\n        return result&#91;0]\r\n    \r\n    cursor.execute(\"INSERT INTO words (word_name) VALUES (%s)\", (word_name,))\r\n    connection.commit()\r\n    word_id = cursor.lastrowid\r\n    \r\n    cursor.close()\r\n    connection.close()\r\n    \r\n    return word_id<\/code><\/pre>\n\n\n\n<p>J\u00e1 na op\u00e7\u00e3o de arestas, iremos usar o CadastraWords, conforme apresentado a seguir:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def CriaArestas(Word1, Word2, Cmd):\r\n    print(Word1)\r\n    print(Word2)\r\n    \"\"\"Cria uma aresta associando Word1 e Word2 ao comando Cmd.\"\"\"\r\n    #word1_id = get_id_words(Word1, \"word_name\")\r\n    #word2_id = get_id_words(Word2, \"word_name\")\r\n    word1_id = CadastraWords(Word1)\r\n    word2_id = CadastraWords(Word2)\r\n    cmd_id = get_id_commands(Cmd,  \"command_name\")\r\n\r\n    print(word1_id);\r\n    print(word2_id);\r\n    print(cmd_id);\r\n\r\n    if not word1_id or not word2_id or not cmd_id:\r\n        print(\"Erro: Um ou mais valores n\u00e3o foram encontrados no banco de dados.\")\r\n        return\r\n\r\n    connection = connect_to_database()\r\n    cursor = connection.cursor()\r\n    \r\n    insert_query = \"\"\"\r\n    INSERT INTO edges (word_id1, word_id2, command_id)\r\n    VALUES (%s, %s, %s)\r\n    \"\"\"\r\n    \r\n    try:\r\n        cursor.execute(insert_query, (word1_id, word2_id, cmd_id))\r\n        connection.commit()\r\n    except mysql.connector.Error as err:\r\n        print(f\"Erro ao inserir aresta: {err}\")\r\n    \r\n    cursor.close()\r\n    connection.close()<\/code><\/pre>\n\n\n\n<p>Por fim iremos incluir nos grafos os itens do treinamento:<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Fun\u00e7\u00e3o para popular com dados de teste<\/h1>\n\n\n\n<p>Nela criamos e povoamos os 200 testes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Fun\u00e7\u00e3o para popular com dados de teste\r\ndef Popula_Teste():\r\n    stop_words = set(stopwords.words('portuguese'))\r\n\r\n    for item in matriz_teste:\r\n        frase, comando = item\r\n        words = word_tokenize(frase, language=\"portuguese\")\r\n        filtered_words = &#91;w for w in words if w.lower() not in stop_words and w.isalpha()]\r\n\r\n        for i in range(len(filtered_words) - 1):\r\n            CriaArestas(filtered_words&#91;i], filtered_words&#91;i + 1], comando)\r\n<\/code><\/pre>\n\n\n\n<p>Agora iremos chamar a fun\u00e7\u00e3o e testar:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Popula_Teste()<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Primeiros Testes<\/h2>\n\n\n\n<p>Agora iremos utilizar nossa matriz de teste (matriz_teste) para aferir quais os resultados que ele acha. Lembrando que para realizar tal fa\u00e7anha usamos novos c\u00f3digos.<\/p>\n\n\n\n<p>Nesta primeira fun\u00e7\u00e3o testamos o resultado, individualmente.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def Teste_Validacao(Frase, comando):\r\n    stop_words = set(stopwords.words('portuguese'))\r\n    connection = connect_to_database()\r\n    cursor = connection.cursor()\r\n    \r\n    # Tokenize e limpe a frase\r\n    words = word_tokenize(Frase, language=\"portuguese\")\r\n    filtered_words = &#91;w.lower() for w in words if w.lower() not in stop_words and w.isalpha()]\r\n\r\n    # Obtenha o ID do comando\r\n    cursor.execute(\"SELECT command_id FROM commands WHERE command_name = %s\", (comando,))\r\n    command_id = cursor.fetchone()\r\n    if not command_id:\r\n        return \"Comando n\u00e3o encontrado.\"\r\n    command_id = command_id&#91;0]\r\n\r\n    # Verifique a presen\u00e7a de pares de palavras na tabela edges\r\n    total_matches = 0\r\n    for i in range(len(filtered_words) - 1):\r\n        cursor.execute(\"\"\"SELECT COUNT(*) FROM edges\r\n                          WHERE word_id1 = (SELECT word_id FROM words WHERE word_name = %s)\r\n                          AND word_id2 = (SELECT word_id FROM words WHERE word_name = %s)\r\n                          AND command_id = %s\"\"\", (filtered_words&#91;i], filtered_words&#91;i + 1], command_id))\r\n        total_matches += cursor.fetchone()&#91;0]\r\n\r\n    # Matriz de confus\u00e3o: &#91;Predicted True, Predicted False; Actual True, Actual False]\r\n    confusion_matrix = &#91;&#91;0, 0], &#91;0, 0]]\r\n    if total_matches > 0:  # Se houver combina\u00e7\u00f5es, assuma que a previs\u00e3o \u00e9 verdadeira\r\n        confusion_matrix&#91;0]&#91;0] = 1\r\n    else:  # Se n\u00e3o houver combina\u00e7\u00f5es, assuma que a previs\u00e3o \u00e9 falsa\r\n        confusion_matrix&#91;1]&#91;1] = 1\r\n\r\n    cursor.close()\r\n    connection.close()\r\n\r\n    return confusion_matrix<\/code><\/pre>\n\n\n\n<p>Neste segundo, usamos a matriz para criar uma matriz de confus\u00e3o:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def plot_confusion_matrix(confusion_matrix, classes, title='Matriz de Confus\u00e3o', cmap=plt.cm.Blues):\r\n    plt.figure(figsize=(10, 7))\r\n    sns.heatmap(confusion_matrix, annot=True, cmap=cmap, fmt='g', xticklabels=classes, yticklabels=classes)\r\n    plt.ylabel('Comando verdadeiro')\r\n    plt.xlabel('Comando previsto')\r\n    plt.title(title)\r\n    plt.show()\r\n\r\ndef Testa_Validacao():\r\n    \r\n    conn = connect_to_database()\r\n    cursor = conn.cursor()\r\n    \r\n    # Lista de stopwords em portugu\u00eas\r\n    stop_words = set(stopwords.words('portuguese'))\r\n    \r\n    confusion_matrix = np.zeros((len(comandos), len(comandos)))\r\n\r\n    for item in matriz_teste:\r\n        frase, comando_verdadeiro = item\r\n        \r\n        # Processa a frase: remove stopwords, converte para min\u00fasculo\r\n        palavras = &#91;word for word in frase.lower().split() if word not in stop_words and not word.isdigit()]\r\n\r\n        # Encontre os IDs das palavras\r\n        word_ids = &#91;]\r\n        for palavra in palavras:\r\n            cursor.execute(\"SELECT word_id FROM words WHERE word_name = %s\", (palavra,))\r\n            result = cursor.fetchone()\r\n            if result:\r\n                word_ids.append(result&#91;0])\r\n\r\n        # Encontre a aresta com maior frequ\u00eancia baseada nas palavras\r\n        comando_previsto = None\r\n        max_count = -1\r\n        for i in range(len(word_ids)-1):\r\n            cursor.execute(\"\"\"\r\n                SELECT command_id, COUNT(*) as freq\r\n                FROM edges\r\n                WHERE word_id1 = %s AND word_id2 = %s\r\n                GROUP BY command_id\r\n                ORDER BY freq DESC\r\n                LIMIT 1\r\n            \"\"\", (word_ids&#91;i], word_ids&#91;i+1]))\r\n            result = cursor.fetchone()\r\n            if result and result&#91;1] > max_count:\r\n                comando_previsto = result&#91;0]\r\n                max_count = result&#91;1]\r\n        \r\n        if comando_previsto:\r\n            # Converte o ID do comando para nome\r\n            cursor.execute(\"SELECT command_name FROM commands WHERE command_id = %s\", (comando_previsto,))\r\n            result = cursor.fetchone()\r\n            if result:\r\n                comando_previsto_name = result&#91;0]\r\n                confusion_matrix&#91;comandos.index(comando_verdadeiro)]&#91;comandos.index(comando_previsto_name)] += 1\r\n\r\n    conn.close()\r\n\r\n    # Plota a matriz de confus\u00e3o\r\n    plt.figure(figsize=(10,7))\r\n    sns.heatmap(confusion_matrix, annot=True, cmap=\"YlGnBu\", xticklabels=comandos, yticklabels=comandos)\r\n    plt.xlabel('Comando Previsto')\r\n    plt.ylabel('Comando Verdadeiro')\r\n    plt.show()<\/code><\/pre>\n\n\n\n<p>Por fim, chamamos os dados de Testa_Validacao.<\/p>\n\n\n\n<p>Testa_Validacao()<\/p>\n\n\n\n<p>Gerando uma matriz conforme apresentado:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"872\" height=\"607\" src=\"https:\/\/maurinsoft.com.br\/wp-content\/uploads\/2023\/09\/image-11.png\" alt=\"\" class=\"wp-image-24017\" srcset=\"https:\/\/maurinsoft.com.br\/wp\/wp-content\/uploads\/2023\/09\/image-11.png 872w, https:\/\/maurinsoft.com.br\/wp\/wp-content\/uploads\/2023\/09\/image-11-600x418.png 600w, https:\/\/maurinsoft.com.br\/wp\/wp-content\/uploads\/2023\/09\/image-11-300x209.png 300w, https:\/\/maurinsoft.com.br\/wp\/wp-content\/uploads\/2023\/09\/image-11-768x535.png 768w\" sizes=\"auto, (max-width: 872px) 100vw, 872px\" \/><\/figure>\n<\/div>\n\n\n<p>Perceba que a linha diagonal, \u00e9 o que realmente desejamos. Perceba que houve intencionalmente uma duplica\u00e7\u00e3o do iniciar grava\u00e7\u00e3o, e que a segunda vez que ele apareceu, os dados n\u00e3o foram mostrados. <\/p>\n\n\n\n<p>A apresenta\u00e7\u00e3o deste problema pode ocorrer, em especial quando existir muitos grafos e muitos comandos, e seu tratamento ser\u00e1 necess\u00e1rio pelo algoritmo que o propuser.<\/p>\n\n\n\n<p>Por fim, para os amantes do fonte de gra\u00e7a, segue a referencia do GITHUB:<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/marcelomaurin\/grafo01\">https:\/\/github.com\/marcelomaurin\/grafo01<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neste segundo artigo irei utilizar os grafos para realizar uma pesquisa. Para isso usarei partes do projeto j\u00e1 criado. Se voc\u00ea n\u00e3o viu o primeiro artigo, recomendo que veja ele primeiro: Este segundo artigo \u00e9 mais pr\u00e1tico, ent\u00e3o vamos a m\u00e3o na massa! Criando conex\u00e3o: Agora criamos a fun\u00e7\u00e3o de conex\u00e3o com banco de dados: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":23955,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[39,51],"tags":[504,231,339],"class_list":["post-23996","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ia","category-python","tag-grafos","tag-ia","tag-python"],"_links":{"self":[{"href":"https:\/\/maurinsoft.com.br\/wp\/wp-json\/wp\/v2\/posts\/23996","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maurinsoft.com.br\/wp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maurinsoft.com.br\/wp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maurinsoft.com.br\/wp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maurinsoft.com.br\/wp\/wp-json\/wp\/v2\/comments?post=23996"}],"version-history":[{"count":16,"href":"https:\/\/maurinsoft.com.br\/wp\/wp-json\/wp\/v2\/posts\/23996\/revisions"}],"predecessor-version":[{"id":24023,"href":"https:\/\/maurinsoft.com.br\/wp\/wp-json\/wp\/v2\/posts\/23996\/revisions\/24023"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/maurinsoft.com.br\/wp\/wp-json\/wp\/v2\/media\/23955"}],"wp:attachment":[{"href":"https:\/\/maurinsoft.com.br\/wp\/wp-json\/wp\/v2\/media?parent=23996"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurinsoft.com.br\/wp\/wp-json\/wp\/v2\/categories?post=23996"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurinsoft.com.br\/wp\/wp-json\/wp\/v2\/tags?post=23996"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}