我正在从头开始构建一个主题模型,其中一步使用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的Phrases
和TfidfVectorizer
的ngram_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包围,从而创建一个合成语料库,其中包含足够多的有意义的文本,以创建所有所需的向量。但该模型的逻辑和存储空间会更大、更复杂突出的先例,所以这将是一个新颖的实验。(