Zum Inhalt

Textsuche

Das Modul textsearch ist ein Interface zum Durchsuchen einer Datenbank von Texten. Die hier vorliegende Implementierung sucht naiv nach den angegebenen Textfragmenten und gibt deren absolute Häufigkeit zurück. Diese Häufigkeiten können in der Visualisierung dargestellt werden.

Zuerst wird ein Zugang zu der Schnittstelle benötigt, Angehörige des DSS-Lehrstuhls dazu bitte Olaf Kellermeier anfragen. Darüber hinaus ist die sogenannte Snapshot-ID (oder mehrere) anzufragen. Sobald ihr über ein Zugangstoken und Snapshot-ID verfügt, könnt ihr loslegen.

Hinweis

Für Fortgeschrittene: Die jeweilige Snapshot-ID kann auch direkt am API-Endpunkt angefragt werden. Dazu bitte die Dokumentation des WDC-Endpoints selbstständig konsultieren: https://dss-wdc.wiso.uni-hamburg.de/

Suche nach Begriffshäufigkeiten

Importiert euer Token wie in der Einleitung zu den Schnittstellen beschrieben.

Nun erzeugen wir eine Instanz der Textsearch-Klasse:

import dsstools as dts
ts = dts.TextSearch("20210424_cliccs", token=wdc_token)

Die Bezeichnung des Netzwerkes lässt sich wie folgt herausfinden:

ts = dts.TextSearch(None, token=wdc_token)
snapshots = ts.get_snapshots(name_tag="cliccs")

Unter der Variable snapshots findest du dann alle Snapshots, die dir unter der Bezeichnung zur Verfügung stehen. Falls man name_tag nicht angibt, werden alle verfügbaren Snapshots angezeigt. Entsprechend kann dann None durch den Snapshot-Namen ersetzt werden.

Nachdem wir zu suchende Begriffe definiert haben, senden wir eine Anfrage:

terms = [
    '"divestment"',
    '"sustainable investment"',
]
# Path `graph` needs to be generated beforehand
graph, er = ts.search(graph, terms=terms)

Achtung

In diesem Fall steht '"sustainable investment"' in doppelten Anführungszeichen, da es ein Leerzeichen enthält. Würden wir das nicht tun, würde die Textsuche nach beiden Wörtern ("sustainable" und "investment") durchgeführt werden. Wir wollen dagegen die Kombination "sustainable investment" erhalten. Das lässt sich durch die doppelten Anführungszeichen erledigen.

Zurückgegeben wird jeweils der Graph selbst als auch etwaige leere Antworten. Das passiert, wenn der Crawler aus technischen Problemen keine Textinhalte herunterladen konnte oder aber die Webseite insgesamt nicht mehr existiert.

Ab jetzt sind in dem Graphenobjekt unter den Attributen die absoluten Werte für die Texte hinterlegt.

Anmerkung

Alternativ ist es auch möglich, eine Liste von Domains in der Suche zu übergeben, falls man noch kein Graphen-Objekt vorliegen hat, sondern nur einige Domains prüfen möchte.

Komplexe Suchbegriffe und ihre Kombinationen

ts.search(graph, terms=terms) akzeptiert eine Vielzahl an Typen für terms:

  • Liste mit Strings: ["sustainable", "investment"]. Jeder Wert in der Liste wird als separater Wert ausgegeben. Der Schlüssel ist dabei auch zugleich der Suchbegriff.
  • Liste von Listen mit Strings: [["sustainable", "investment"], ["divestment"]]. Jede dieser inneren Listen wird zu einem Wert kumuliert. Das bedeutet, dass die Häufigkeit beider Suchbegriffe "sustainable" und "investment" zusammengezählt werden und unter dem Schlüssel sustainable ausgeben (erster Wert wird als Schlüssel verwendet).
  • Dictionary mit Strings: {"nachhaltig": "sustainable"}. Dies wird die Häufigkeit des Suchbegriffes "sustainable" unter dem Schlüssel nachhaltig ausgeben. Hiermit sind auch komplexere Queries möglich: {"nachhaltig": "sustainable OR nachhaltig OR 'nachhaltiges wirtschaften'"} gibt den Wert für den Suchbegriff sustainable OR nachhaltig OR 'nachhaltiges wirtschaften' unter dem Schlüssel nachhaltig aus.
  • Dictionary mit Strings als Schlüssel und Listen als Werten: {"nachhaltig": ["sustainable", "nachhaltig"], "divestment": ["divestment"]}. Die Werte pro Schlüssel werden unter demselben kumuliert.
  • Panda Series: Funktioniert wie Dictionary mit Strings
  • Panda DataFrame: Jede Spalte ist dabei eine Sammlung von Suchbegriffen, die pro Spalte kumuliert werden. Der Schlüssel ist dabei der Spaltenname.

Ein Mischen der Typen ist nicht möglich. Dictionaries sind gegenüber Listen vorzuziehen, insbesondere falls Legenden erstellt werden sollen.

Zeichnen von Attributen

Die Integration schreibt die Daten zu dem Suchauftrag direkt in das Graph-Objekt unter einem spezifischen String. Um einen Begriff im Graphen für die Darstellung zu verwenden, kommt die Hilfsklasse dts.Code zur Anwendung:

divt = str(dts.Code("divestment", dts.Category.TEXT))

Hier passieren mehrere Dinge gleichzeitig:

  • dts.Category.TEXT weist den Typ (sprich den Ursprung des Attributes) zu. dts.Category.TEXT signalisiert den Textkorpus als Ursprung, dts.Category.MANUAL dagegen manuell kodierte Attribute aus dssCode.
  • dts.Code("divestment", dts.Category.TEXT) erstellt ein Objekt, welches das Attribut "divestment" im Textkorpus sucht.
  • Das Objekt wird direkt in einen str umgewandelt. Dieser lautet für das Beispiel "text:divestment"

Hinweis

Wer möchte, kann den obigen String natürlich auch manuell erstellen.

divt kann jetzt als Argument bspw. an nodes.set_sizes() übergeben werden:

ig.nodes.set_sizes(sequential(divt, out_range=(5,500)))

Gleiches funktioniert auch für Farben:

ig.nodes.set_colors(sequential(divt, cmap="viridis"))