【BERTopic应用 03/3】:微调参数

一、说明

        一般来说,BERTopic 在开箱即用的模型中工作得很好。但是,当您有数百万个数据要处理时,使用基本模型处理数据可能需要一些时间。在这篇文章中,我将向您展示如何微调BERTopic中的一些参数并比较它们的结果。让我们潜入。

二、BERTopic 基本型号

        我们首先检查类 BERTopic 中有哪些参数。有关详细检查,请查看此处的文件:BERTopic。在官方文档中,对每个参数及其默认值都有说明。在这里,我想挑一些参数来提及,因为这些参数在表示文档中的主题方面起着关键作用。

class BERTopic:
    def __init__(self,
                 language: str = "english",
                 top_n_words: int = 10,
                 n_gram_range: Tuple[int, int] = (1, 1),
                 min_topic_size: int = 10,
                 nr_topics: Union[int, str] = None,
                 low_memory: bool = False,
                 calculate_probabilities: bool = False,
                 seed_topic_list: List[List[str]] = None,
                 embedding_model=None,
                 umap_model: UMAP = None,
                 hdbscan_model: hdbscan.HDBSCAN = None,
                 vectorizer_model: CountVectorizer = None,
                 ctfidf_model: TfidfTransformer = None,
                 representation_model: BaseRepresentation = None,
                 verbose: bool = False,
                 )
    self.XXX
    self.XXX
    ...
    ...
  • n_gram_range:默认为(1,1),即分别产生“新”和“约克”等主题词。如果要显示“纽约”,可以将此参数发送到 (1,2)。
  • umap_model:UMAP(均匀流形近似和投影)是一种降维算法,通常用于高维数据的可视化。它的工作原理是查找保留原始高维空间结构的数据的低维表示形式。
  • hdbscan_model:HDBSCAN(基于分层密度的带噪声应用程序空间聚类)是一种基于密度的聚类算法,可以识别数据集中任意形状和大小的聚类。它的工作原理是在数据中查找高密度区域并将其扩展为集群,同时还识别不属于任何集群的噪声点。

三、微调参数

我们已经了解了参数是什么以及它们的实际作用。现在,让我们对它们进行微调,并将结果与开箱即用的模型进行比较。同样,我们将使用我们之前准备的卡塔尔世界杯数据。如果您还没有下载 umap 和 hbdscan,请 pip 安装。

# Base Model

import pandas as pd
import pickle
with open('world_cup_tweets.pkl', 'rb') as f:
    data = pickle.load(f)

data = data.Tweet_processed.to_list()

from bertopic import BERTopic
model_B = BERTopic(language="english", calculate_probabilities=True, verbose=True)
topics_B, probs_B = topic_model.fit_transform(data)
# Fine-tuned Model

import pandas as pd
import pickle
with open('world_cup_tweets.pkl', 'rb') as f:
    data = pickle.load(f)

data = data.Tweet_processed.to_list()

from umap import UMAP
from hdbscan import HDBSCAN

umap_model = UMAP(n_neighbors=3, n_components=3, min_dist=0.05)
hdbscan_model = HDBSCAN(min_cluster_size=80, min_samples=40,
                        gen_min_span_tree=True,
                        prediction_data=True)
from bertopic import BERTopic

model_A = BERTopic(
    umap_model=umap_model,
    hdbscan_model=hdbscan_model,
    top_n_words=10,
    language='english',
    calculate_probabilities=True,
    verbose=True,
    n_gram_range=(1, 2)
)
topics_A, probs_A = model.fit_transform(data)

UMAP:

  • n_neighbors=3:此参数确定 UMAP 用于近似数据局部结构的最近邻数。在这种情况下,UMAP将在构造嵌入时查看每个数据点的三个最近邻。
  • n_components=3:指定嵌入空间中的维数。默认情况下,UMAP 会将数据的维数减少到 2 维,但在这种情况下,它会将其减少到 3 维。
  • min_dist=0.05:此参数控制嵌入空间中点之间的最小距离。较高的min_dist值将导致点之间的空间越大,这可以改善聚类的分离。

HDBSCAN:

  • min_cluster_size=80:此参数指定形成聚类所需的最小点数。点少于此阈值的聚类将被标记为噪声。
  • min_samples=40:此参数确定将点视为核心点所需的邻域样本数。核心点用于构建聚类,非核心点的点被归类为噪声。
  • gen_min_span_tree=True:此参数告诉 HDBSCAN 在聚类之前构造输入数据的最小生成树。这有助于识别仅由几个点连接的聚类,其他聚类算法可能会遗漏这些点。
  • prediction_data=True:此参数指示 HDBSCAN 存储有关数据的其他信息,例如每个群集中每个点的成员资格概率。此信息可用于下游分析和可视化。

四、比较结果

        基本型号:

作者创建的基本模型

微调模型:

作者创建的微调模型

        显然,在基本模型中生成了更多主题,这解释了处理大量文本需要很长时间的事实。同时,在微调模型中,根据参数中的设置创建的主题较少。

        对于那些对结果如何随参数设置的不同组合而变化感兴趣的人。我将示例代码放在这里,您可以更改参数以检查不同的结果。

from bertopic import BERTopic
from umap import UMAP
from hdbscan import HDBSCAN

# Define a list of parameters to try for UMAP
umap_params = [
    {'n_neighbors': 15, 'n_components': 2, 'min_dist': 0.1},
    {'n_neighbors': 10, 'n_components': 2, 'min_dist': 0.01},
    {'n_neighbors': 3, 'n_components': 2, 'min_dist': 0.001}
]

# Define a list of parameters to try for HDBSCAN
hdbscan_params = [
    {'min_cluster_size': 100, 'min_samples': 100},
    {'min_cluster_size': 50, 'min_samples': 70},
    {'min_cluster_size': 5, 'min_samples': 50}
]

# Loop over the parameter combinations and fit BERTopic models
for umap_param in umap_params:
    for hdbscan_param in hdbscan_params:
        # Create UMAP and HDBSCAN models with the current parameter combination
        umap_model = UMAP(**umap_param)
        hdbscan_model = HDBSCAN(**hdbscan_param, gen_min_span_tree=True, prediction_data=True)

        # Fit a BERTopic model with the current parameter combination
        model = BERTopic(
            umap_model=umap_model,
            hdbscan_model=hdbscan_model,
            top_n_words=10,
            language='english',
            calculate_probabilities=True,
            verbose=True,
            n_gram_range=(1, 2)
        )
        topics, probs = model.fit_transform(data)

        # Visualize the hierarchy and save the figure to an HTML file
        fig = model.visualize_hierarchy()
        fig.write_html(f'model_umap_{umap_param}_hdbscan_{hdbscan_param}.html')

五、后记

关于BertTopic的应用知识点还很多,我们将在另外的文章中,逐步介绍之。谢谢阅读!

猜你喜欢

转载自blog.csdn.net/gongdiwudu/article/details/132287079