from janome.tokenizer import Tokenizer
from sklearn.feature_extraction.text import TfidfVectorizer
from scipy.cluster.hierarchy import linkage, fcluster
On suppose qu'un document est décrit sur une ligne dans input.txt.
with open('input.txt') as f:
org_sentences = f.readlines()
Séparez chaque document avec un espace demi-largeur pour chaque mot.
t = Tokenizer()
sentences = []
for s in org_sentences:
tmp = ' '.join(t.tokenize(s, wakati=True))
sentences.append(tmp)
Cette fois, Tf-Idf est utilisé pour vectoriser le document. Il existe d'autres moyens tels que BoW / LSI / LDA / Word2Vec average / Doc2Vec / FastText average / BERT.
vectorizer = TfidfVectorizer(use_idf=True, token_pattern=u'(?u)\\b\\w+\\b')
vecs = vectorizer.fit_transform(sentences)
v = vecs.toarray()
La distance cosinus, courante dans les tâches de traitement du langage naturel, définit la distance entre chaque vecteur. Sur la base de cette distance, les documents sont regroupés en clusters par regroupement hiérarchique (méthode de liaison unique).
z = linkage(v, metric='cosine')
Un exemple dans lequel le cluster final est déterminé avec une distance de 0,2 comme seuil. Si le nombre de documents devient énorme, le calcul de la distance prend un temps considérable. Par conséquent, si vous souhaitez essayer plusieurs seuils, vous devez vérifier en enregistrant le résultat du calcul de distance ci-dessus dans le pickle. Il est également possible d'utiliser le nombre de clusters comme seuil. Le numéro de cluster de chaque document est stocké dans le groupe.
group = fcluster(z, 0.2, criterion='distance')
print(group)
Recommended Posts