Implementierung: Dokumentclustering Max Jakob Florian Winkelmeier Ruprecht-Karls-Universität Heidelberg Seminar für Computerlinguistik HS Information Retrieval Dozentin: Dr. Karin Haenelt Wintersemester 2005/2006 1 Dokumentclustering thematische Gruppierung von Dokumenten aufgrund gemeinsamer Terme z.B. zum Browsen in Dokumentgruppen 2 Gliederung Programmaufbau Korpus Ablauf 1. 2. 3. 4. 5. 6. Identifikation der Index-Terme Erzeugung der Dokumentvektoren Ähnlichkeitsmaße Ähnlichkeitsmatrix der Dokumente Relationsmatrix der Dokumente Clustering Ergebnisse Evaluierung Cluster 3 Programmaufbau 4 Korpus Dokumente aus dem ZEIT.de-Archiv in Textdateien gespeichert Skript zum Speichern einzelner Jahre des ZEIT-Archivs in Textdateien http://www.zeit.de/archiv/ 5 Quelle: http://www.zeit.de/2005/52/Osthoff Identifikation der Index-Terme Tokenizer Stemmer Trennung an allem was kein Buchstabe ist (hauptsächlich Leerzeichen) mit Bindestrich getrennte Wörter bleiben vereint Porter-Stemmer von snowball Stopwörter werden später durch tf-idf aussortiert 6 Dokumentvektoren als Dictionaries (Hashtables) repräsentiert nur vorkommende Terme docVectors = { 1: { 2:4, 6:2, 7:1, 8:3 }, 2: { 1:3, 2:1, 3:4, 4:3, 5:1, 6:2, 8:1}, 3: { 1:3, 5:3, 7:3 }, …} Bild-Quelle: http://kontext.fraunhofer.de/haenelt/kurs/folien/Clustering.pdf 7 Erzeugung der Dokumentvektoren def getDocVector(fName): docVector = {} for word in corpus.getWordListFromFile(fName): docVector[word] = docVector.get(word, 0) + 1 return docVector def getDocVectors(): docVectors = {} idx = 0 for fileName in corpus.textFileNames: docVectors.setdefault(idx, {}) for word, freq in getDocVector(fileName): docVectors[idx][corpus.wordIdxDict[word]] = freq idx = idx + 1 return pruneWithTFIDF(docVectors) 8 Ähnlichkeitsmaße Korrelationsartige Maße (großer Wert große Ähnlichkeit) Einfache Methode Cosinus-Koeffizient Dice-Koeffizient Jaccard-Koeffizient Overlap-Koeffizient 9 Cosinus-Ähnlichkeit import math def cosinusSim(vecDict1, vecDict2): zaehler, nenner1, nenner2 = 0, 0, 0 for doc in vecDict1.keys() + vecDict2.keys(): zaehler += vecDict1.get(doc, 0) * vecDict2.get(doc, 0) nenner1 += vecDict1.get(doc, 0) **2 nenner2 += vecDict2.get(doc, 0) **2 return zaehler / (math.sqrt(nenner1) * math.sqrt(nenner2)) 10 Ähnlichkeitsmatrix der Dokumente Dokument-DokumentÄhnlichkeitstabelle Zwischenschritt zur Relationsmatrix 11 Bild-Quelle: http://kontext.fraunhofer.de/haenelt/kurs/folien/Clustering.pdf Relationsmatrix der Dokumente Dokument-RelationsTabelle Ähnlichkeiten die den Schwellenwert überschreiten Bsp.: threshold = 10 12 Bild-Quelle: http://kontext.fraunhofer.de/haenelt/kurs/folien/Clustering.pdf Relationsmatrix der Dokumente beidseitig nötig für den späteren Clique-Algorithmus als Listen in einem Dictionary (Hashtable) nur bestehende Ähnlichkeiten simMartix = { 1: [3,4,5,6], 2: [4,6,8], 3: [1,4,6], 4: [1,2,3,6], 5: [1], 6: [1,2,3,4,8], 8: [2,6] } 13 Bild-Quelle: http://kontext.fraunhofer.de/haenelt/kurs/folien/Clustering.pdf Clustering Cliques „viele Partys, auf denen sich alle gegenseitig kennen“ zwischen allen Knoten innerhalb eines Clusters Kanten zu den anderen Knoten ein Knoten kann Teil mehrerer Cluster sein 14 Bild-Quelle: http://kontext.fraunhofer.de/haenelt/kurs/folien/Clustering.pdf Clique: Der Algorithmus Algorithmus von Bron und Kerbosch (1971) Clique ist NP-schwer in der Praxis trotzdem gute Laufzeit -> exponentielle Laufzeit gilt als der schnellste clique Algorithmus rekursiv definierter Algorithmus 15 Clique: Der Algorithmus(2) C: Knoten im aktuellen Cluster P: Knoten, die zu C hinzugefügt werden dürfen S: Knoten, die nicht zu C hinzugefügt werden dürfen P enthält am Anfang alle Knoten des Graphen enumerateClique(C, P, S) ● if P=={} and S=={}: ● ● clique gefunden else: for node in P: ● ● ● ● P = P\{node} N = alle zu node adjazenten Knoten enumerateClique(C+{node}, P*N, S*N) S=S + {node} 16 Clique: Rekursionsbaum 17 Bild-Quelle: Koch: Enumerating all connected maximal common subgraphs in two graphs, 1999 (S.10) Cluster Evaluierung Ziel: Clusterstruktur den Daten angemessen oder zufällig? v.a. 3 Kriterien externe interne “fleissige Ameisen” errechnete Lösung wird mit manueller verglichen ohne Rückgriff auf externe Informationen relative Vergleich von Ergebnissen, um Aussagen über Algorithmus und Daten machen zu können 18 externes Kriterium: F-Maß erfordert manuelles Clustering (Ameisen) Kombination aus recall und precision sei C=C1,...,Ck ein berechnetes Clustering sei C'=C'1,...C'k ein manuelles Clustering rec i,j =∣C j ∩C 'i∣/C 'i prec i,j =∣C j ∩C 'i∣/C j 19 F-Maß(2) F i,j = 2 1 1 prec i,j rec i,j l F =∑ i=1 ' ∣C i∣ dn ∗ max F i , j j=1,... , k mit dn= Anzahl aller Elemente des manuellen Clusterings 20 Internes Kriterium: Kohäsion und Separation 21 Bild-Quelle: Tan, Steinbach, Kumar: Introduction to Datamining, Addison-Wesley, 2004 (S. 537) Kohäsion und Separation(2) Kohäsion: Indikator für die Dichte eines Clusters. Je höher desto besser Separation je kleiner der Wert, umso besser sind die Cluster voneinander getrennt 22 Quelle: ???? Relative Kriterien Idee: anhand eines bestimmen Kriteriums aus einer Menge von Clustering Schemas das beste herausfinden etwas formaler: sei Palg eine Menge von Parametern eines Clustering-Algorithmus über einer Folge von Clustering-Lösungen Ci = C1,..., Cn wähle für unterschiedliche Parameter aus Palg den aus, der am besten zu den Daten passt. 23 Relative Kriterien(2) Wie findet man einen optimalen Parameter? Man lässt den Algorithmus über eine weite Folge der Werte des gewählten Parameters laufen Auswahl der grössten Folge mit konstanter Clusteranzahl Wert des Parameters in der Mitte der Folge identifiziert den gesuchten Wert Wofür das ganze? wir schätzen damit einen geeigneten Schwellenwert für die Ähnlichkeit zwischen Cluster ohne Auf und Ab in der Clusterzahl u.U. keine den Daten zugrunde liegende Clusterstruktur 24 Ende “The validation of clustering structures is the most difficult and frustrating part of cluster analysis” (Algorithms for clustering data, Jain and Dumes) 25 Quellen http://kontext.fraunhofer.de/haenelt/kurs/folien/Clustering.pdf Korpus: Die Zeit online-Archiv Stemmer http://www.zeit.de/archiv/ http://snowball.tartarus.org/algorithms/german/stemmer.html enumerateCliques-Algorithmus: Bron, Coen and Kerbosch, Joep: Finding all cliques of an unidrected graph, 1971 Koch, Ina: Enumerating all connected maximal common subgraphs in two graphs, 1999 26 Quellen(2) Evaluation Pfister, Joachim: Analyse und Einsatzpotentiale von ClusteringVerfahren zum Retrieval von Patentdokumenten, 2004 Halkidi, M, Y. Batistakis, M.Vazirgiannis. “Cluster Validity Methods: Part1”, SIGMOD Record, June 2002 Halkidi, M, Y. Batistakis, M.Vazirgiannis. “Cluster Validity Methods: Part2”, SIGMOD Record, September 2002 Tan, Pang-Ning, Steinbach, Michael, Kumar, Vipin: Introduction to Datamining, Addison-Wesley, April 2004 27