Barcamp Search 2012

Am 09. und 10. Oktober 2012 findet in Berlin das zweite Barcamp Search statt.

Mit dabei sind Speaker aus den Bereichen Suchmaschinen-Technologie, Suchmaschinen-Marketing und semantischer Content-Analyse. Alle Namen & Details gibt es hier.

Ich werde einen kleinen Vortrag/Workshop zum Thema Web Scraping mit Scrapy im Zusammenspiel ElasticSearch, PhantomJS und FacetView halten, der im Nachgang auf diesem Blog veröffentlicht wird und sich nahtlos in die bereits vorhandenen Postings hier, hier & zuletzt hier einreihen wird.

Da ich fast alle Speaker auch persönlich kenne und schätze, freue ich mich auf eine hochkarätige Veranstaltung und bedanke mich für die Einladung.

Web Scraping mit dem Scrapy Framework

Wie in meinem Posting über das Web Crawling Framework “Scrapy” schon angekündigt, gibt es jetzt die hands-on Einführung anhand eines konkreten Beispiels. Da es sich um vergleichsweise langes und eher technisches Posting handelt, steigen wir direkt mit der ersten und ganz grundsätzlichen Frage ein: Was genau wollen wir erreichen?

Annahme: Die Redaktion eines Nachrichtenportals benötigt für einen Artikel über die Haushaltsschulden der deutschen Bundesländer eine HTML-Tabelle mit einer Liste aller Bundesländer und deren Schuldenstände.

Dieser Fall ist natürlich relativ trivial und wir könnten die Tabelle schnell manuell erstellen. Der Nachteil daran ist, dass die Daten innerhalb weniger Monate veralten würden und darüber hinaus manuell gepflegt werden müssten. Ein weiterer Nachteil ist, dass manuelles Abtippen nicht halb so viel Vergnügen bereitet wie die Erstellung einer automatischen Lösung, die jeder Zeit wieder verwendet und bei Bedarf weiter ausgebaut werden kann.

Als Datenquelle nutzen wir die Wikipedia. Es gibt natürlich Alternativen wie z. B. die Webseite des statistischen Bundesamtes, die sich in diesem Fall anbieten würden. Da die Wikipedia aber einen ganzen Haufen anderer Anwendungsfälle abdeckt, halte ich mich für dieses Beispiel an der wahrscheinlich am meisten gescrapten Webseite der Welt.

Weil wir möglichst effizient crawlen möchten und auf unserem Weg durch das HTML-Dickicht nicht unnötig viele Wikipedia-Seiten verarbeiten wollen, brauchen wir zunächst eine Übersicht über alle 16 Bundesländer mit Hyperlinks auf ihre jeweiligen Wikipedia-Seiten.

Dafür eignet sich am besten die Seite http://de.wikipedia.org/wiki/Bundesrepublik_Deutschland#Liste_der_L.C3.A4nder, die eine Liste aller Bundesländer enthält.

Um die Hyperlinks auf die dort aufgeführten Bundesländer sauber zu extrahieren, basteln wir uns einen XPath-Ausdruck zusammen. Ich mache das gerne mit dem Firefox Addon Firebug und der Firebug-Extension FirePath, da man so mit visuellem Feedback seine XPath-Ausdrücke zusammenbauen kann.

Continue reading

Modellierung sozialer Netze mit RDF und FOAF

Wer das Web und seine Entwicklung beobachtet, der hat vielleicht schon vom Semantic Web bzw. vom “Web 3.0″ oder dem “Web der Dinge” gehört. Die Informationen im Web 3.0 sollen nicht nur vom Menschen, sondern auch von Computern interpretiert und verstanden werden. Informationen über Orte, Personen und andere materielle und nicht-materielle Dinge können infolgedessen automatisch miteinander in Beziehung gesetzt werden.

Für dieses Posting konzentriere ich mich auf einen Anwendungsfall, den jeder kennt. Als Internet-Nutzer bewegt man sich in der Regel in mindestens einem sozialen Netzwerk. Zu diesen Netzwerken gehören Foren, Communities, Blogs, Messaging-Dienste, und vieles mehr. Als aktiver Nutzer hat man über den Zeitraum der Nutzung hinweg ein mehr oder weniger großes Netzwerk an Freunden und Bekannten aufgespannt und gepflegt. Was  aber mache ich, wenn ich mich in einem weiteren sozialen Netzwerk anmelde, in dem ich bis dato noch völlig unbekannt bin?

In der Regel muss ich dort meine persönlichen Daten erneut eingeben und viele meiner Bekannten, die dieses Netzwerk bereits nutzen, erneut zu meinen Kontakten hinzufügen. Fehler und Unstimmigkeiten bei der manuellen Eingabe sind dabei nicht immer vermeidbar. Außerdem gebe ich meine Kontaktinformationen aus der Hand und pflege sie nicht an einer zentralen und mir vertrauten Stelle. Das kann im Detail seine Vorteile haben, aber die essentiellen Daten wie etwa meinen Namen, meine E-Mail Adresse und vergleichbare Kontaktinformationen möchte ich vielleicht gerne an einem zentralen Ort im Web speichern und pflegen.

Das bedeutet allerdings nicht, dass ich auf einen Zugriffsschutz verzichten sollte, der eine saubere Authentifizierung erfordert und meine Kontaktdetails anschließend über einen verschlüsselten Kanal überträgt. Allerdings soll jeder Mensch und auch jede Maschine, der oder die von mir Zugriffsrechte auf diese Informationen erhält, zu jeder Zeit die Informationen abrufen können, für die er oder sie von mir autorisiert worden ist.

Das Ganze funktioniert am elegantesten im weltumspannenden Internet und dort unter einer von mir definierten URI. Außerdem müssen meine Kontaktdetails natürlich in einer standardisierten Form vorliegen, damit sichergestellt ist, dass sie auch mit den entsprechenden Werkzeugen gelesen und verstanden werden können. Ob dieses Werkzeug nun ein Mechanismus für die Accounterstellung in einem sozialen Netzwerk ist, oder es sich dabei um eine völlig andere Software handelt, ist dabei völlig egal. Wichtig ist nur, dass sie meine Daten sauber lesen und interpretieren (=verstehen) kann. Auch Instant Messenger und andere, klassische Applikationen könnten so problemlos Zugriff auf mein virtuelles ich und mein persönliches “Netz der Dinge” bekommen.

Eine Möglichkeit diese kleine Utopie in die Realität umzusetzen kann in Zukunft die Pflege einer RDF-Datei (Ressource Description Framework) mit meinem persönlichen Profil und meinen Freundschaftsbeziehungen zu anderen Personen werden. Der Inhalt dieser RDF-Datei besteht im Wesentlichen aus Daten über meine Person und meine Bekanntschaften nach dem FOAF (Friend of a Friend) Vokabular. Wer sich bisher nicht mit RDF auskennt, der liest sich am besten kurz diesen Abschnitt aus dem RDF-Artikel in der Wikipedia durch: Hier klicken. Die FOAF-Daten über meine Person und mein soziales Netzwerk werden dabei quasi in das RDF-Dokument “gemixt”, um einem neuen sozialen Netzwerk alles über mich und meine Bekanntschaften zu erzählen. Dafür müssen allerdings zwei Bedingungen erfüllt werden:

  1. Das bisher genutzte soziale Netzwerk muss eine FOAF-Datei von mir erzeugen und online bereitstellen können (niemand möchte so eine Datei manuell pflegen…)
  2. Das neue soziale Netzwerk muss diese Datei lesen und verstehen können, um dann meinen Account mit den darin vorhandenen Daten regelmäßig auf den aktuellen Stand bringen zu können.

Wie sieht nun so eine RDF-Datei mit FOAF-Elementen aus? In meinem Fall könnt ihr euch meine FOAF-Datei unter http://www.suchkultur.de/rdf/foaf.rdf anschauen. Diese URL (bzw. allgemeiner ein URI) ist auch gleichzeitig das Merkmal, mit dem die darin enthaltenen Daten eindeutig meiner Person zugeordnet werden können. Theoretisch kann es einen weiteren Stefan Antoni geben, der genau die selbe Datei erstellt und sie unter einer anderen URI verfügbar gemacht hat. Er wäre dann eine andere Person.

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
  xmlns:foaf="http://xmlns.com/foaf/0.1/">
  <foaf:PersonalProfileDocument rdf:about="">
    <foaf:maker rdf:resource="#me"/>
    <foaf:primaryTopic rdf:resource="#me"/>
  </foaf:PersonalProfileDocument>
  <foaf:Person rdf:ID="me">
    <foaf:name>Stefan Antoni</foaf:name>
    <foaf:givenname>Stefan</foaf:givenname>
    <foaf:family_name>Antoni</foaf:family_name>
    <foaf:mbox_sha1sum>7e5dbf850ca8661675bd80481b26b095d7337927</foaf:mbox_sha1sum>
    <foaf:weblog rdf:resource="http://www.suchkultur.de"/blog/>
    <foaf:workplaceHomepage rdf:resource="http://www.t-online.de"/>
  </foaf:Person>
</rdf:RDF>

Um einer schleichenden Verwirrung vorzubeugen, werde ich an dieser Stelle nicht die Definitionen von Namensräumen innerhalb von XML-Dokumenten erklären und den Fokus auf die wichtigsten Elemente legen. Bei Detailfragen oder Kritik helfe ich gerne per E-Mail oder (noch besser) in den Kommentaren weiter.

Wenn man das oben vorgestellte RDF in den RDF-Validator des W3C wirft, bekommt man übrigens eine gut lesbare, tabellarische Übersicht über die darin enthaltenen Informationen (genauer: Über die sogenannten RDF-Tripel).

Folgendes habe ich in meiner RDF-Datei angegeben:

  • Meinen Namen als “Stefan Antoni”
  • Meinen Vornamen “Stefan”
  • Meinen Familiennamen “Antoni”
  • Meine E-Mail Adresse als SHA-1 Hashwert (mit “mailto:” Prefix): “7e5dbf850ca8661675bd80481b26b095d7337927″
  • Meine Homepage “http://www.suchkultur.de”
  • Die Homepage meines Arbeitgebers “http://www.t-online.de”

Was fehlt? Meine Freunde! Freundschaftsbeziehungen habe ich in diesem Beispiel bisher noch nicht modelliert. Das wichtigste fehlt also noch. Eine Freundschaftsbeziehung zum allseits beliebten Herrn Mustermann kann beispielsweise so aussehen:

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
  xmlns:foaf="http://xmlns.com/foaf/0.1/">
  <foaf:PersonalProfileDocument rdf:about="">
    <foaf:maker rdf:resource="#me"/>
    <foaf:primaryTopic rdf:resource="#me"/>
  </foaf:PersonalProfileDocument>
  <foaf:Person rdf:ID="me">
    <foaf:name>Stefan Antoni</foaf:name>
    <foaf:givenname>Stefan</foaf:givenname>
    <foaf:family_name>Antoni</foaf:family_name>
    <foaf:mbox_sha1sum>7e5dbf850ca8661675bd80481b26b095d7337927</foaf:mbox_sha1sum>
    <foaf:weblog rdf:resource="http://www.suchkultur.de"/blog/>
    <foaf:workplaceHomepage rdf:resource="http://www.t-online.de"/>
    <foaf:knows>
      <foaf:Person>
        <foaf:name>Max Mustermann</foaf:name>
        <rdfs:seeAlso
          rdf:resource="http://beliebige-quelle.de/max_mustermann/foaf.rdf"/>
      </foaf:Person>
  </foaf:knows>
  </foaf:Person>
</rdf:RDF>

Neu ist hier prinzipiell nur das “knows” aus dem FOAF-Vokabular (ab Zeile 16). Die Syntax der Personenbeschreibung ist natürlich die selbe wie auch schon bei mir selbst. Mit “seeAlso” wird auf die RDF-Datei meines Freundes verwiesen. Im Grunde also nichts anderes als der Verweis zum Profil einer Person in einem sozialen Netzwerk. Der Unterschied ist, dass dieses soziale Netzwerk nun das gesamte Internet ist.

Als eine letzte Information möchte ich vielleicht noch ausdrücken wo eine Person sich aufhält. Da Personen im FOAF-Sprech “geospatial” (also: “auf der Erde befindlich”)  sind, kann man sie verorten. Wenn ich das mit mir selbst mache sieht mein Beispiel so aus:

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
  xmlns:foaf="http://xmlns.com/foaf/0.1/">
  <foaf:PersonalProfileDocument rdf:about="">
    <foaf:maker rdf:resource="#me"/>
    <foaf:primaryTopic rdf:resource="#me"/>
  </foaf:PersonalProfileDocument>
  <foaf:Person rdf:ID="me">
    <foaf:name>Stefan Antoni</foaf:name>
    <foaf:based_near>
      <geo:Point geo:lat="50.1463491" geo:long="8.6245506"/>
    </foaf:based_near>
    <foaf:givenname>Stefan</foaf:givenname>
    <foaf:family_name>Antoni</foaf:family_name>
    <foaf:mbox_sha1sum>7e5dbf850ca8661675bd80481b26b095d7337927</foaf:mbox_sha1sum>
    <foaf:weblog rdf:resource="http://www.suchkultur.de"/blog/>
    <foaf:workplaceHomepage rdf:resource="http://www.t-online.de"/>
    <foaf:knows>
      <foaf:Person>
        <foaf:name>Max Mustermann</foaf:name>
        <rdfs:seeAlso
          rdf:resource="http://beliebige-quelle.de/max_mustermann/foaf.rdf"/>
      </foaf:Person>
  </foaf:knows>
  </foaf:Person>
</rdf:RDF>

Ab Zeile 11 sind mit based_near die Geokordinaten notiert. Diese Koordinaten können sich natürlich jeder Zeit ändern und zum Beispiel über mein Mobiltelefon aktualisiert werden.

Das war nun ein kleiner Einblick in das FOAF-Vokabular und wie man damit die eigene Person beschreiben kann. Durch die Modularität innerhalb von RDF-Dokumenten können viele weitere “Vokabulare” eingesetzt werden, um die maschinenenlesbaren Informationen über Personen und Dinge beliebig detailiert zu beschreiben. Die Verknüpfung dieser Informationen erledigt dabei das Web automatisch über die darin spezifizierten URIs.

Einige weiterführende Beispiele zum Thema finden sich im Wiki des FOAF Projekts: Beispiele

Ein schönes Beispiel zur Verdeutlichung wie FOAF-Daten in einem Benutzerprofil dargestellt werden können, ist der FOAF-Visualizer and Relation Explorer.

Dort kann man sich meine Minimalkonfiguration anschauen: http://foaf-visualizer.org/?uri=http://www.suchkultur.de/rdf/foaf.rdf oder eines der komplexeren Beispiele wie zum Beispiel das hier von  Sergey Poznyakoffs RDF/FOAF Profil. Zum direkten Vergleich: Das entsprechende RDF-XML seines Profils.

I, Robot – Yelp.com fordert die Einhaltung von Isaac Asimov’s Robotergesetzen ein

In Isaac Asimov’s Kurzgeschichte “Runaround” führt der Autor seine drei goldenen Regeln für Roboter ein, die immer dann zitiert werden, wenn es mal wieder um den philosophischen Diskurs über die Beziehung zwischen Mensch und Roboter geht. Die drei Regeln sind:

  1. A robot may not injure a human being or, through inaction, allow a human being to come to harm.
  2. A robot must obey any orders given to it by human beings, except where such orders would conflict with the First Law.
  3. A robot must protect its own existence as long as such protection does not conflict with the First or Second Law.

Das lokale Suche Portal yelp.com nimmt diese Regeln offenbar wirklich ernst, und fordert sie daher auch von vorbeiziehenden Webcrawlern ein. Allerdings wurde die Syntax für Asimov’s Regeln bei der Definition des Robots Exclusion Standard sträflich vernachlässigt. Deshalb notieren die Fleischbeutel bei yelp.com diese Regeln für unsere crawlenden Blechkameraden in Form von Kommentaren innerhalb der robots.txt Datei.

Anschauen kann man sich das hier.

Es bleibt noch abzuwarten ob diese Maßnahme die Welt der Zukunft wirklich besser macht. Ich bin da noch skeptisch.