Denetimli öğrenme ile anahtar kelime çıkarmanın nasıl mümkün olduğunu bilmiyorum, ancak denetimsiz öğrenme ile nasıl yapılacağını biliyorum.
Bunu yapmanın birkaç yöntemi vardır, işte buradalar:
Hiyerarşik
Benzerlik terimi matrisine herhangi bir hiyerarşik kümeleme yöntemini doğrudan uygulayabilirsiniz (yalnızca kosinüs ile değil, herhangi bir benzerlik işleviyle)
Scikit-learn'da şöyle bir şey yapardınız:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.cluster import AgglomerativeClustering
vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(data)
C = 1 - cosine_similarity(X.T)
ward = AgglomerativeClustering(n_clusters=k, linkage='ward').fit(C)
label = ward.labels_
Kaynak: [1]
Ancak aglomerasyon kümelemesi, hesaplama açısından pahalıdır ve hesaplanması biraz zaman alacaktır.
K-Means
Başka bir olasılık, terim-belge matrisinin satırlarında normal k-araçlarını yapmak ve daha sonra her bir sentroid için en yaygın terimleri bulmaktır
Örneğin, scikit'te bunu yapmanın yolu budur:
from sklearn.cluster import KMeans
km = KMeans(n_clusters=k, init='k-means++', max_iter=100, n_init=1)
km.fit(X)
order_centroids = km.cluster_centers_.argsort()[:, ::-1]
terms = vectorizer.get_feature_names()
for i in range(k):
print("Cluster %d:" % i, end='')
for ind in order_centroids[i, :10]:
print(' %s' % terms[ind], end='')
Kaynak: [2]
Ancak k-means seyrek yüksek boyutlu veriler için kötü olan Öklid mesafesine dayanır. Metinler için daha iyi çalışan ve kosinüs benzerliği kullanan başka teknikler de var
Kosinüs K-Ortalamalar ve Saçılma / Toplama
Kosinayı K-araçlarıyla kullanmak mümkündür (bkz. Örneğin [3] ): her kümedeki tüm belgeler üzerinde centroidleri ortalama olarak hesaplayın ve daha sonra en yakın sentroide olan mesafeyi hesaplamak için kosinüsü kullanın.
Sonunda, anahtar kelimeleri her zamanki k araçlarıyla aynı şekilde ayıklayabilirsiniz.
Kümedeki tüm belgelerin ortalaması olarak ortalama centroidi hesaplamak her zaman iyi değildir. Scatter / Gather algoritmasında [4] başka bir yaklaşım önerilmektedir : bir kümenin sentroidi, bu kümedeki tüm belgelerin birleştirilmesidir.
Bu yaklaşım için sadece her bir sentroid kümesi için en sık kullanılan terimleri almanız gerekir.
Scikit öğrenmesinde bu algoritmaların hiçbir uygulaması yoktur, ancak genişleterek bunları kendiniz kolayca uygulayabilirsiniz KMeans
.
Her kümeler halinde belgelerin kalanından daha yoğun, sen isteyebilirsiniz: her iki durumda da sentroidler oldukça yoğun hale geldiğini hatırlatırız kesmek yani centroids terimleri "önemsiz" olanları kaldırın. (bakınız [8]).
Spektral Kümeleme
Başka bir yol da spektral kümelemeyi uygulamak olabilir. Zaten sahip olduğunuz bir benzerlik matrisini sağlamanız gerekecek ve üzerinde kümeler bulacaktır.
SpectralClustering
Sınıfta uygulanmaktadır , bkz. [5] . Önceden hesaplanmış bir matrisiniz affinity='precumputed'
olduğundan, başlatma sırasında öznitelik kullanmanız gerektiğini unutmayın.
Spektral kümeleme Çekirdek KM ile ilgilidir: aynı şeyleri gösteren kağıt (bkz. [7]). Kısa süre önce, yararlı olabilecek bir Çekirdek KMean uygulamasına rastladım: https://gist.github.com/mblondel/6230787
Negatif Olmayan Matris Çarpanlarına Ayırma
Son olarak, vadeli belge matrisinizi SVD (buna "Latent Semantic Analysis" olarak adlandırılır) veya Negatif Olmayan Matris Faktorizasyonu gibi Doğrusal Cebir'den bazı ayrıştırma teknikleriyle kümeleyebilirsiniz. İkincisi kümeleme olarak görülebilir ve matrisin hem satırlarını hem de sütunlarını aynı anda kümeleyebilir.
Örneğin, yaparak anahtar kelimeleri çıkarabilirsiniz.
from sklearn.decomposition import NMF
nmf = NMF(n_components=k, random_state=1).fit(X)
feature_names = vectorizer.get_feature_names()
for topic_idx, topic in enumerate(nmf.components_):
print("Topic #%d:" % topic_idx)
print(" ".join([feature_names[i]
for i in topic.argsort()[:-10-1:-1]]))
print()
Kod kaynağı: [6]
Burada örnekler python scikit-learn'da olsa da, R için bazı örnekler bulmak büyük bir sorun olmamalı.
Kaynaklar