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