Estrazione automatica delle parole chiave: utilizzo delle somiglianze del coseno come funzionalità


12

Ho una matrice di documenti e ora vorrei estrarre parole chiave per ogni documento con un metodo di apprendimento supervisionato (SVM, Naive Bayes, ...). In questo modello, utilizzo già Tf-idf, tag Pos, ...M

Ma ora mi chiedo dei prossimi. Ho una matrice con le somiglianze del coseno tra i termini.C

Esiste la possibilità di utilizzare queste somiglianze come funzionalità per il mio modello? La mia idea era per il termine nel documento , di usare la media delle somiglianze del coseno di tutti i termini nel documento con il termine . È utile?ioddio


Hai fatto una ricerca su Google? Ho trovato molti successi in "Estrazione di parole chiave di somiglianza del coseno" che sembrano
poterti

Ho cercato molto su Google e ho letto molti articoli con le parole "somiglianza del coseno" e "estrazione di parole chiave" in esso. Ma non ho trovato un documento in cui usano qualcosa come la somiglianza del coseno come caratteristica per estrarre parole chiave
Silke,

Risposte:


11

Non so come sia possibile eseguire l'estrazione di parole chiave con l'apprendimento supervisionato, ma so come farlo con l'apprendimento non supervisionato.

Esistono diversi metodi per farlo, quindi eccoli:

Hierarchical

È possibile applicare direttamente qualsiasi metodo di clustering gerarchico sul termine matrice di somiglianza (con qualsiasi funzione di somiglianza, non solo coseno)

In scikit-learn faresti qualcosa del genere:

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_

Fonte: [1]

Ma dal momento che è un cluster agglomerato, è computazionalmente costoso e ci vorrà del tempo per calcolare.

K-Means

Un'altra possibilità è quella di fare i soliti k-media sulle righe della matrice dei termini-documento, e quindi trovare i termini più comuni per ogni centroide

Ad esempio, in Scikit impara che questo è il modo di farlo:

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='')

Fonte: [2]

Ma k-mean si basa sulla distanza euclidea, che è un male per i dati sparsi ad alta dimensione. Esistono altre tecniche che funzionano meglio per i testi e usano la somiglianza del coseno

Coseno K: mezzi e dispersione / raccolta

È possibile utilizzare il coseno con K- medie (vedere ad esempio [3] ): calcolare i centroidi come media su tutti i documenti in ciascun cluster, quindi utilizzare il coseno per calcolare la distanza dal centroide più vicino.

Alla fine, puoi estrarre le parole chiave nello stesso modo dei soliti k-medie.

Il calcolo del centroide medio come media di tutti i documenti nel cluster non è sempre buono. Un altro approccio è suggerito dall'algoritmo Scatter / Gather [4] : il centroide di un cluster è la concatenazione di tutti i documenti in questo cluster.

Per questo approccio dovrai solo prendere i termini più frequenti per ciascun cluster centroide.

Non esiste un'implementazione di questi algoritmi in scikit learn, ma puoi facilmente implementarli da solo estendendoli KMeans.

Si noti che in entrambi i casi i centroidi diventano piuttosto densi: più densi del resto dei documenti in ciascun cluster, quindi è possibile che si desideri troncare i termini nei centroidi, vale a dire rimuovere quelli "non importanti". (vedi [8]).

Clustering spettrale

Un altro modo sarebbe applicare il clustering spettrale. Dovrai fornire una matrice di somiglianza, che hai già, e troverà cluster su di essa.

È implementato nella SpectralClusteringclasse, vedi esempi in [5] . Si noti che poiché si dispone già di una matrice pre-calcolata, è necessario utilizzare l' affinity='precumputed'attributo durante l'inizializzazione.

Il clustering spettrale è correlato ai KMean del kernel: esiste un documento (vedi [7]) che mostra che sono la stessa cosa. Di recente mi sono imbattuto in un'implementazione di KMean del kernel che potrebbe essere utile: https://gist.github.com/mblondel/6230787

Fattorizzazione a matrice non negativa

Infine, puoi raggruppare la tua matrice documento-termine con alcune tecniche di decomposizione dell'algebra lineare, come SVD (questa sarebbe la cosiddetta "analisi semantica latente") o la fattorizzazione a matrice non negativa. Quest'ultimo può essere visto come un raggruppamento e può raggruppare contemporaneamente sia le righe che le colonne della matrice.

Ad esempio, puoi estrarre le parole chiave facendo

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()

Fonte del codice: [6]

Anche se qui gli esempi sono in Python Scikit-Learn, penso che non dovrebbe essere un grosso problema trovare alcuni esempi per R

fonti


Questa è una risposta incredibilmente di alta qualità. Grazie! Hai qualche idea sull'uso dell'algoritmo di propagazione dell'affinità di Scikit per raggruppare le parole? I valori di somiglianza del coseno possono essere usati (credo che sarebbero necessarie le somiglianze, non le distanze) come matrice di affinità pre-calcolata nell'algoritmo.
Neelshiv,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.