2017-02-02 6 views
0

Я использовал text2vec для генерации пользовательских вложений слов из совокупности собственных текстовых данных, содержащих множество отраслевых жаргонов (таким образом, запатентованные вложения, подобные тем, которые доступны из Google, не будут работать). Аналогии отлично работают, но мне сложно применить вложения для оценки новых данных. Я хочу использовать вложения, которые я уже тренировал, чтобы понимать отношения в новых данных. подход, который я использую (описанный ниже), кажется запутанным, и это очень медленно. Есть ли лучший подход? Возможно, что-то уже встроено в пакет, который я просто пропустил?Применение вложений text2vec к новым данным

Вот мой подход (предлагается с ближе всего к воспроизводимым коду я могу генерировать, учитывая, что я использую собственный источник данных):

d = список, содержащий новые данные. каждый элемент имеет классовый характер

ЗВТ = реализация этого слова vectorizations получена из text2vec о перчатке

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 

Для моего случая использования, мне нужно, чтобы сохранить результаты отдельно для каждого документа, так что все, что включает в себя pasting- вместе элементы d не будут работать, но, безусловно, должен быть лучший способ, чем то, что я собрал вместе. Я чувствую, что я должен упустить что-то довольно очевидное.

Любая помощь будет принята с благодарностью.

ответ

2

Вам нужно сделать это в режиме «партии», используя эффективные операции с матрицей линейной алгебры. Идея состоит в том, чтобы иметь документальную матрицу для документов d. Эта матрица будет содержать информацию о том, сколько раз каждое слово появляется в каждом документе. Затем нужно просто умножить dtm на матрицу вложений:

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