MediaCategorizer

Systemarchitektur

Autor Tobias Kiertscher kiertscher@fh-brandenburg.de Fachhochschule Brandenburg
Datum 29.04.2014
Version 0.6.0

Dieses Dokument beschreibt die Architektur und Implementierung von MediaCategorizer. Es soll Softwareentwicklern helfen die Software zu verstehen und somit eine Anpassung und Erweiterung unterstützen.

Übersicht

Das Projekt setzt sich aus den folgenden Komponenten zusammen (siehe Abbildung 1).

Abbildung 1: Übersicht über die Architektur von MediaCategorizer
Abbildung 1: Übersicht über die Architektur von MediaCategorizer

Das Hauptprojekt dient als Startpunkt. Es enthält die Dokumentation und eine Anzahl von Scripts zur Automatisierung des Projektes. Durch die Automatisierung werden die folgenden Aktionen unterstützt:

Die Benutzeroberfläche ermöglicht das benutzerfreundliche Verwalten von Projekten (Medien, Kategorien, Parameter). Sie ist für die Koordination der Prozessausführung verantwortlich und nutzt die übrigen Komponenten über deren Befehlszeilenschnittstelle.

Die Tonspurextraktion löst aus den Medien die Tonspur heraus und konvertiert sie in ein Format, das von der Komponente zur Wellenformvisualisierung und der Komponente zur Spracherkennung unterstützt wird.

Die Wellenformvisualisierung erzeugt aus der extrahierten Tonspur eine bildliche Darstellung des Tonsignals. Dieses wird in der HTML5-Ausgabe eingebunden und dient der Veranschaulichung der Dynamik des Tonsignals.

Die Spracherkennung steuert die Microsoft Speech API an und speichert die Spracherkennungsergebnisse als Zwischenergebnis in einer EDN-Datei, welche von der Komponente für Analyse und Visualisierung gelesen werden kann.

Die Komponente für Analyse und Visualisierung filtert zunächst die erkannten Worte und bildet anschließend für Medien und Kategorien Worthäufigkeitslisten. Diese werden in Form von Wortwolken visualisiert. Aus den Worthäufigkeitslisten von Medien und Kategorien werden die Übereinstimmungen zwischen Medien und Kategorien berechnet. Aus den Übereinstimmungen werden dann Zuordnungen zwischen Medien und Kategorien abgeleitet. Die Ergebnisse (einschließlich der erkannten Worte mit ihren Erkennungssicherheiten) werden in Form einer XML-Datei gespeichert. Zusätzlich werden die Volltexte der einzelnen Medien als Reintext gespeichert. Abschließend wird eine statische HTML5-Webseite generiert welche alle Ergebnisse visuell aufbereitet darstellt, die Original-Mediendateien einbindet und eine interaktive Navigation zwischen den Analyseergebnissen erlaubt. Diese Webseite kann sowohl lokal gespeichert und direkt mit einem Browser betrachtet werden, sie kann aber auch mit Hilfe eines Webservers gehostet und so über das Internet verfügbar gemacht werden.

Entwicklungsumgebung

MediaCategorizer wurde mit C# in Visual Studio 2013 und Clojure in LightTable 0.5 implementiert. Deshalb benötigt das Projekt sowohl die Microsoft .NET Laufzeitumgebung als auch die Java Laufzeitumgebung. C# wurden gewählt, weil es mit der WPF-Bibliothek eine schnelle Entwicklung der Benutzeroberfläche und durch die .NET-Schnittstelle eine einfache Anbindung an die Microsoft Speech API ermöglicht. Clojure wurde gewählt, weil das funktionale Programmierparadigma, die komfortablen Bibliotheken für Webseitenerzeugung und die interaktive Entwicklungsumgebung (REPL) eine schnelle Umsetzung der Analyse und Visualisierung ermöglichen. Für die Projektautomatisierung wird die Microsoft PowerShell eingesetzt.

Voraussetzungen

Komponenten

In den folgenden Abschnitten werden die einzelnen Komponenten detailliert beschrieben.

Hauptprojekt

Projektname: MediaCategorizer
Repository: https://github.com/mastersign/mediacategorizer/
Verzeichnis: /

Merkmale

Setup

  1. Installieren der Voraussetzungen

    Für das Kompilieren der Komponenten müssen mindestens .NET 4.5, JDK 7 und PowerShell 3 installiert sein. Für das Erzeugen der Projektdokumentation in HTML und DOCX müssen mindestens PowerShell 3 und pandoc installiert sein.

  2. Klonen des Hauptprojektes in ein lokales Repository

    Befehlszeile mit git in PATH öffnen und > git clone https://github.com/mastersign/mediacategorizer.git D:\MediaCategorizer ausführen. Der Pfad D:\MediaCategorizer kann bei Bedarf angepasst werden.

  3. Erzeugen der Projektdokumentation in HTML und DOCX

    In das Verzeichnis auto wechseln und die Windows-Batch-Datei transform-all-documents.bat ausführen. Der Vorgang wird in der Datei transform-all-documents.log protokolliert.

    War die Ausführung des Skripts erfolgreich, wurden für jede Markdown-Datei aus dem Verzeichnis docs je eine HTML-Datei und eine DOCX-Datei im Verzeichnis docs\out erzeugt. Für die HTML-Dateien wurde zusätzlich das Verzeichnis docs\images nach docs\out\images kopiert.

  4. Herunterladen der externen Programme, klonen der Komponenten-Repositories, bauen der Komponenten

    In das Verzeichnis auto wechseln und die Windows-Batch-Datei update-build-release.bat ausführen. Der Vorgang wird in der Datei update-build-release.log protokolliert.

    Die einzelnen Schritte Update-Tools.ps1, Update-Components.ps1, Build-Project.ps1 und Create-Release.sp1 können auch einzeln ausgeführt werden. Es muss aber berücksichtigt werden, dass die Ausführungsrichtlinie der PowerShell von Restricted auf RemoteSigned oder Unrestricted gesetzt werden muss. Dazu muss die PowerShell mit Administrationsrechten gestartet werden und der Befehl > Set-ExecutionPolicy RemoteSigned -Force ausgeführt werden.

    War die Ausführung des Skripts erfolgreich, wurde im Verzeichnis release ein vollständiges Paket mit MediaCategorizer und allen erforderlichen Abhängigkeiten zusammengestellt.

    Um MediaCategorizer in Betrieb zu nehmen sind die Anweisungen im Benutzerhandbuch Abschnitt Installation zu beachten.

Benutzeroberfläche

Projektname: MediaCategorizer - UI
Repository: https://github.com/mastersign/mediacategorizer-ui/
Verzeichnis: /components/MediaCategorizer
Projekt-Typ: Microsoft Visual Studio
Programmiersprache: C# 5.0
Plattform, Bibliotheken: .NET 4.5, WPF, Xceed WPF-Toolkit, Windows API CodePack

Merkmale

Architektur

Der Quellcode der Benutzeroberfläche teilt sich in die folgenden Namensräume auf (siehe Abbildung 2).

Abbildung 2: Namesräume der Benutzeroberfläche
Abbildung 2: Namesräume der Benutzeroberfläche

de.fhb.oll.mediacategorizer

Dieser Namensraum enthält die App-Klasse welche den Programmstart initiiert, das Hauptfenster MainWindow und die verschiedenen Seiten Page* (siehe Abbildung 3).

Abbildung 3: Die Klassen des Hauptfensters und der Seiten
Abbildung 3: Die Klassen des Hauptfensters und der Seiten

de.fhb.oll.mediacategorizer.edn

Dieser Namensraum enthält die Schnittstelle IEdnWritable und einige Hilfsklassen für das Erzeugen von EDN-Dateien.

de.fhb.oll.mediacategorizer.model

Dieser Namensraum enthält die Domain-Modell-Klassen Project, Category, Media, Configuration und alle Klassen die für deren Definition benötigt werden (siehe Abbildung 4 und Abbildung 5).

Abbildung 4: Das Domain-Modell für ein Projekt
Abbildung 4: Das Domain-Modell für ein Projekt

Abbildung 5: Das Domain-Modell für die Projektparameter
Abbildung 5: Das Domain-Modell für die Projektparameter

Die Klassen in diesem Namensraum wird in der Datei Model.xml definiert und durch den Codegenerator Scaleton in der Datei Model.Designer.cs implementiert. Einige der generierten Klassen werden in eigenen Dateien um zusätzliche Funktionalität ergänzt. Die Schnittstelle IEdnWritable wird für alle Modell-Klassen in der Datei <abbr title="Extensible Data Notation">EDN</abbr>.cs implementiert.

de.fhb.oll.mediacategorizer.processing

Dieser Namensraum enthält die Klassen für die verschiedenen Prozessschritte. Jeder Prozessschritt wird durch eine Klasse realisiert, welche die Schnittstelle IProcess implementiert (siehe Abbildung 6). Zur Vereinfachung der Implementierung wurden gemeinsame Aspekte der Prozessschritte in den Basisklassen ProcessBase und MultiTaskProcessBase zusammengefasst (siehe Abbildung 7).

Abbildung 6: Die Schnittstelle für Prozessschritte
Abbildung 6: Die Schnittstelle für Prozessschritte

Abbildung 7: Die Basisklassen der Prozessschritte
Abbildung 7: Die Basisklassen der Prozessschritte

Die Klasse ProcessChain verwaltet den gesamten Prozess und übernimmt das Starten der Prozessschritte, wenn deren Vorgänger im Prozess erfolgreich abgeschlossen wurden (siehe Abbildung 8).

Abbildung 8: Die zentrale Steuerung für den Prozess
Abbildung 8: Die zentrale Steuerung für den Prozess

Wann welche Prozessschritte gestartet werden, hängt von deren Abhängigkeiten ab. Ein Prozessschritt wird genau dann gestartet, wenn alle Prozessschritte, von denen er abhängig ist, erfolgreich ausgeführt wurden. Prozessschritte ohne Abhängigkeiten werden mit dem Start des Gesamtprozesses gestartet. In Abbildung 9 sind die Abhängigkeiten zwischen den Prozessschritten visualisiert.

Abbildung 9: Die Abhängigkeiten zwischen den Prozessschritten
Abbildung 9: Die Abhängigkeiten zwischen den Prozessschritten

de.fhb.oll.mediacategorizer.tools

Dieser Namensraum enthält die Steuerklassen für die Komponenten, die über eine Befehlszeilenschnittstelle angesteuert werden. Die Steuerklassen sind von der gemeinsamen Basisklasse ToolBase abgeleitet (siehe Abbildung 10).

Die Steuerklassen sind für das asynchrone Verarbeiten der Komponentenausgaben verantwortlich. Die Ausgaben enthalten dabei sowohl Fortschrittsinformationen als auch Ergebnisdaten.

Abbildung 10: Die Basisklasse der Steuerklassen für Komponenten
Abbildung 10: Die Basisklasse der Steuerklassen für Komponenten

Abbildung 11: Die Steuerklasse für FFprobe
Abbildung 11: Die Steuerklasse für FFprobe

Abbildung 12: Die Steuerklasse für FFmpeg
Abbildung 12: Die Steuerklasse für FFmpeg

Abbildung 13: Die Steuerklasse für WaveViz
Abbildung 13: Die Steuerklasse für WaveViz

Abbildung 14: Die Steuerklasse für Transcripter
Abbildung 14: Die Steuerklasse für Transcripter

Abbildung 15: Die Steuerklasse für Distillery
Abbildung 15: Die Steuerklasse für Distillery

de.fhb.oll.mediacategorizer.settings

Dieser Namensraum enthält die Klassen Setup und SetupManager, die für die Verwaltung und das Sichern und Wiederherstellen der Anwendungseinstellungen verantwortlich sind (siehe Abbildung 16).

Abbildung 16: Das Modell für die Programmeinstellungen
Abbildung 16: Das Modell für die Programmeinstellungen

Medieninspektion und Tonspurextraktion (extern)

Projektname: FFmpeg
Website: http://www.ffmpeg.org

Merkmale

Befehlszeilenschnittstelle

Das FFmpeg-Projekt umfasst die Programmdatei ffmpeg.exe für Transformationsaufgaben und die Programmdatei ffprobe.exe für Inspektionsaufgaben.

Inspektion

Beispiel: > ffprobe.exe -i "D:\media\video.mp4"

Die Ausgabe könnte dann z.B. wie folgt aussehen.

ffprobe version N-58699-ge3d7a39 Copyright (c) 2007-2013 the FFmpeg developers
  built on Dec  1 2013 22:07:24 with gcc 4.8.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 56.100 / 52. 56.100
  libavcodec     55. 44.100 / 55. 44.100
  libavformat    55. 22.100 / 55. 22.100
  libavdevice    55.  5.102 / 55.  5.102
  libavfilter     3. 91.100 /  3. 91.100
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'D:\media\video.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2012-05-15 16:52:11
  Duration: 01:05:51.97, start: 0.000000, bitrate: 363 kb/s
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 480x360, 265 kb/s, 18 fps, 18 tbr, 36 tbn, 36 tbc (default)
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 95 kb/s (default)
    Metadata:
      creation_time   : 2012-05-15 16:52:11
      handler_name    : IsoMedia File Produced by Google, 5-11-2011

MediaCategorizer nutzt ffprobe um die Länge der Mediums zu ermitteln, um daraus einen Fortschritt bei Transformation und Spracherkennung zu berechnen. Die Länge des Mediums wird dabei mit dem folgenden regulären Ausdruck ermittelt: Duration: (\d+):(\d\d):(\d\d)\.(\d+). Die vier Gruppen entsprechen dabei Stunden, Minuten, Sekunden, Millisekunden.

Transformation

Beispiel: > ffmpeg.exe -i "D:\media\video.mp4" -n -vn -ac 1 -ar 16000 -acodec pcm_s16le "D:\media\sound.wav"

Bedeutung der Argumente:

Wellenformvisualisierung (extern)

Projektname: WaveViz
Repository: https://github.com/mastersign/waveviz

Merkmale

Abbildung 17: Eine mit WaveViz erzeugte Visualisierung einer Wave-Datei
Abbildung 17: Eine mit WaveViz erzeugte Visualisierung einer Wave-Datei

Befehlszeilenschnittstelle

Programmdatei: WaveViz.exe

Syntax: waveviz <WAV-Datei> <PNG-Datei> [w h] [bg f1 f2 li]
  w  = Bildbreite in Pixeln
  h  = Bildhöhe in Pixeln
  bg = Hintergrundfarbe
  f1 = Vordergrundfarbe 1
  f2 = Vordergrundfarbe 2
  li = Farbe der Horizontlinie
Farbwerte werden als RGBA-Hex-Werte angegeben. (z.B. #E080D0FF)

Beispiel: > WaveViz.exe "D:\media\sound.wav" "D:\media\wave.png" 1024 100 #00000000 #FF880080 #880000FF #FF0000FF

Spracherkennung

Projektname: MediaCategorizer - Transcripter
Repository: https://github.com/mastersign/mediacategorizer-transcripter/
Verzeichnis: /components/Transcripter
Projekt-Typ: Microsoft Visual Studio
Programmiersprache: C# 5.0
Plattform, Bibiotheken: .NET 4.5, Microsoft Speech API

Merkmale

Architektur

Das Befehlszeilenprogramm Transcripter ist nahezu vollständig prozedural in der statischen Klasse de.fhb.oll.transcripter.Program implementiert. Lediglich das Parsen der Befehlszeilenargumente wird von einer Instanz der Klasse CommandLineArguments übernommen.

Das Programm besitzt zwei Betriebsmodi. Im Standardmodus wird die gesamte Quelldatei vom Spracherkennungssystem verarbeitet und die Erkennungsergebnisse werden im EDN-Format in die Ergebnisdatei geschrieben. Die Ergebnisdatei sollte die Endung .srr für Speech Recognition Result besitzen. Im Testmodus für Erkennungssicherheit wird nur der Anfang einer Datei vom Spracherkennungssystem verarbeitet und statistische Werte zu den erkannten Phrasen und Wörtern ausgegeben.

Befehlszeilenschnittstelle

Programmdatei: Transcripter.exe

Syntax: transcripter [Optionen] <WAV-Datei>
  Optionen
    -ct, --confidence-test: Schaltet in den Testmodus für Erkennungssicherheit
    -td, --test-duration: Die maximale Testlänge ab dem Dateianfang in Sekunden
    -db, --dashboard: Aktiviert im Standardmodus eine Übersichtsdarstellung
    -p, --progress: Aktiviert die Ausgabe des Fortschritts
    -t, --target <SRR-Datei>: Gibt im Standardmodus die Ergebnisdatei an

Beispiel Test: > Transcripter.exe -ct -td 60 "D:\media\sound.wav"

Beispiel Spracherkennung: > Transcripter.exe -p -t "D:\media\result.srr" "D:\media\sound.wav"

Testergebnisse

Im Testmodus für Erkennungssicherheit werden die folgenden Werte ausgegeben.

Analyse und Visualisierung

Projektname: MediaCategorizer - Distillery
Repository: https://github.com/mastersign/mediacategorizer-distillery/
Verzeichnis: /components/Distillery
Projekt-Typ: Leiningen
Programmiersprache: Clojure 1.5
Plattform, Bibiotheken: Java 7 Runtime, clojure, data.xml, enlive

Merkmale

Architektur

Distillery ist nach dem funktionalen Programmierparadigma entwickelt und besteht aus einer Anzahl von Namensräumen und Funktionen in diesen Namensräumen. Es wurden keine expliziten Datentypen definiert, sondern ausschließlich die nativen Datentypen von Clojure verwendet (siehe Intermediate Data Structures).

In Abbildung 18 werden die Namensräume und ihre Abhängigkeiten dargestellt. Der Einstiegspunkt für die Anwendung ist der Namensraum distillery.core. Die logischen Schritte der Verarbeitung und die Ausgabe der Fortschrittsmeldungen sind in distillery.tasks implementiert. Die Funktionen für die Analyse der Spracherkennungsergebnisse befinden sich im Namensraum distillery.processing. Die Namensräume distillery.txtresult und distillery.xmlresult enthalten Funktionen zur Ausgabe der Spracherkennungs- und Analyseergebnisse in Reintext und XML-Format. Die Namensräume in distillery.view enthalten die verschiedenen Teile für die Erzeugung der HTML5-Webseite.

Ergänzend gibt es die Namensräume distillery.data, distillery.text und distillery.config. Der Namesraum distillery.data enthält Funktionen für das Laden von externen Daten (z.B. Web-Seiten oder Textdateien) und einige allgemeine Hilfsfunktionen als Ergänzung zur clojure.core-Bibliothek. Der Namensraum distillery.text ist eine Abstraktionsschicht für Zeichenfolgenkonstanten, welche aus der Datei Distillery/resources/text.edn geladen werden. Diese Zwischenschicht bietet die Grundlage für die Wiederverwendung von Zeichenfolgen und stellt eine Vorbereitung für die Unterstützung von mehreren Ausgabesprachen dar. Der Namensraum distillery.config bietet eine Funktion für das Laden von Konfigurationsparametern an. Dabei werden Standardwerte aus der Datei Distillery/resources/default-config.edn geladen und mit den benutzerdefinierten Konfigurationsparameters aus der Job-Datei überlagert.

Abbildung 18: Die Architektur von Distillery
Abbildung 18: Die Architektur von Distillery

API

Für eine ausführliche Beschreibung der Namensräume und Funktionen von Distillery steht die automatisch generierte API-Dokumentation im Verzeichnis Distillery/doc/api.html zur Verfügung.

Befehlszeile

Programmdatei: distillery.jar

Die Einstiegsfunktion von Distillery erwartet nur den Pfad zur Job-Datei als einziges Argument.

Beispiel: > java -jar "D:\MediaCategorizer\tools\distillery.jar" "D:\work\job.saj"

Wortwolken

Projektname: Mastersign Cloud
Repository: https://github.com/mastersign/mediacategorizer-distillery/
Verzeichnis: /components/Distillery/src/mastersign
Projekt-Typ: Clojure-Bibliothek
Programmiersprache: Clojure 1.5
Plattform, Bibliotheken: Java 7 Runtime, clojure

Merkmale

API

Die Funktionen des Wortwolkengenerators befinden sich in dem Namensraum mastersign.wordcloud. Um eine Wortwolke zu erzeugen, sind die folgenden Schritte notwendig.

  1. Sortieren der Wortliste, Zuweisen von Schriftart, Schriftgröße und Schriftfarbe, und Berechnen des Platzbedarfs der einzelnen Worte
  2. Berechnen der Position und Drehung aller Wörter die auf die Bildfläche passen
  3. Zeichnen der Wörter an den berechneten Position im entsprechenden Stil

Um den ersten Schritt auszuführen, wird die Funktion mastersign.wordcloud/build-word-infos aufgerufen. Diese nimmt zwei Parameter entgegen: word-data und args. Das Argument word-data erwartet eine Sequenz von Vektoren/Tupeln mit folgendem Aufbau: [id text v1 v2] wobei id eine Zeichenkette zur eindeutigen Identifizierung des Wortes ist, text die darzustellende Zeichenfolge des Wortes, v1 die Wert für die Schriftgröße und v2 der Wert für die Schriftfarbe. Die Werte v1 und v2 sollten im Wertebereich [0..1] liegen. Ein Beispieldatensatz könnt z.B. wie folgt aussehen.

(def words [["b" "Bravo" 0.1 0.9]
            ["a" "Alpha" 0.4 0.8]
            ["c" "Charlie" 1.0 0.2]
            ...])

Das Argument args erwartet eine Map mit den folgenden Slots:

Ein Aufruf könnte z.B. wie folgt aussehen.

(def word-infos (build-word-infos words {:order-mode :value2}))

Wird anstelle der Standardsortierung von :value1 die Sortierung :value2 angegeben wird nicht nach Wortgröße sondern nach Farbe sortiert (siehe Abbildung 20).

Das Ergebnis des Aufrufs ist eine Sequenz mit Maps als Elementen. Jedes Element besitzt dabei die folgenden Slots:

Für den zweiten Schritt wird die Funktion mastersign.wordcloud/build-cloud-info aufgerufen. Sie akzeptiert ebenfalls zwei Argumente: word-infos und args. Das Argument word-infos erwartet die Sequenz von Wortbeschreibungen in Form von Maps wie sie von build-word-infos zurückgegeben wird. Das zweite Argument erwartet eine Map, die die folgenden Steuerparameter enthalten muss:

Ein Aufruf könnte z.B. wie folgt aussehen.

(def cloud-info (build-cloud-info word-infos {:width 400 :height 400 :precision 0.7}))

Das Ergebnis des Aufrufs ist eine Map mit den folgenden Slots:

Der dritte Schritt ist das Zeichnen der Wortwolke. Dazu wird die Funktion mastersign.wordcloud/paint-cloud aufgerufen. Sie akzeptiert als erstes Argument eine Map mit der Beschreibung der Wortwolke, wie sie von mastersign.wordcloud/build-cloud-info zurückgegeben wird. Als zweites Argument akzeptiert sie eine Map mit Steuerparametern, welche die Slots :width und :height enthalten muss. Die Funktion gibt ein java.awt.image.BufferedImage zurück.

Der Aufruf könnte z.B. wie folgt aussehen.

(def img (paint-cloud cloud-info {:width 400 :height 400}))

Als Zusammenfassung der drei Schritte und Vereinfachung des Aufrufs kann die Funktion mastersign.wordcloud/create-cloud verwendet werden. Sie erwartet als erstes Argument eine Sequenz mit Wörtern in der Form wie sie mastersign.wordcloud/build-word-info erwartet. Als zusätzliche Argumente können alle Steuerparameter aus den oben genannten Maps mit dem Argumentnamen args verwendet werden.

Ein Aufruf könnte z.B. wie folgt aussehen.

(def img (create-cloud words :width 400 :height 400 :precision 0.7 :order-mode :value2))

Die folgenden Abbildungen zeigen mögliche Ergebnisse.

Abbildung 19: Eine nach der Wortgröße sortierte Wortwolke
Abbildung 19: Eine nach der Wortgröße sortierte Wortwolke

Abbildung 20: Eine nach der Wortfarbe sortierte Wortwolke
Abbildung 20: Eine nach der Wortfarbe sortierte Wortwolke

Abbildung 21: Eine alphabetisch sortierte Wortwolke
Abbildung 21: Eine alphabetisch sortierte Wortwolke