Lorem ipsum

Lorem ipsum

Poznámka

V této sekci najdete krátkou demonstraci toho, jak lze můj balíček používat.

Lorem ipsum je souhrnné označení pro text, který se sice podobá reálnému textu svou stavbou (tedy délkou slov, vět, poměrem samohlásek/souhlásek), ale který nedává smysl. Takový text se používá například v designu nebo typografii, kde by smysluplný text jen odváděl pozoronost. Originální lorem ipsum je latinský text, jehož první věta Lorem ipsum dolor sit amet, consectetur adipisici elit připomíná úsek z Ciceronovy tvorby.

Program

Chceme vyprodukovat vlastní lorem ipsum, jedno ve francouzštině a druhé v němčině, abychom viděli, jak bude náš layout na plakát fungovat s různými jazyky. Trénovací texty uložíme do složky assets/corpora/*jazyk*/ pod názvy src1.txtsrc3.txt.[1]

Obecně se každý program bude držet následující struktury:

  1. Načíst text a převést jej do tokenů.
  2. Natrénovat na tokenech model Markovova řetězce.
  3. Vygenerovat text pomocí modelu.

Nejprve je nutné importovat oba moduly, které tento balíček obsahuje. Pomocí klíčového slova using je naimportujete včetně jejich exportovaných symbolů. Pozn: Ve vašem programu pište jména modulů bez tečky před jménem.

using .Markovify
using .Markovify.Tokenizer

filenames_fr = [
    "assets/corpora/french/src1.txt",
    "assets/corpora/french/src2.txt",
    "assets/corpora/french/src3.txt"
]

filenames_de = [
    "assets/corpora/german/src1.txt",
    "assets/corpora/german/src2.txt",
    "assets/corpora/german/src3.txt"
]
WARNING: using Tokenizer.Tokenizer in module ex-1 conflicts with an existing identifier.

Modelové texty, na kterých se bude náš řetězec trénovat, máme uložené v několika souborech. Je tedy dobré definovat funkci, která bude umět postavit modely i z více souborů. Tyto modely poté můžeme spojit pomocí funkce combine.

Protože funkce Model očekává pole polí tokenů, musíme text tokenizovat. K tomu využijeme funkcí tokenize a words. Tím dokončíme krok 1.

function loadfiles(filenames)
    # Return an iterator
    return (
        open(filename) do f
            # Tokenize on words
            tokens = tokenize(read(f, String); on=words)
            return Model(tokens; order=1)
        end
        for filename in filenames
    )
end

Když už máme model, chtěli bychom pomocí něj vygenerovat náhodné věty. Definujeme tedy pomocnou funkci, která nám pomocí modelu vygeneruje n vět a ještě zkontroluje, zda nejsou moc krátké či dlouhé. Z toho sestává krok 2.

function gensentences(model, n)
    sentences = []
    # Stop only after n sentences were generated
    # and passed through the length test
    while length(sentences) < n
        seq = walk(model)
        # Add the sentence to the array iff its length is ok
        if length(seq) > 5 && length(seq) < 15
            push!(sentences, join(seq, " "))
        end
    end
    # Print each sentence on its own line
    println(join(sentences, "\n"))
end

Nyní už stačí jen vytvořit a natrénovat model a začít generovat! To je 3. a poslední krok.

MODEL_DE = combine(loadfiles(filenames_de)...)
gensentences(MODEL_DE, 4)
Das Aechte bleibt es auf meinem Herzen dir, Flammenbildung, weichen?
Drey Jahr’ ist auch so scharf!
Wagner. Du Ungeheuer siehst nicht die Auferstehung des Menschen feyern, Er schläft!
Den Würme nagen, Staub bedeckt, Mit Lock und der den Sälen, auf Erden?

A podobně také ve francouzštině:

MODEL_FR = combine(loadfiles(filenames_fr)...)
gensentences(MODEL_FR, 4)
Je tiens lennemi de mauvais parti; ces belles oranges avortées pour nous réunir.
Son pied était vêtue de Germaine.
Germaine se promettait de son guide sarrêter jusquà trois fois.
Project Gutenbergtm electronic work or remove the production, promotion and hold the United States.

[1]

Všechny texty použité v této demonstraci pocházejí z projektu Gutenberg.