2017-02-02 5 views
0

Ich habe text2vec verwendet, um benutzerdefinierte Worteinbettungen aus einem Korpus proprietärer Textdaten zu generieren, die eine Menge branchenspezifischer Fachausdrücke enthalten (daher funktionieren Einbettungen wie die von Google verfügbaren nicht). Die Analogien funktionieren großartig, aber ich habe Schwierigkeiten, die Einbettungen anzuwenden, um neue Daten zu bewerten. Ich möchte die Einbettungen verwenden, die ich bereits trainiert habe, um Beziehungen in neuen Daten zu verstehen. Der Ansatz, den ich benutze (unten beschrieben), scheint verschlungen zu sein, und es ist schmerzhaft langsam. Gibt es einen besseren Ansatz? Vielleicht schon etwas eingebaut in das Paket, das ich einfach verpasst habe?Text2vec-Einbettungen auf neue Daten anwenden

Hier ist mein Ansatz (mit dem am nächsten, was zu reproduzierbaren Code bot ich gegeben erzeugen kann, dass ich eine proprietäre Datenquelle bin mit):

d = Liste mit neuen Daten. jedes Element ist der Klassencharakters

VEC = das Wort Vektorisierungen erhielt Form text2vec Implementierung des Handschuhs

new_vecs <- sapply(d, function(y){    
        it <- itoken(word_tokenizer(y), progressbar=FALSE) # for each statement, create an iterator punctuation 
        voc <- create_vocabulary(it, stopwords= tm::stopwords()) # for each document, create a vocab 
        vecs[rownames(vecs) %in% voc$vocab$terms, , drop=FALSE] %>% # subset vecs for the words in the new document, then 
        colMeans # find the average vector for each document 
        }) %>% t # close y function and sapply, then transpose to return matrix w/ one row for each statement 

Für meinen Anwendungsfall, ich brauche die Ergebnisse für jedes Dokument getrennt zu halten, so alles, was beinhaltet pasting- zusammen werden die elemente von d nicht funktionieren, aber sicherlich muss es einen besseren weg geben als das, was ich zusammengeschustert habe. Ich habe das Gefühl, dass ich etwas ziemlich Offensichtliches vermissen muss.

Jede Hilfe wird sehr geschätzt.

Antwort

2

Sie müssen es in einem "Batch" -Modus unter Verwendung effizienter linearer Algebra-Matrix-Operationen durchführen. Die Idee ist eine Dokument-Term-Matrix für Dokumente d. Diese Matrix enthält Informationen darüber, wie oft jedes Wort in jedem Dokument erscheint. Dann multiplizieren Sie einfach dtm mit Matrix der Einbettungen:

library(text2vec) 
# we are interested in words which are in word embeddings 
voc = create_vocabulary(rownames(vecs)) 
# now we will create document-term matrix 
vectorizer = vocab_vectorizer(voc) 
dtm = itoken(d, tokenizer = word_tokenizer) %>% 
    create_dtm(vectorizer) 

# normalize - calculate term frequaency - i.e. divide count of each word 
# in document by total number of words in document. 
# So at the end we will receive average of word vectors (not sum of word vectors!) 
dtm = normalize(dtm) 
# and now we can calculate vectors for document (average of vecors of words) 
# using dot product of dtm and embeddings matrix 
document_vecs = dtm %*% vecs