2016-02-22 16 views
8

Sto cercando un modulo in sklearn che ti permetta di ricavare la matrice di co-ocurrence parola-parola. Posso ottenere la matrice del termine del documento ma non sono sicuro di come ottenere una matrice parola-parola di co-occorrenze.matrice di co-occorrenza parola-parola

+0

Potresti aggiungere alcuni dati e i tuoi tentativi di affrontare il problema? – Cleb

risposta

1

È possibile utilizzare il parametro ngram_range nell'esempio CountVectorizer o TfidfVectorizer

Codice:

bigram_vectorizer = CountVectorizer(ngram_range=(2, 2)) # by saying 2,2 you are telling you only want pairs of 2 words 

Nel caso in cui si vuole dire esplicitamente quali co-occorrenze di parole che si desidera contare, utilizzare il vocabulary param, vale a dire: vocabulary = {'awesome unicorns':0, 'batman forever':1}

http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html

Codice auto-esplicativo e pronto all'uso con co-occorrenze di parola-parola predefinite. In questo caso siamo di inseguimento per co-occorrenze di awesome unicorns e batman forever:

from sklearn.feature_extraction.text import CountVectorizer 
import numpy as np 
samples = ['awesome unicorns are awesome','batman forever and ever','I love batman forever'] 
bigram_vectorizer = CountVectorizer(ngram_range=(1, 2), vocabulary = {'awesome unicorns':0, 'batman forever':1}) 
co_occurrences = bigram_vectorizer.fit_transform(samples) 
print 'Printing sparse matrix:', co_occurrences 
print 'Printing dense matrix (cols are vocabulary keys 0-> "awesome unicorns", 1-> "batman forever")', co_occurrences.todense() 
sum_occ = np.sum(co_occurrences.todense(),axis=0) 
print 'Sum of word-word occurrences:', sum_occ 
print 'Pretty printig of co_occurrences count:', zip(bigram_vectorizer.get_feature_names(),np.array(sum_occ)[0].tolist()) 

uscita finale è ('awesome unicorns', 1), ('batman forever', 2), che corrisponde esattamente alle nostre samples dati forniti.

11

Ecco la mia soluzione di esempio utilizzando CountVectorizer in scikit-learn. E facendo riferimento a questo post, puoi semplicemente utilizzare la moltiplicazione della matrice per ottenere la matrice di co-occorrenza parola-parola.

from sklearn.feature_extraction.text import CountVectorizer 
docs = ['this this this book', 
     'this cat good', 
     'cat good shit'] 
count_model = CountVectorizer(ngram_range=(1,1)) # default unigram model 
X = count_model.fit_transform(docs) 
Xc = (X.T * X) # this is co-occurrence matrix in sparse csr format 
Xc.setdiag(0) # sometimes you want to fill same word cooccurence to 0 
print(Xc.todense()) # print out matrix in dense format 

È inoltre possibile fare riferimento al dizionario di parole in count_model,

count_model.vocabulary_ 

Oppure, se si vuole normalizzare per componente diagonale (consultare la risposta nel post precedente).

import scipy.sparse as sp 
Xc = (X.T * X) 
g = sp.diags(1./Xc.diagonal()) 
Xc_norm = g * XC# normalized co-occurence matrix