TfidfVectorizer和Word2Verc模型发现的二元图之间不一致



我正在从头开始构建一个主题模型,其中一步使用TfidfVectorizer方法从我的文本语料库中获得unigram和bigram:

tfidf_vectorizer = TfidfVectorizer(min_df=0.1, max_df=0.9, ngram_range = (1,2))

主题创建后,我使用gensim的Word2Vec提供的相似性分数来确定主题的连贯性。我通过在同一语料库上进行训练来做到这一点:

bigram_transformer = Phrases(corpus)
model = Word2Vec(bigram_transformer[corpus], min_count=1)

然而,对于我主题中的许多bigram,我得到了一个KeyError,因为尽管它们是在同一语料库上训练的,但在Word2Vec的训练中没有发现该bigram。我认为这是因为Word2Verc根据统计分析决定选择哪些bigram(为什么不是所有bigram都是在gensim';s的"Phrases"工具中创建的?(

有没有办法让Word2Verc包括TfidfVectorizer识别的所有bigram?我看到了诸如"trim_rule"之类的微调功能,但没有任何其他功能。

Gensim中Phrases模型的要点是选择一些双元图,这些双元图被计算为具有统计学意义。

如果你将该模型的确定作为语料库的预处理步骤,那么在你的文本中,某些unigram对将被组合的bigram完全替换。(因此,一些原本存在的unigram可能不会再出现一次。(

因此,Gensim的PhrasesTfidfVectorizerngram_range设施所使用的bigram的概念是不同的。Phrases用于破坏性替换,其中特定的bigram被推断为比unigram更有趣。TfidfVectorizer将添加额外的二元图作为额外的维度特征。

我想Phrases的正确调整可能会使它认为每个二元图都很重要。如果不进行检查,它看起来像是一个非常小的值,比如0.0000000001,可能会产生本质上的影响。(Phrases类将拒绝0的值,因为其通常使用是无意义的。(

但在这一点上,您稍后的转换(通过bigram_transformer[corpus](将在Word2Vec训练之前组合所有可能的单词对。例如,句子:

['the', 'skittish', 'cat', 'jumped', 'over', 'the', 'gap',]

会不分青红皂白地变成。。。

['the_skittish', 'cat_jumped', 'over_the', 'gap',]

你似乎不太可能想要这样,原因有很多:

  • 然后可能没有单独使用'cat'unigram的训练文本,使您根本没有该单词的单词向量
  • 罕见的或语法价值很小的二元图(如'the_skittish'(将接收经过训练的单词向量,&占用模型中的空间
  • 对于良好的Word2Vec结果来说,足够大的文本语料库可能有比可管理的多得多的bigram。(对于良好的Word2Vec结果来说,一个小到可以跟踪每个二元图的语料库可能很薄。(

此外,为了执行所有二元图的贪婪组合,Phrases频率调查&甚至不需要计算。(无需准备/分析即可自动完成。(

因此,你不应该期望TfidfVectorizer的每个bigram都得到一个词向量,除非你在Phrases的正常行为之外采取一些额外的步骤,以确保每个这样的bigram都在训练文本中。

尝试这样做根本不一定需要Phrases,而且可能无法管理,并涉及其他权衡。(例如,我可以想象多次重复语料库,每次只组合一小部分bigram,这样每个bigram有时被其他unigram包围,有时被其他bigram包围,从而创建一个合成语料库,其中包含足够多的有意义的文本,以创建所有所需的向量。但该模型的逻辑和存储空间会更大、更复杂突出的先例,所以这将是一个新颖的实验。(

最新更新