你好,Maarten。
如果我在拟合bertopic模型之后执行model.transform,我会得到负概率。此外,我已经设置了calculate_probabilities=True。不确定这是什么原因?
ncecgwcz1#
很难在没有看到实际代码的情况下做出判断。你能分享你的完整代码吗?另外,你使用的是哪个版本的BERTopic?
iugsix8n2#
你好,Maarten,
我一直在遇到同样的问题。我在一个大数据集(200万段落)上训练了模型,将其分成30万个文档的块,并迭代地合并模型。我还减少了异常值。然后我使用最终模型在整个数据集上获得概率。问题是,我得到了一些严格为负数的结果。
这是代码:
umap_model = UMAP(n_neighbors=10, n_components=5, min_dist=0.0, metric='cosine', random_state=42) hdbscan_model = HDBSCAN(min_cluster_size=150, metric='euclidean', cluster_selection_method='eom', prediction_data=True) vectorizer_model = CountVectorizer(stop_words=stopwords, ngram_range=(1, 2), max_df=0.9, min_df=0.01) ctfidf_model = ClassTfidfTransformer(reduce_frequent_words=True) repr_1 = KeyBERTInspired(top_n_words=30, nr_samples=1000) repr_2 = MaximalMarginalRelevance(diversity=0.4) representation_model = [repr_1, repr_2] doc_chunks = [docs[i:i + 350000] for i in range(0, len(docs), 350000)] embedding_chunks = [embeddings[i:i + 350000] for i in range(0, len(embeddings), 350000)] base_model = BERTopic( n_gram_range=(1, 2), min_topic_size=500, embedding_model=embedding_model, umap_model=umap_model, hdbscan_model=hdbscan_model, vectorizer_model=vectorizer_model, ctfidf_model=ctfidf_model, representation_model=representation_model, # Hyperparameters top_n_words=10, low_memory=True, verbose=True, calculate_probabilities=True).fit(doc_chuncks[0], embedding_chuncks[0]) base_model.get_topic_info() count = 1 for doc_chunk, embedding_chunk in zip(doc_chunks[1:], embedding_chunks[1:]): print(f'Chunk number {count} of {len(doc_chunks)-1}') new_model = BERTopic( n_gram_range=(1, 2), min_topic_size=1500, embedding_model=embedding_model, ctfidf_model=ctfidf_model, umap_model=umap_model, hdbscan_model=hdbscan_model, vectorizer_model=vectorizer_model, representation_model=representation_model, top_n_words=10, low_memory=True, verbose=True, calculate_probabilities=True).fit(doc_chunk, embedding_chunk) updated_model = BERTopic.merge_models([base_model, new_model]) # Update the base model base_model = updated_model count+=1 topics, probabilities = base_model.transform(docs, embeddings) new_topics = base_model.reduce_outliers(docs, topics, probabilities=probabilities, strategy="probabilities") base_model.update_topics(docs, topics=new_topics, vectorizer_model=vectorizer_model) topics, probabilities = base_model.transform(docs, embeddings) base_model.get_topic_info() print(probabilities) array([[ 0.16342095, 0.14167159, 0.05409987, ..., 0.15006552, 0.02297548, 0.04169825], [-0.07031705, -0.11765086, -0.04407407, ..., -0.09452424, -0.04852967, -0.05533055], [-0.09134781, -0.09422061, -0.04908133, ..., -0.08520483, -0.05293087, 0.01167258], ..., [ 0.13605224, 0.0481723 , -0.01568827, ..., 0.04319064, -0.07278067, -0.01057221], [-0.12851533, -0.27406732, -0.10445033, ..., -0.27359323, -0.18899802, -0.1821016 ], [ 0.02763645, 0.0091765 , -0.04612414, ..., 0.01253646, -0.05523241, 0.13492658]])
pzfprimi3#
感谢您分享您的代码。一切看起来都很好。在减少离群值之前运行.transform(docs, embeddings)时,概率是否严格为正?如果是这样的话,我不确定这是否是HDBSCAN的bug或者是它本身的行为方式。
.transform(docs, embeddings)
5kgi1eie4#
非常感谢您的稳定回复!是的,在这种情况下也存在负概率。此外,当我跨列求和时,这些值看起来很奇怪,它应该是1,但这是我得到的结果(在减少离群值之前)。
print(probabilities.sum(axis=1)) array([-3.3041897, 5.7327676, 6.178049 , ..., 9.38357 , 11.760707 , 9.374776 ], dtype=float32)
这是否类似于 issue(尽管上下文不同)?您如何建议处理此类问题?使用软-max是否有意义?请告诉我您的想法。
ars1skjm5#
使用软最大值可能会有价值,看看结果如何。另一个解决方案可能是将模型保存为 pytorch 或 safetensors ,加载它,然后运行 .transform 。它应该使用不同的方法重新计算概率,这可能会有所帮助。另外,你使用的是哪个版本的 BERTopic?
pytorch
safetensors
.transform
ocebsuys6#
我正在使用0.16.0版本。我已经尝试过保存和加载,但问题仍然存在(实际上,这就是我最初发现它的方式)。
2sbarzqh7#
关于概率问题,我在想是否使用概率作为异常值减少策略可能也不是理想的选择,c-TF-IDF可能会更有意义?
jjhzyzn08#
啊,现在我明白了。结果概率是通过主题和文档嵌入之间的余弦相似度生成的,而不是通过HDBSCAN。因此,我认为结果值可能是负数,表示不相似。所以我相信你仍然可以使用离群值减少策略,没有任何问题。
8条答案
按热度按时间ncecgwcz1#
很难在没有看到实际代码的情况下做出判断。你能分享你的完整代码吗?另外,你使用的是哪个版本的BERTopic?
iugsix8n2#
你好,Maarten,
我一直在遇到同样的问题。我在一个大数据集(200万段落)上训练了模型,将其分成30万个文档的块,并迭代地合并模型。我还减少了异常值。然后我使用最终模型在整个数据集上获得概率。问题是,我得到了一些严格为负数的结果。
这是代码:
pzfprimi3#
感谢您分享您的代码。一切看起来都很好。在减少离群值之前运行
.transform(docs, embeddings)
时,概率是否严格为正?如果是这样的话,我不确定这是否是HDBSCAN的bug或者是它本身的行为方式。5kgi1eie4#
非常感谢您的稳定回复!
是的,在这种情况下也存在负概率。此外,当我跨列求和时,这些值看起来很奇怪,它应该是1,但这是我得到的结果(在减少离群值之前)。
这是否类似于 issue(尽管上下文不同)?
您如何建议处理此类问题?使用软-max是否有意义?
请告诉我您的想法。
ars1skjm5#
使用软最大值可能会有价值,看看结果如何。另一个解决方案可能是将模型保存为
pytorch
或safetensors
,加载它,然后运行.transform
。它应该使用不同的方法重新计算概率,这可能会有所帮助。另外,你使用的是哪个版本的 BERTopic?
ocebsuys6#
我正在使用0.16.0版本。我已经尝试过保存和加载,但问题仍然存在(实际上,这就是我最初发现它的方式)。
2sbarzqh7#
关于概率问题,我在想是否使用概率作为异常值减少策略可能也不是理想的选择,c-TF-IDF可能会更有意义?
jjhzyzn08#
啊,现在我明白了。结果概率是通过主题和文档嵌入之间的余弦相似度生成的,而不是通过HDBSCAN。因此,我认为结果值可能是负数,表示不相似。所以我相信你仍然可以使用离群值减少策略,没有任何问题。