1

Ich versuche Cluster Strings mit DBSCAN, mit Cosine_distances als die Metrik nach TfidfVectorizer Transformation Cluster. Sag, ich habe zwei Saiten. Der cosine_distance zwischen ihnen (berechnet mit sklearn.metrics.pairwise.cosine_distance), wenn es nur diese beiden Strings sind, ist der Abstand zwischen ihnen, wenn sie Teil eines größeren Datensatzes sind (mit vielen anderen Strings).sklearn cosine_distances zwischen zwei Strings variiert je nach Größe des gesamten Datensatzes?

Warum passiert das und wie kann ich sicherstellen, dass der Abstand zwischen zwei Strings unabhängig von der Größe des Datasets, aus dem sie bestehen, gleich ist?

Auf diese Weise kann mein DBSCAN Clustering zuverlässig durchführen!

EDIT: Hinzufügen von Beispielcode wie gewünscht:

from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.metrics.pairwise import cosine_distances 

X = [ 
    'this is a string', 
    'this was a string' 
    ] 

Y = [ 
    'this could be a string', 
    'this may be a string' 
    ] 

Z = [ 
    'this is a string', 
    'this was a string', 
    'this could be a string', 
    'this may be a string' 
    ] 

for d in [X, Y, Z]: 
    tv = TfidfVectorizer() 
    print(cosine_distances(tv.fit_transform(d))) 

Ausgänge:

[[ 0.   0.49689739] 
[ 0.49689739 0.  ]] 

[[ 0.   0.39702518] 
[ 0.39702518 0.  ]] 

[[ 0.   0.64740127 0.70225689 0.70225689] 
[ 0.64740127 0.   0.70225689 0.70225689] 
[ 0.70225689 0.70225689 0.   0.46163155] 
[ 0.70225689 0.70225689 0.46163155 0.  ]] 

Wie man hier sehen kann, ist der Abstand zwischen this is a string und this was a string ist 0.497 in Dataset X, aber es ist 0.647 im Datensatz Z. Das Gleiche gilt für strings this could be a string und this may be a string in Datensätze Y und Z

In dem obigen Beispiel, wenn I max Abstand (EPS) Parameter DBSCAN wählte 0,6, dann in-Datensatz X zu sein, werden beide Zeichenketten im gleichen Cluster gesetzt werden, aber im Datensatz Z werden sie in verschiedene Cluster eingefügt.

+0

fügen Sie bitte ein Beispiel/einen Code hinzu, um Ihr Ziel klarer zu machen – sera

Antwort

0

Kosinusähnlichkeit ist geeignet für lange Dokumente.

Kurze Strings haben nicht genug Wörter.

Die Entfernung ändert sich aufgrund des IDF-Teils von TFIDF. Sie haben sich für eine inverse Dokumentenfrequenzgewichtung entschieden. Wenn sich die Dokumenthäufigkeit ändert, ändern sich die Entfernungen.

+0

aw snap .. das ist genau richtig! Ich weiß nicht, warum mir das nicht eingefallen ist. Was ist in diesem Fall der richtige Umgang mit meiner Anforderung? Was soll ich verwenden? – shikhanshu

+0

Ich weiß es nicht. Es hängt von Ihren Daten und der Aufgabe ab, die Sie lösen müssen. Ihre Daten sind wahrscheinlich nicht "das ist eine Zeichenfolge". –

+0

Ich würde wahrscheinlich CountVectorizer anstelle von TfIdf verwenden müssen, um die Entfernungen immun gegenüber der Dokumenthäufigkeit zu machen. Werde darüber nachdenken. Vielen Dank. – shikhanshu

Verwandte Themen