Advertisement
Guest User

Untitled

a guest
Jan 17th, 2017
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.38 KB | None | 0 0
  1. Überblick
  2.  
  3. Im letzten Milestone wurden die Grundlagen dafür erstellt, mit den Daten der Wikipedia effektiv arbeiten zu können. Ihr System ist nun in der Lage Wikipedia-Seiten, deren Kategorien und Verbindungen in einer Datenbank zu repräsentieren und über eine Java API verfügbar zu machen. In diesem Milestone steht nun der eigentliche Mehrwert im Vordergrund: Die Extraktion und Aufbereitung von Information aus den Basisdaten. Dazu werden zum einen neue Klassen analog zu Page eingeführt, zum einen werden Extraktionsaufgaben als "Tasks" beschrieben welche der Reihe nach ausgeführt werden können.
  4.  
  5. Erweiterung des Datenmodells
  6.  
  7. Erweitern Sie Ihr Datenmodell welches ja bereits Wikipedia-Seiten und deren Relationen enthält um weitere Klassen und Beziehungen. Die folgenden Klassen werden im Weiteren zusammenfassend auch als Entitäten Klassen (Entity-Classes) bezeichnet:
  8.  
  9. Person
  10. City (Ort)
  11. Monument (Denkmal)
  12. Objekte dieser Klassen stehen für Personen, Orte und Denkmäler welche Sie auf Grundlage der importierten "Page"-Objekte extrahieren und in Ihrer Datenbank repräsentieren. Auf den ersten Blick scheint es naheliegend, zusätzliche und Typ-spezifische Informationen wie etwa Vor- und Nachname einer Person, oder die Einwohnerzahl eines Ortes einfach mit in den Datenbank-Knoten der Page zu schreiben. Für eine Trennung sprechen folgende Gründe:
  13.  
  14. Nicht jede Seite repräsentiert wirklich eine Person oder einen Ort- auch wenn es laut Kategorisierung in der Wikipedia so sein sollte.
  15. Es kann nicht ausgeschlossen werden, dass ein Wikipedia-Artikel mehre Klassen gleichzeitig repräsentiert (z.B. eine Person und ein Denkmal).
  16. Es ist sauberer die Datengrundlage von den extrahierten Informationen zu trennen. Möglicherweise kommen später weitere Datenquellen hinzu welche Informationen zu Personen und Orten liefern- aber eben keine Wikipedia-Artikel sind.
  17. Die spezifischen Attribute und Relationen welche die Entitäten-Klassen abbilden sollen ergeben sich aus der weiteren Spezifikation dieses Milestones. Allen gemein ist jedoch, dass Sie eine Verknüpfung zum Wikipedia-Artikel-Objekt beinhalten müssen. Es soll also stets möglich sein, von einem Objekt der Klasse Person, City oder Monument zur Page zu kommen. Umgekehrt soll es auch möglich sein von einer Page die Menge aller Entities (Person, City, Monument) zu bekommen, welche aufgrund dieser Page extrahiert wurden.
  18.  
  19. Wie bereits bei der Modellierung der Klasse Page achten Sie darauf, die Datenbankschicht vor dem Benutzer Ihrer API zu "verstecken". D.h. die Klasse Person etwa sollte Methoden zur Abfrage des Geburtsdatums, des Namens usw. enthalten. Die Abfrage der Page auf der ein Personen-Objekt basiert soll ein Page-Objekt zurückgeben und nicht etwa ein Neo4J-Node-Objekt.
  20.  
  21. Task-Modell
  22.  
  23. Allen bisherigen und geplanten Operationen ist gemein, dass sie bestimmte Änderungen auf der Datenbank durchführen: HTML-Seiten importieren, Kategorien-Links extrahieren usw. Meistens geschieht dies auf Grundlage eines vorher durchgeführten Schrittes: Zum Beispiel müssen zuerst die HTML-Seiten in Page-Objekte importiert worden sein, bevor daraus Links extrahiert werden können. Alle Aufgaben (Tasks) müssen also so in eine Reihenfolge gebracht werden, dass alle Informationen in der Datenbank verfügbar sind sobald sie benötigt werden. Das kann darüber geregelt werden, dass für jede Aufgabe die Vor- und Nachbedingungen definiert sind.
  24.  
  25. Spätestens an diesem Punkt (gern auch schon an anderer Stelle) kommt das Prinzip von abstrakten Klassen und der Vererbung zum tragen. Jeder Task besitzt Attribute und Methoden die von allen denkbaren Ausprägungen wie Import, Extraktion von Links usw. benötigt werden:
  26.  
  27. Ein Task sollte eine Beschreibung seiner Funktion zurückgeben können. Dazu genügt eine Methode welche einen String zurück gibt (z.B. getDescription()).
  28. Welche Vorbedingungen hat der Task? D.h. welche Bedingungen müssen durch vorher gelaufene Tasks erfüllt sein? Dazu eignet sich eine Methode welche eine Menge welche die Vorbedingungen als Strings oder als Elemente einer Enumeration (enum) enthalten.
  29. Welche Nachbedingungen hat dieser Task- was stellt er also für andere Tasks bereit?
  30. Ein Task muss durch Aufruf einer Methode ausgeführt werden können.
  31. Bei der Erstellung dieser abstrakten Klasse "Task" können für alle diese Methoden noch konkreten Implementierungen geschrieben werden. Es wird nur definiert welche Methoden es gibt, welche Parameter sie haben und was ggf. ihr Rückgabewert ist. Sie bleiben abstrakt und werden erst durch diejenigen Klassen implementiert, die davon erben.
  32.  
  33. Sie schreiben also für jede Aufgabe (siehe unten) eine Klasse welche von Task erbt und die abstrakten Methoden entsprechend der zu erfüllenden Aufgabe überschreibt. Einer der wichtigen Vorteile: Sie können jede Implementierung als Task betrachten der eine Methode zur Ausführung hat. Sie können diese Methode aufrufen um den Task auszuführen, egal ob es sich dabei um den Import von HTML oder die Extraktion von Links handelt.
  34.  
  35. TaskScheduler
  36.  
  37. Alle Tasks eines Programmablaufs werden in einem TaskScheduler, einer eigenen Klasse, gesammelt. Dieser verwaltet auszuführende Tasks in einer Liste. Der TaskScheduler muss keine Details über die unterschiedlichen Implementierungen der abstrakten Klasse Task wissen. Es genügt zu wissen:
  38.  
  39. Welche Tasks sollen in welcher Reihenfolge ausgeführt werden?
  40. Sind für alle Tasks die Vorbedingungen erfüllt, sobald die an der Reihe sind?
  41. Wie kann ich einen Task ausführen?
  42. Der TaskScheduler muss für einen Benutzer zumindest folgende Funktionen erfüllen:
  43.  
  44. Tasks hinzufügen
  45. Abfragen ob alle Vorbedingungen der enthaltenen Tasks erfüllt sind
  46. Liste der Tasks auf die Konsole ausgeben
  47. Tasks ausführen
  48. Tipp: Sie können für die Implementierung des TaskScheduler von einer Listen-Implementierung von Java erben, z.B. ArrayList.
  49.  
  50. Tasks
  51.  
  52. 1) HTMLDumpImport
  53.  
  54. Den Import haben Sie bereits geschrieben. Kapseln Sie ihn nun in einen Task, sodass er als Teil einer Prozesskette durch den TaskScheduler gestartet werden kann. Als Ergebnis liegen die Wikipedia-Artikel in der Datenbank vor. Achten Sie darauf, den Namen des zu importierenden HTML-Dumps als Parameter zu verarbeiten und nicht fest in de Code zu schreiben.
  55.  
  56. 2) CategoryLinkExtraction
  57.  
  58. Auch diese Funktion ist bereits implementiert. Kapseln Sie die Extraktion der Kategorien-Links aus den HTML Quelltexten und deren Einfügung als Relationships in die Datenbank als eigenständigen Task.
  59.  
  60. 3) ArticleLinkExtraction
  61.  
  62. Kapseln Sie analog zur CategoryLinkExtraction die Extraktion und Repräsentation der Artikel (also nur Namespace-ID 0) untereinander.
  63.  
  64. 4) EntityBaseExtraction und Entity-Links
  65.  
  66. Prüfen Sie für alle Wikipedia-Artikel in Ihrer Datenbank welche direkt oder indirekt der Kategorie "Person", "Ort" bzw. "Denkmal" angehören. Definieren und dokumentieren Sie ggf. weitere Regeln für die Erkennung von Personen, Orten und Denkmälern, falls die Kategorienzugehörigkeit allein nicht präzise genug sein sollte (und z.B. Personenlisten als "Person" erkannt werden). Erzeugen Sie dann für jede Belegstelle über Ihre API ein entsprechendes-Objekt in der Datenbank. Extrahieren Sie für alle Entitäten zumindest folgende Basis-Informationen:
  67.  
  68. SourceWikipediaPage - Referenz auf den Wikipedia-Artikel (als Datenbank-Objekt) welcher dieser Entität zugrundeliegt.
  69. Methoden um alle verlinkten Entitäten vom Typ Person, City oder Monument abzufragen (eingehend und ausgehend).
  70. Das Ergebnis diesen Schrittes sind also neue Datenbank-Objekte, analog zur Page-Klasse: Person, Ort und Denkmal. Diese Klassen enthalten noch keine spezifischen Informationen wie Vornamen oder Einwohnerzahlen. Diese werden in einem separaten Schritt extrahiert und in die Datenbank eingetragen.
  71.  
  72. Beachten Sie bei der Extraktion, dass nicht aus jedem Artikel zwangsläufig eine Person-, Ort- oder Denkmal-Entität entstehen muss. Es gibt Artikel welche z.B. als "Person" kategorisiert sind, aber keine konkrete Person benennen sondern nur Listen von Personen oder verwandte Themen. Versuchen Sie also über die Kategorieninformation hinaus einzugrenzen, ob es sich dabei wirklich um eine Person handelt oder nicht. Wie sie dabei vorgehen ist, wie bei der Extraktion der übrigen Attribute, ganz ihrer Kreativität überlassen. Es wird jedoch nicht negativ gewertet, wenn Sie pauschal alle Artikel der Kategorie "Person" auch als Person-Entität extrahieren. Sie haben dann lediglich einen Anteil von Entitäten zu denen Sie keine sinnvollen Attribute extrahieren können.
  73.  
  74. Auch wenn Attribute wie Vornamen und Einwohnerzahlen in diesem Schritt noch nicht explizit betrachtet und extrahiert werden, so werden in diesem Schritt doch bereits die Links zwischen den Entity-Objekten extrahiert und eingetragen: Angenommen Sie haben für die Artikel "Frankfurt" und "Hanau" (Page-Objekte), welche durch Article-Links verbunden sind, je eine City-Entität erstellt. Dann soll auch zwischen den entsprechenden Entitäten ein Link engefügt werden. Verwenden Sie dazu einen eigenen RelationShip-Typ (z.B. EntityLink). Die Entity-Links leiten sich also unmittelbar von den Article-Links ab.
  75.  
  76. 5) PersonExtraction
  77. Extrahieren Sie auf Grundlage der in der EntityBaseExtraction erhobenen Daten soweit möglich zumindest folgende Informationen:
  78.  
  79. Vorname(n)*
  80. Nachname*
  81. Geburtsname*
  82. Geburtstag*
  83. Todestag*
  84. Geburtsort (als String)*
  85. Letzter Wohnort (als String)
  86. allgemein verlinkte Orte, Personen, Denkmäler (sofern Sie in der Datenbank enthalten sind) als entsprechende Objekte (City, Person, Monument)
  87. 6) CityExtraction
  88. Extrahieren Sie auf Grundlage der in der EntityBaseExtraction erhobenen Daten soweit möglich zumindest folgende Informationen:
  89.  
  90. Name*
  91. Land*
  92. Einwohnerzahl*
  93. Jahr der Gründung oder ersten urkundlichen Erwähnung
  94. allgemein verlinkte Orte, Personen, Denkmäler (sofern Sie in der Datenbank enthalten sind) als entsprechende Objekte (City, Person, Monument)
  95. 7) MonumentExtraction
  96. Extrahieren Sie auf Grundlage der in der EntityBaseExtraction erhobenen Daten soweit möglich zumindest folgende Informationen:
  97.  
  98. Name*
  99. Stadt bzw. nächstgelegene Ortschaft (sofern sie in der Datenbank enthalten ist)*
  100. Jahr der Einweihung*
  101. Geehrte Person (sofern sie in der Datenbank enthalten ist) als Person-Objekt
  102. allgemein verlinkte Orte, Personen, Denkmäler (sofern Sie in der Datenbank enthalten sind) als entsprechende Objekte (City, Person, Monument)
  103. Konsolenprogramm
  104.  
  105. Schreiben Sie eine kleine Schnittstelle für die Kommandozeile welche die nachfolgend beschriebenen Funktionen ermöglicht. Sie können die Funktionalität der Aufrufe aus Milestone 2 gern übernehmen- es ist jedoch nicht zwingend erforderlich. Halten Sie sich bei der Lösung für diesen Milestone jedoch streng an die folgenden Parameter:
  106.  
  107. 1) Erzeugung der Datenbank und Durchführung aller Tasks gemäß der Aufgabenstellung inklusive Reset der Datenbank:
  108.  
  109. WikiXtractor <Database-Directory> createdb <HTML-Input-File>
  110.  
  111. Stellen Sie sicher, dass der Aufrufer über die Log-Ausgaben weiss, woran gerade gerechnet wird und wie weit der Fortschritt ist. Für diesen Aufruf können Sie die Abfolge der Tasks im Code festschreiben.
  112.  
  113. Erweiterung für Gruppen ohne LA-Beteiligung:
  114.  
  115. WikiXtractor <Database-Directory> executetasks <Task-File>
  116.  
  117. Das Programm soll eine Folge von Tasks ausführen die in einer Textdatei, dem "Task-File" beschrieben sind. Jede Zeile im Task-File steht für einen Task und, sofern benötigt, seine Parameter. Beispiel:
  118.  
  119. HTMLDumpImport data/wikipedia_de_prgpr_subset.txt
  120. CategoryLinkExtraction
  121. ArticleLinkExtraction
  122. EntityBaseExtraction
  123. PersonExtraction
  124. CityExtraction
  125. MonumentExtraction
  126.  
  127. Ihr Programm liest also die Text-Datei aus um in Ihrem TaskScheduler die Tasks zusammenzustellen, die dann ausgeführt werden sollen. Beachten Sie, dass der TaskScheduler vor der Ausführung noch einmal prüfen soll, ob alle Vorbedingungen erfüllt sind. Wenn z.B. laut Task-File eine ArticleLinkExtraction durchgeführt werden soll, aber vorher noch kein HTML importiert wurde, soll eine entsprechende Fehlermeldung ausgegeben werden.
  128.  
  129. 2) Abfrage von Informationen
  130.  
  131. WikiXtractor <Database-Directory> queryentity <Artikel-Title>
  132.  
  133. Beispielaufruf: WikiXtractor datatabase queryentity "Hermannsdenkmal"
  134.  
  135. Aufgrund des angegebenen Wikipedia-Artikels (z.B. Hermannsdenkmal) soll geprüft werden, ob ein damit verknüpftes Entity-Objekt (Person, City oder Monument) existiert. Im positiven Fall sollen alle verfügbaren Informationen über dieses Objekt auf der Konsole ausgegeben werden.
  136.  
  137. Evaluation
  138.  
  139. Sie haben aufgrund von Regeln Informationen extrahiert. In hoffentlich vielen Fällen wird dies gut gelingen- es wird jedoch sicherlich auch Fehler in der Extraktion geben. Um abschätzen zu können, wie gut Ihre Regeln sind führen Sie eine Evaluation wie folgt durch:
  140.  
  141. Wählen Sie von jeder Klasse (Person, Ort, Denkmal) zufällig je 20 Artikel aus. Ermitteln Sie dann für jede mit einem (*) markierte Eigenschaft der Extraktionsaufgaben die absolute Anzahl der richtigen Fälle. Geben Sie darauf basierend desweiteren das Verhältnis der richtigen Fälle zur Gesamtheit der Fälle an. Damit ergibt sich eine Tabelle der Form:
  142.  
  143. Attribut Absolut richtig Genauigkeit
  144. Person.Nachname 18 0.9
  145. Person.Geburtsort 15 0.75
  146. ... ... ...
  147. Gehen Sie bei der Wahl der zufälligen Artikel ehrlich vor. Es geht nicht darum, dass eine 1.0 in der Tabelle steht, sondern darum, dass Sie sich mit dem Vorgehen zur Prüfung der eigenen Arbeit vertraut machen.
  148.  
  149. Regelung nach Zusammensetzung des Teams
  150.  
  151. Für Teams mit mehr >=50% LA-Studierenden:
  152.  
  153. Die Objektorientierte Programmierung der Tasks mit einer abstrakten Klasse als Grundlage entfällt.
  154. Jeder Task soll in seiner eigenen Klasse implementiert sein, aber die Reihenfolge der Ausführung darf fest im Code programmiert sein. Vor- und Nachbedingungen müssen nicht erfasst und nicht geprüft werden. Es wird kein TaskScheduler benötigt.
  155. Die Modellierung und Extraktion der Klassen City und Monument entfällt. Entsprechend können diese Entitäten auch nicht evaluiert werden. Die Klasse Person soll aber umgesetzt und evaluiert werden. Personen sollen auf die Seite verlinken aus der sie extrahiert wurden. Links zwischen Entities müssen aber nicht modelliert werden (auch nicht zwischen Personen).
  156. Für Teams mit 0<x<50% LA-Studierenden:
  157.  
  158. Die Objektorientierte Programmierung der Tasks mit einer abstrakten Klasse als Grundlage entfällt.
  159. Jeder Task soll in seiner eigenen Klasse implementiert sein, aber die Reihenfolge der Ausführung darf fest im Code programmiert sein. Vor- und Nachbedingungen müssen nicht erfasst und nicht geprüft werden. Es wird kein TaskScheduler benötigt.
  160. Die Modellierung und Extraktion der Klasse City entfällt. Entsprechend kann diese Entität auch nicht evaluiert werden. Die Klassen Person und Monument sollen aber umgesetzt und evaluiert werden. Links auf Orte entfallen- Links zwischen Personen und Denkmälern sollen aber berücksichtigt werden.
  161. Abgabe und Bewertung
  162.  
  163. Die Abgabefrist für diesen Milestone ist am 18. Januar um 23:59. Gültig ist der Stand der Versionsverwaltung zu diesem Zeitpunkt.
  164.  
  165. Grundvoraussetzungen für die Bewertung:
  166.  
  167. Alle notwendigen Dokumente im Subversion Repository.
  168. Autorenschaft(en) der Klassen mit JavaDoc dokumentieren
  169. Erstellung eines jar-Archivs Ihres Projekts um die Ausführung für Dritte zu erleichtern. Das Projekt sollte über den Aufruf (Beispiel) java -Xmx2g -jar WikiXtractor.jar gestartet werden können.
  170. Erstellung einer Datei "Milestone3_README.txt" im Wurzelverzeichnis Ihres SVN-Repositories in welcher Sie Ihre Abgabe für den Tutor kommentieren. Die Beschreiben sollte zumindest enthalten:
  171. wie die Berechnung ausgeführt werden kann (Beispielaufruf(e) auf der Konsole)
  172. wo die Ergebnisdatei(en) liegen
  173. wer woran gearbeitet hat
  174. welche bekannten Probleme ggf. noch bestehen
  175. Bewertungskriterien (Teams ohne LA Studierende):
  176.  
  177. Entwicklung
  178. (8 Punkte) Erweiterung des Datenmodells um die Klassen Person, City, Monument
  179. (8 Punkte) Implementierung des TaskSchedulers sowie der abstrakten Klasse Task mit den darauf basierenden Implementierungen.
  180. (6 Punkte) Aufgabenteil 1 (HTMLDumpImport).
  181. (6 Punkte) Aufgabenteil 2 (CategoryLinkExtraction)
  182. (6 Punkte) Aufgabenteil 3 (ArticleLinkExtraction)
  183. (8 Punkte) Aufgabenteil 4 (EntityBaseExtraction)
  184. (8 Punkte) Aufgabenteil 5 (PersonExtraction)
  185. (8 Punkte) Aufgabenteil 6 (CityExtraction)
  186. (8 Punkte) Aufgabenteil 7 (MonumentExtraction)
  187. (8 Punkte) Konsolenprogramm
  188. (10 Punkte) Evaluation
  189. (8 Punkte) Kommentierung aller Klassen, Methoden und Attribute mit JavaDoc (kurze Beschreibung, Autore(n), Parameter, Rückgabewert)
  190. (8 Punkte) Logging von Exceptions und dem Programmfortschritt über log4j auf die Konsole sowie in eine Log-Datei.
  191. Bewertungskriterien (Teams mit 0<x<50% LA-Studierenden):
  192.  
  193. Entwicklung
  194. (10 Punkte) Erweiterung des Datenmodells um die Klassen Person, City, Monument
  195. Implementierung des TaskSchedulers sowie der abstrakten Klasse Task mit den darauf basierenden Implementierungen.
  196. (7 Punkte) Aufgabenteil 1 (HTMLDumpImport).
  197. (7 Punkte) Aufgabenteil 2 (CategoryLinkExtraction)
  198. (7 Punkte) Aufgabenteil 3 (ArticleLinkExtraction)
  199. (10 Punkte) Aufgabenteil 4 (EntityBaseExtraction)
  200. (10 Punkte) Aufgabenteil 5 (PersonExtraction)
  201. Aufgabenteil 6 (CityExtraction)
  202. (10 Punkte ) Aufgabenteil 7 (MonumentExtraction)
  203. (10 Punkte) Konsolenprogramm
  204. (11 Punkte) Evaluation
  205. (9 Punkte) Kommentierung aller Klassen, Methoden und Attribute mit JavaDoc (kurze Beschreibung, Autore(n), Parameter, Rückgabewert)
  206. (9 Punkte) Logging von Exceptions und dem Programmfortschritt über log4j auf die Konsole sowie in eine Log-Datei.
  207. Bewertungskriterien (Teams mit mehr >=50% LA-Studierenden):
  208.  
  209. Entwicklung
  210. (11 Punkte) Erweiterung des Datenmodells um die Klassen Person, City, Monument
  211. Implementierung des TaskSchedulers sowie der abstrakten Klasse Task mit den darauf basierenden Implementierungen.
  212. (8 Punkte) Aufgabenteil 1 (HTMLDumpImport).
  213. (8 Punkte) Aufgabenteil 2 (CategoryLinkExtraction)
  214. (8 Punkte) Aufgabenteil 3 (ArticleLinkExtraction)
  215. (11 Punkte) Aufgabenteil 4 (EntityBaseExtraction)
  216. (11 Punkte) Aufgabenteil 5 (PersonExtraction)
  217. Aufgabenteil 6 (CityExtraction)
  218. Aufgabenteil 7 (MonumentExtraction)
  219. (11 Punkte) Konsolenprogramm
  220. (12 Punkte) Evaluation
  221. (10 Punkte) Kommentierung aller Klassen, Methoden und Attribute mit JavaDoc (kurze Beschreibung, Autore(n), Parameter, Rückgabewert)
  222. (10 Punkte) Logging von Exceptions und dem Programmfortschritt über log4j auf die Konsole sowie in eine Log-Datei.
  223. Für die Gewichtung des Milestones in der Gesamtbewertung werden 4 Wochen angesetzt.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement