TfidfVectorizer 和 Word2Vec 模型发现的二元语法不一致

Inconsistencies between bigrams found by TfidfVectorizer and Word2Vec model

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

    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)

然而,对于我的主题中的许多二元组,我得到了一个 KeyError,因为尽管在同一个语料库上训练了该二元组,但在 Word2Vec 的训练中没有选择该二元组。我认为这是因为 Word2Vec 根据统计分析决定选择哪些双字母组 ()

有没有办法让 Word2Vec 包含所有由 TfidfVectorizer 识别的双字母组?我看到诸如 'trim_rule' 之类的修整功能,但在其他方向看不到任何东西。

Gensim 中 Phrases 模型的要点是选择 一些 双字母组,这些双字母组被计算为具有统计显着性。

如果您随后将该模型的确定应用于您的语料库的预处理步骤,则文本中的某些单字母组合将完全替换为组合的双字母组合。 (因此,有可能一些原来存在的 unigrams 将不再出现一次。)

因此,Gensim 的 PhrasesTfidfVectorizerngram_range 工具使用的二元语法概念是不同的。 Phrases 用于破坏性替换,其中推断出特定的双字母组比单字母组更有趣。 TfidfVectorizer 将添加额外的二元组作为额外的维度特征。

我想 Phrases 的正确调整可能会导致它认为每个二元组都是重要的。未经检查,它看起来像一个超小值,如 0.0000000001,可能本质上具有这种效果。 (Phrases class 将拒绝 0 的值,因为它的通常用法是无意义的。)

但在那个时候,您稍后的转换(通过 bigram_transformer[corpus])将在 Word2Vec 训练之前组合所有可能的单词对。比如句子:

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

...会胡乱变成...

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

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

  • 然后可能没有单独使用 'cat' unigram 的训练文本,让您根本没有该词的词向量。
  • 罕见或语法价值很小的双字母组(如 'the_skittish')将接受经过训练的词向量,并在模型中占据 space。
  • 足以获得良好 Word2Vec 结果的文本语料库种类可能包含比可管理的更多的二元语法。 (一个足够小的语料库,你可以负担得起跟踪每个二元组,但为了获得好的 Word2Vec 结果,可能会比较薄弱。)

此外,要执行 所有 双字母组的贪婪组合,甚至不需要 Phrases 频率调查和计算。 (不用preparation/analysis即可自动完成。)

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

尝试这样做根本不需要 Phrases,而且可能难以管理,并且涉及其他权衡。 (例如,我可以想象多次重复语料库,每次只组合一小部分双字母组——这样每个双字母组有时被其他单字母组包围,有时被其他双字母组包围——以创建一个具有足够有意义文本的合成语料库来创建所有你想要的向量。但是该模型的逻辑和存储 space 会更大更复杂,而且没有明显的先例,所以这将是一个新颖的实验。)