Otomatik anahtar kelime çıkarma: özellik olarak kosinüs benzerliklerini kullanma


12

Bir belge terimi matris ve şimdi denetimli bir öğrenme yöntemi (SVM, Naive Bayes, ...) ile her belge için anahtar kelimeler ayıklamak istiyorum. Bu modelde, zaten Tf-idf, Pos etiketi, ... kullanıyorumM

Ama şimdi nexts'i merak ediyorum. Terimler arasında kosinüs benzerlikleri olan bir matrisim var .C

Bu benzerlikleri modelim için bir özellik olarak kullanma olasılığı var mı? Benim fikrim terimi içindi belge içinde belge tüm terimlerin kosinüs benzerlikler ortalama kullanımı, terimle . Bu yararlı mı?d d iiddi


Google'da bir arama yaptınız mı? "Kosinüs benzerlik anahtar kelime çıkarımı" altında, sizi
başlatabilecek

Google'da çok arama yaptım ve içinde "kosinüs benzerliği" ve "anahtar kelime çıkarımı" kelimeleri bulunan birçok makale okudum. Ancak, anahtar kelimeleri çıkarmak için kosinüs benzerliği gibi bir şey kullandıkları bir kağıt bulamadım
Silke

Yanıtlar:


12

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.

SpectralClusteringSı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


1
Bu inanılmaz derecede kaliteli bir cevap. Teşekkürler! Scikit'in yakınlık yayılım algoritmasını kelimeleri kümelemek için kullanma hakkında düşünceleriniz var mı? Kosinüs benzerlik değerleri algoritmada önceden hesaplanmış bir afinite matrisi olarak kullanılabilir (benzerliklerin mesafelere değil, gerekli olduğuna inanıyorum).
neelshiv
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.