2017-05-26 4 views
1

Ich würde gerne wissen, ob es eine (vorzugsweise Open-Source-) Bibliothek für das Clustering von Python-Quellcode basierend auf ihrer Ähnlichkeit gibt - oder alternativ ein Code-Klon-Detektor.Clustering Python-Quellcode

Es sollte auf Algorithmen (wie AST Fingerprinting) auf veröffentlichten Arbeiten basieren und sollte es klar beschreiben.

Ich füge hinzu, dass dies für Clustering "Python-Quellcode" ist, keine Clustering-Daten im Allgemeinen.

+0

Die sklearn Dokumentation ist ziemlich gut, listet ihre 9 Methoden auf und gibt veröffentlichte Referenzen für jede. Sie können es in [diesem Link] (http://scikit-learn.org/stable/modules/clustering.html) überprüfen. – Mephy

+0

ziemlich sicher PMD CPD (Copy Paste Detector) kann mit Python-Code arbeiten, aber das funktioniert nicht auf der AST-Ebene, also wenn Sie suchen, jemanden zu entdecken, nur alle Variablen umbenennen, wird das nicht helfen – Foon

+0

Nein, Es tut nicht. Überprüfen Sie es hier: http://pmd.sourceforge.net/pmd-4.3.0/cpd.html (danke für Ihre Antwort) –

Antwort

1

Es gibt mehrere Möglichkeiten, Daten zusammenzufassen. Ich gebe hier 2 Beispiele.

k-mean-Clustering

können Sie scikit-learn verwenden, um Daten in der Gruppe clustern KMeans Modell. Grundsätzlich werden alle Datenpunkte einer Gruppe zugeordnet.

from sklearn.cluster import KMeans 

X = np.array([[1, 2], [2, 3], [2, 3], [3, 5], [4, 2], [1, 1.5]]) 
kmean_model = KMeans(n_clusters=5, random_state=0) 
kmean_model.fit_predict(X) 

# return array([4, 2, 2, 3, 0, 1], dtype=int32) 

K-Mean Clustering-Algorithmus ist in den meisten Büchern an diesem Tag verfügbar, so dass Sie darauf verweisen können.

Hierarchical Clustering

Für Hierarchical Clustering, müssen Sie zuerst die Distanzmatrix finden, werden in diesem Fall 6 x 6 sein, weil wir 6 Datenpunkte in X. Das Ergebnis, das wir erhalten, ist die Partitionsnummer, damit Sie Ihre Datenpunkte basierend auf der Ausgabepartition ordnen können.

import numpy as np 
from scipy.cluster.hierarchy import fcluster, linkage 
from scipy.spatial.distance import cdist 

X = np.array([[1, 2], [2, 3], [2, 3], [3, 5], [4, 2], [1, 1.5]]) 
D = cdist(X, X) # euclidean distance matrix (you can custom distance here as you like) 
linkage = linkage(D) 
partition = fcluster(linkage, t=0.01, criterion='distance') 

# return array([2, 1, 1, 5, 4, 3], dtype=int32) 

Siehe ähnliche Papiere here.

+0

Ich meinte Clustering "Python-Quellcode", nicht Clustering in Python. Können Sie Ihre Antwort entfernen, so dass die Leute sie als unbeantwortet erkennen? (Wenn Sie Ihre Antwort leeren, werde ich meine Antwort entfernen ..) –

+0

@JohnJayDoe Die Leute werden die Frage als unbeantwortet erkennen, bis Sie eine Antwort akzeptiert haben. – mkrieger1