是否有一种方法可以使用sklearn TF-IDF模型来解决单词类比?



我使用Python的sklearn库使用我自己的数据集拟合了TF-IDF模型:

tfidf_featuriser = sklearn.feature_extraction.text.TfidfVectorizer(stop_words=None)
tfidf_featuriser.fit(documents)
tfidf_docterm_matrix = tfidf_featuriser.transform(documents)

我正在尝试解决单词类比(man::king as woman::queen),因为这可能与gensim的Word2Vec模型有关。到目前为止,我已经尝试了以下操作:

vec1 = tfidf_docterm_matrix.transpose()[tfidf_featuriser.vocabulary_['man'], :]
vec2 = tfidf_docterm_matrix.transpose()[tfidf_featuriser.vocabulary_['woman'], :]
vec3 = tfidf_docterm_matrix.transpose()[tfidf_featuriser.vocabulary_['king'], :]
vec4 = vec2 + vec3 - vec1

我如何检索与vec4相似的向量,希望其中一个词向量是"皇后"?

tf-idf并不[试图]捕获单个单词的语义信息——它是一个纯粹基于频率的模型。因此,你不应该期望看到整齐的单词类比出现(想想看,为什么"man","woman","king"one_answers"queen"的相对频率会如此整齐地相关)。

在Word2Vec模型中,我们有女王~=国王+女人-男人的词类比出现,部分原因是我们用n维向量表示,(希望)编码每个词的语义。

另一方面,在tf-idf矩阵中,我们的词向量的每个元素仅表示其在特定文档中的频率的函数,因此您所放置的约束不仅是这些词的相对频率是强相关的,而且这种情况发生在单个文档的级别上,这对只计算词频率的模型来说是一个很大的要求。

如果你想了解为什么单词类比会出现在Word2Vec这样的单词嵌入模型中,我建议你看看这篇论文和相关的演讲。

最新更新