×
Menü
Index

Den CorpusExplorer in eigene Programme integrieren - mittels SDK (Software Development Kit)

Den CorpusExplorer in eigene Programme integrieren - mittels SDK (Software Development Kit)
Das Software Development Kit (kurz SDK) des CorpusExplorers erlaubt die Integration in eigene Programme und das erweitern des CorpusExplorers durch andere Programme.
Dieses Beispiel zeigt, wie Sie den CorpusExplorer aus einem einfachen Konsolen-Programm heraus nutzen können.
Voraussetzung ist hierbei, dass Sie die DLL-Dateien CorpusExplorer.Sdk.dll in ihr Projekt einbinden. Die Datei finden Sie nach der Installation unter %APPDATA%\CorpusExplorer\App.
Die DLL kann in .NET-Anwendungen (C#, C++, VB.NET, Python, etc.) direkt eingebunden werden - für andere Programmiersprachen wie z. B. Java können Bridges genutzt werden (siehe z. B. http://jni4net.com/).
 
Im folgenden wird zunächst der Quellcode besprochen - am Ende dieser Seite finden Sie den Quellcode (für Copy&Paste-Nutzung).
1

Zuerst: Initialisieren (!!!)

1. Zuerst: Initialisieren (!!!)
Bei jedem Programmstart sollte als erster das CorpusExplorerEcosystem gestartet werden. Hinter diesem Aufruf verbirgt sich eine Menge an Konfigurationen - u. a. Laden von Erweiterungen oder Überprüfungen, ob alle Software richtig konfiguriert wurde. Vergessen Sie diesen Aufruf, dann kann es zu unerwarteten Fehlern im Programmverlauf kommen.
Daher bitte immer als erstes eine der beiden statischen Methoden von CorpusExplorerEcosystem aufrufen. Zur Auswahl stehen:
 
  • CorpusExplorerEcosystem.InitializeMinimal - Dabei werden keine Erweiterungen geladen. Das Laden von Erweiterungen muss dann mittels Quellcode erfolgen. Der Rückgabewert dieser Funktion ist ein Objekt vom Typ Project. Project stellt grundlegende Funktionen bereit zum Laden/Verwalten von Korpora und Schnappschüssen.
  • CorpusExplorerEcosystem.Initialize - Dabei werden alle verfügbaren Erweiterungen geladen. Der Aufruf dauert daher wesentlich länger - ca. 5-10 Sekunden. Erweiterungen stehen dann in der statischen Klasse Configuration (namespace CorpusExplorer.Sdk.Ecosystem.Model) - zur Verfügung. z. B.: Configuration.AddonTaggers. Der Rückgabewert dieser Funktion ist ein Objekt vom Typ Terminal. Dieses Objekt ist ein Container für exakt ein Objekt vom Typ Project (siehe oben - CorpusExplorerEcosystem.InitializeMinimal). Das Terminal-Objekt erlaubt Laden/Speichern/Verwalten von Project.
 
Beide Methoden erlauben einen optionalen Parameter, der die Cache-Eigenschaften des CorpusExplorers steuert. zulässig sind folgende Klassen aus dem namespace CorpusExplorer.Sdk.Model.Cache:
  • CacheStrategyClearCacheManually - Alles wird zwischengespeichert, bis der Aufruf Configuration.Cache.Clear(); erfolgt.
  •  CacheStrategyCurrentSelection - Nur die Daten der aktuellen Selection (Schnappschuss) werden gespeichert. Wird der Schnappschuss (Selection) gewechselt, wird der Cache automatisch gelöscht. Dies ist die Standardeinstellung für CorpusExplorerEcosystem.Initialize und wird für GUI-Anwendungen empfohlen.
  •  CacheStrategyDisableCaching - Der Cache wird komplett deaktiviert. Alle Daten werden ständig neu berechnet. Dies ist die Standardeinstellung für CorpusExplorerEcosystem.InitializeMinimal und wird für Konsolen-Programme empfohlen.
2

Ein Korpus dem Projekt hinzufügen

2. Ein Korpus dem Projekt hinzufügen
Der CorpusExplorer stellt bereits verschiedene CorpusAdapter bereit - damit lassen sich Korpora laden (siehe auch Datenkonzept unter 7).
CorpusAdapterWriteDirect.Create lädt ein Korpus im CEC6-Format.
Dieses wird dann direkt mit project.Add dem aktuellen Projekt hinzugefügt.
3

Einfache Ausgabe - zähle Token

3. Einfache Ausgabe - zähle Token
Wie in der GUI des CorpusExplorers, so wird nach dem Laden eines Korpus automatisch ein Schnappschuss erstellt, der alle Korpora & Dokumente umfasst.
Auf diesen Schnappschuss können Sie mittels project.SelectAll zugreifen.
Schnappschüsse (Selection) stellen wie Projekte (Project) und Korpora entsprechende Grundfunktionalitäten bereit.
CountToken - Zähle Token / CountDocuments / CountSentences - usw.
Diese Zeile gibt die aktuelle Anzahl der Token im Schnappschuss aus.
4

Filtern - Selection der Selection

4. Filtern - Selection der Selection
Ausgehend von SelectAll wird hier eine neue Selection erstellt.
Create nimmt hierbei zwei Parameter an:
  • AbstractFilterQuery[] - Ein Array vom Typ AbstractFilterQuery. In diesem Fall nur ein einfache FilterQuerySingleLayerAnyMatch - siehe 5
  • String - Dies ist der Name des neuen Schnappschusses (würde in der GUI angezeigt).
 
Optional:
Der Aufruf Create erzeugt einen neuen Schnappschuss und fügt diesen sogleich dem jeweiligen Parent (in dem Fall SelectAll) an. Außerdem wird beim erzeugt mit Create der aktuell gewählte Schnappschuss neu gesetzt - zugreifbar im Beispiel mit project.CurrentSelection
Dies ist nicht immer gewollt und sinnvoll, insbesondere wenn wie unter 1 beschrieben ein Cache eingesetzt wird. Alternativ kann statt Create auch CreateTemporary eingesetzt werden. Dies erzeugt einen neuen Schnappschuss (Selection), aber ohne CurrentSelection zu ändern, ohne Cache-Änderung und ohne den Schnappschuss an den Parent anzuhängen. Ideal für schnelle Hintergrundberechnungen.
5

Der Filter

5. Der Filter
Der Filter bedeutet: Suche auf einem bestimmten Layer - und nehme jedes Dokument, in dem mindestens ein Match vorkommt. Gesucht wird hier auf (LayerDisplayname) dem Layer "Wort" - Die LayerQueries sind die Suchworte. Inverse kann den Filterausdruck umkehren. Verfügbar FilterQuery finden Sie im namespace (CorpusExplorer.Sdk.dll): CorpusExplorer.Sdk.Utils.Filter.Queries
6

Zähle SubSelections

6. Zähle SubSelections
Durch project.SelectAll.Create wurde eine Selection erzeugt, die angefügt wurde - die Zeile gibt die aktuelle Anzahl der Subselections aus = 1
7

Blöcke - Das Model oder Rückgrat  jeder Analyse

7. Blöcke - Das Model oder Rückgrat  jeder Analyse
Blöcke werden im CorpusExplorer durch einen Aufruf der generischen Methode CreateBlock<T> erzeugt, die jeder Schnappschuss/Selection bereitstellt. Der Grund warum dies so geschieht und nicht durch einen Aufruf durch "new" ist: Das Caching im CorpusExplorer. Eine Selection kann Blöcke cachen - siehe 1 - dadurch kann viel Zeit eingespart werden. Außerdem wird der Block bei diesem Aufruf bereits vorkonfiguriert.
 
Um eigene Analyseblöcke zu implementieren leiten Sie diese von:
  • AbstractBlock - Basisklasse - hier müssen Sie alles selbst implementieren.
  • AbstractSimple1LayerBlock - Vereinfacht AbstractBlock - Ideal, wenn der Block nur auf einem Layer arbeiten soll.
  • AbstractSimple2LayerBlock - Vereinfacht AbstractBlock - Ideal, wenn der Block nur auf zwei Layern arbeiten soll.
  • AbstractSimple3LayerBlock - Vereinfacht AbstractBlock - Ideal, wenn der Block nur auf drei Layern arbeiten soll.
  • AbstractDocumentMetadataBlock - Vereinfacht AbstractBlock - Ideal, wenn der Block nur Metadaten analysieren soll.
  • AbstractClusterMetadataBlock - Verinfach AbstractBlock - Ideal, wenn der Block mehrere Selections/Schnappschüsse auf Basis von Metadaten erzeugen soll - Grundlage für AutoSplit-Funktionalität.
  • AbstractCompareSelectionBlock - Erlaubt eine vergleichende Analyse zwischen zwei Schnappschüssen.
8

Einen Block konfigurieren

8. Einen Block konfigurieren
Die meisten Blöcke müssen vor der Ausführung konfigurirert werden. In diesem Fall wird der Analyselayer auf POS gesetzt. Blöc
9

.Calculate() - los geht's!

9. .Calculate() - los geht's!
Nachdem ein Block erzeugt und konfiguriert wurde, muss er noch aktiviert werden. Calculate stößt die Berechnung an.
10

Nach der Berechnung

10. Nach der Berechnung
Nach Calculate() ist die Eigenschaft .Frequency im block mit Daten befüllt. Vorher = null
Der Code gibt die Anzahl (freq.Count) der Einträge aus.
11

ViewModel - Der elegantere Weg

11. ViewModel - Der elegantere Weg
Der CorpusExplorer wurde unter dem Model-View-ViewModel-Patern entwickelt.
  • Das Model umfasst dabei: Backend (Korpus + Layer), Project, Selection/Schnappschuss und Blöcke
  • Das ViewModel kapselt alle Funktionen und Daten - d. h. ein ViewModel ummantelt die Daten aus den Blöcken und bereitet diese auf, so dass man mit einfacher Datenbindung aus der View darauf zugreifen kann. Ein ViewModel kann mehrere Blöcke oder auch andere ViewModels ummanteln.
  • Die View - Dabei handelt es sich um die konkrete Darstellung - also de GUI
12

Auch ViewModels müssen konfiguriert werden

12. Auch ViewModels müssen konfiguriert werden
Wie Blöcke, so müssen auch ViewModels konfiguriert werden. Siehe hier 8.
13

ViewModel ausführen mit .Execute()

13. ViewModel ausführen mit .Execute()
Auch das ViewModel muss ausgeführt werden. Dabei ist die Execute()-Funktion einen ViewModels komplexer als die eines Block.Calculate(). So wird z. B. zuvor geprüft, ob alle Parameter gesetzt sind. Execute ist zudem speziell gegen Exceptions abgesichert.
14

ViewModel - Das Resultat

14. ViewModel - Das Resultat
Wie in 11 beschrieben, bietet ein ViewModel den Komfort, die Daten direkt binden zu können. GetDataTable() gibt z. B. eine DataTable zurück, welche direkt an die GUI gebunden oder mittels AbstractTableWriter (siehe Datenkonzept - unter 9) exportiert werden kann.
 
Quellcode für Copy&Paste:
 
using System;
using System.Linq;
using CorpusExplorer.Sdk.Blocks;
using CorpusExplorer.Sdk.Ecosystem;
using CorpusExplorer.Sdk.Model.Adapter.Corpus;
using CorpusExplorer.Sdk.Utils.Filter.Abstract;
using CorpusExplorer.Sdk.Utils.Filter.Queries;
using CorpusExplorer.Sdk.ViewModel;
 
namespace TestConsole
{
  public class Program
  {
    [STAThread]
    private static void Main(params string[] args)
    {
      var project = CorpusExplorerEcosystem.InitializeMinimal();
      project.Add(CorpusAdapterWriteDirect.Create("C:/Korpus/test.cec6"));
      Console.WriteLine(project.SelectAll.CountToken);
 
      var subSelection = project.SelectAll.Create(new AbstractFilterQuery[]
                                                  {
                                                    new FilterQuerySingleLayerAnyMatch
                                                    {
                                                      Inverse = false,
                                                      LayerDisplayname = "Wort",
                                                      LayerQueries = new[] {"das", "Beispiel", "für", "Entwickler*innen"}
                                                    }
                                                  },
                                                  "Name der subSelection");
      Console.WriteLine(project.SelectAll.SubSelections.Count());
 
      var block = subSelection.CreateBlock<Frequency1LayerBlock>();
      block.LayerDisplayname = "POS";
      block.Calculate();
      var freq = block.Frequency;
      Console.WriteLine(freq.Count);
 
      var vm = new Frequency1LayerViewModel { Selection = subSelection };
      vm.LayerDisplayname = "POS";
      vm.Execute();
      var tab = vm.GetDataTable();
    }
  }
}