我正在尝试使用 text2vec复制 Arora 2017 ( https://github.com/PrincetonML/SIF / https://openreview.net/forum?id=SyK00v5xx )。作者通过平均词嵌入并减去第一个主成分来计算句子嵌入。
感谢 text2vec 的作者,我可以计算手套嵌入并对其进行平均。下一步是计算主成分 /svd 并从嵌入中减去第一个成分。
我可以使用 irlba 包(我相信它也在 tex2vec 中使用)计算 svd,但是接下来我被困在如何准确地从平均词嵌入中减去主成分。
论文中的python代码(https://github.com/PrincetonML/SIF/blob/master/src/SIF_embedding.py)具有以下功能
def remove_pc(X, npc=1):
"""
Remove the projection on the principal components
:param X: X[i,:] is a data point
:param npc: number of principal components to remove
:return: XX[i, :] is the data point after removing its projection
"""
pc = compute_pc(X, npc)
if npc==1:
XX = X - X.dot(pc.transpose()) * pc
else:
XX = X - X.dot(pc.transpose()).dot(pc)
return XX
我的 R 代码是
# get the word vectors
wv_context = glove$components
word_vectors = wv_main + t(wv_context)
# create document term matrix
dtm = create_dtm(it, vectorizer)
# assign the word embeddings
common_terms = intersect(colnames(dtm), rownames(word_vectors) )
# normalise
dtm_averaged <- text2vec::normalize(dtm[, common_terms], "l1")
例如,如果我有 1K 个句子 x 300 个变量,我运行 irlba 函数得到三个矩阵。例如,这些具有 4 个分量 x 1K 观察值。
如何转换此函数的输出(1K x 变量/组件),以便我可以从句子嵌入(1K x 300 变量)中减去组件?
谢谢!