from janome.tokenizer import Tokenizer
from sklearn.feature_extraction.text import TfidfVectorizer
from scipy.cluster.hierarchy import linkage, fcluster
Es wird davon ausgegangen, dass ein Dokument in einer Zeile in input.txt beschrieben wird.
with open('input.txt') as f:
org_sentences = f.readlines()
Trennen Sie jedes Dokument mit einem Abstand von halber Breite für jedes Wort.
t = Tokenizer()
sentences = []
for s in org_sentences:
tmp = ' '.join(t.tokenize(s, wakati=True))
sentences.append(tmp)
Dieses Mal wird Tf-Idf verwendet, um das Dokument zu vektorisieren. Es gibt andere Mittel wie BoW / LSI / LDA / Word2Vec-Durchschnitt / Doc2Vec / FastText-Durchschnitt / BERT.
vectorizer = TfidfVectorizer(use_idf=True, token_pattern=u'(?u)\\b\\w+\\b')
vecs = vectorizer.fit_transform(sentences)
v = vecs.toarray()
Der Kosinusabstand, der bei Verarbeitungsaufgaben in natürlicher Sprache üblich ist, definiert den Abstand zwischen jedem Vektor. Basierend auf dieser Entfernung werden Dokumente durch hierarchisches Clustering (Single-Link-Methode) zu Clustern gebündelt.
z = linkage(v, metric='cosine')
Ein Beispiel, in dem der endgültige Cluster mit einem Abstand von 0,2 als Schwellenwert bestimmt wird. Wenn die Anzahl der Dokumente sehr groß wird, dauert die Berechnung der Entfernung sehr lange. Wenn Sie daher mehrere Schwellenwerte ausprobieren möchten, sollten Sie dies überprüfen, indem Sie das obige Ergebnis der Entfernungsberechnung in pickle speichern. Es ist auch möglich, die Anzahl der Cluster als Schwellenwert zu verwenden. Die Clusternummer jedes Dokuments wird in einer Gruppe gespeichert.
group = fcluster(z, 0.2, criterion='distance')
print(group)
Recommended Posts