Jak naprogramovat aplikaci, která vyhledá klíčový obsah textu

3. 1. 2021 Azure, Programming

Chcete se naučit vyhledávat klíčová slova v dlouhých dokumentech nebo vysvětlit slova, kterým nerozumíte? Tento článek vám ukáže, jak na to. Společně s námi si vytvoříte demo, které bude schopno ve vašem dokumentu najít klíčové fráze, z nichž vám vytvoří URL adresy, pomocí kterých si budete moci dané pojmy jednoduše vyhledat.

Jak vypadá výsledek?

Ještě než začneme, můžete se podívat na finální demo, které vytvoříte společně s námi. Můžete ho najít na této Heroku instanci. Máte zde připravené vše na vyzkoušení práce s umělou inteligencí a nepotřebujete k tomu ani jeden řádek kódu. Chcete-li více než jen vyzkoušet si hotový model, pokračujte s námi a vytvoříme si ho společně.

O projektu

Tento projekt vzniká v režii dvou studentů z Microsoft Studenského Trenérského Centra Anny BicanovéFilipa Troníčka. Tento článek není zdaleka jediný, který v rámci tohoto projektu vyjde, zde na blogu studuj.digital, proto se můžete těšit i na další. V tomto článku se budeme zabývat službou Text Analytics v Azure a budeme ji demonstrovat v praxi.

Co budeme potřebovat?

Azure

K tomuto projektu budete potřebovat licenci na Azure. My používáme Azure for Students. Jak aktivovat tuto licenci si přečtěte zde:

Visual Studio

Abyste se mohli pustit do tohoto projektu, budete potřebovat textový editor. Doporučujeme Visual Studio Code. Zdarma ke stažení ho najdete na code.visualstudio.com a podrobný návod k instalace si můžete projít zde:

Node.js

Open-source platformu Node.js budeme využívat k exekuci kódu. Je to zjednodušeně serverová interpretace JavaScriptu. Ke stažení ho naleznete na nodejs.org.

Jdeme na to!

Jako první si musíme vygenerovat API klíče (aplikační programovací rozhraní).

Vyhledání služby Text Analytics
Vyhledání Azure Analytics | Zdroj: portal.azure.com
Vytvoření projektu
Vytváření služby Text Analytics | Zdroj: portal.azure.com
Zde najdeme naše potřebné informace
Výsledné API klíče a Endpoint| Zdroj: portal.azure.com
npm i express
npm i express @azure/ai-text-analytics

Kód

Na začátek

Na začátek vytvoříme novou složku, kterou si otevřeme ve Visual Studio Code. Přes VS Code vytvoříme ve složce položku se jménem main.js a otevřeme ji.

Na začátek souboru importujeme naše balíčky express a @azure/ai-text-analytics

const express = require("express");
const app = express(); // definujeme si zapnutí naší aplikace
const port = 5000; // definujeme port, na kterém aplikace poběží

app.set("view engine", "ejs"); // Využijeme předlohovací systém EJS

app.use(express.static("views")); // Zde budou naše statické stránky
app.use(express.static("assets")); // Zde budou naše styly

const {TextAnalyticsClient,TextAnalyticsApiKeyCredential} = require("@azure/ai-text-analytics"); // Importujeme Azure Text Analytics

app.get("/", function (req, res) {
   //Sem půjde náš kód
});

Navrhnutí serveru tak, aby přijímal požadavky

Přijímaní požadavků budeme dělat přes HTTP GET parametry (více o nich na wikipedii) – což jednoduše znamená, že budeme komunikovat náš text k analýze přes část za „?“ v URL adrese.

Toto se dělá v Node.js naštěstí naprosto jednoduše:

const text_k_analyze = req.query.txt; //Vytvoříme konstantu, která je nastavená na parametr txt v URL adrese.

Dále budeme potřebovat někam uložit svůj API klíč a koncový bod. Vytvoříme si pro ně dvě proměnné:

const endpoint = "VAS_KONCOVY_BOD";
const key = "VAS_KLIC";

Když máme proměnné vytvořené, můžeme začít využívat Azure. Vezmeme náš text (proměnnou text_k_analyze) a pošleme ji pomocí balíčku @azure/ai-text-analytics

Teď si nastavíme hodnotu našeho Azure klienta s naším koncovým bodem a API klíčem

const textAnalyticsClient = new TextAnalyticsClient(
   endpoint,
   new TextAnalyticsApiKeyCredential(key)
 );

Dále vytvoříme funkci na ztučnění všech klíčových slov, která nám vrátí Azure.

  function boldenKeyphrases(text, phrases) {
    let finalText = text;
    phrases.forEach((keyword) => {
      finalText = finalText.replace(
        keyword,
        `<span style="font-weight: bold;">${keyword}</span>`
      );
    });
    return finalText;
  }

… a teď ho přes asynchronní funkci (funkce, na kterou může naše proměnná „počkat“, než zjistíme, co bude mít za hodnotu) zavoláme pomocí našeho @azure/ai-text-analytics Poté již můžeme poslat text a dostat z něj odpovědi, které uložíme do proměnné entityResults a zobrazíme výsledky na konzoli (příkazovém řádku).

 async function linkedEntityRecognition(client) {
      const linkedEntityInput = txt;
      const entityResults = await client.recognizeLinkedEntities(
        linkedEntityInput
      );
      const keyPhraseResult = await client.extractKeyPhrases(linkedEntityInput);
      entityResults.forEach((document) => {
        document.entities.forEach((entity) => {
          entity.matches.forEach((match) => {
            return txt.substr(match.offset, match.length + match.offset);
          });
        });
      });
      res.render("analyze", {
        returnStuff: entityResults[0].entities,
        returnText: boldenKeyphrases(
          txt
          keyPhraseResult[0].keyPhrases
        ),
      });
    }

Dále vytvoříme frontend naší aplikace přes EJS (index.ejs, který vytvoříme ve složce views).

<!DOCTYPE html>
<html lang="cs">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Text analytics</title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
    <link rel="stylesheet" href="/css/styles.css">
</head>
<body style="text-align: center;">
    <h2> Psali jste o: </h2>

    <ul>
    <br>
    <% for(url of returnUrls)  { %>
     <li>- <a class="wikiUrl" target="_blank" href="<%-url.url%>"><%- url.url.replace(/_/gi, " ").replace("https://en.wikipedia.org/wiki/", "") %> </a> </li>
    <% } %>
    </ul>
    <form action="">
        <div class="row">
            <div class="input-field col s6 offset-s3 text-red">
              <textarea placeholder="Váš text" name="txt" id="textarea1"></textarea>
            </div>
          </div>
        <br>
    <button type="submit" class="btn red">Analyzovat</button>
    </form>
    <div class="newText">
        <%- returnText %>
    </div>
</body>
<script>
</script>
</html>

Teď už jen stránku jednoduše nastylujeme a máme hotovo!

Ve složce assets/css:

@import url("https://fonts.googleapis.com/css?family=Montserrat&display=swap"); /* Importujeme font Montserrat */

textarea {
  overflow: auto; /* Automatický overflow pro hezčí zobrazení */
  width: 50vw; /* Výchozí šířka */
  max-width: 50vw; /* Maximální šířka */
  min-height: 70px; /* Minimální výška */
  max-height: 80vh; /* Maximální výška */
} :root {
  font-family: "Montserrat", sans-serif; /* Nastavení námi deklarovaného fontu na celou stránku */
}

.newText {
  max-width: 75vw; /* nastavíme maximální šířku boxu s textem */
  margin-right: auto;
  margin-left: auto;
  margin-top: 5%;
} a {
/* Nastavíme, aby odkazy vypadaly jako normální text */
  text-decoration: none;
  color: black;
}

.wikiUrl {
  font-weight: bold; /* Ztučníme seznam odkazů */
}

Nyní jen otevřeme integrovaný příkazový řádek ve VS Code (alternativně funguje i normální CMD na Windows 10) klávesovou zkratkou Ctrl+Shift+; a spustíme program následujícím příkazem:

node main.js

Závěr

Doufáme, že se vám podle našeho návodu podařilo udělat podobné demo jako jsme vytvořili my. Už v blízké době se můžete těšit na pokračování našeho projektu, který se bude zabývat službou Speech to Text a následným propojení obou služeb. Kdyby vás zajímal základní popis této služby, můžete si o ní přečíst prozatím něco zde:

Pokud jste z kódu něco nezachytili, je dostupný na GitHubu.