【问题标题】:Gensim ensemblelda multiprocessing: index -1 is out of bounds for axis 0 with size 0Gensim ensemblda multiprocessing:索引 -1 超出尺寸为 0 的轴 0 的范围
【发布时间】:2023-01-12 12:09:27
【问题描述】:

我正在使用 gensim library 进行主题建模,更准确地说是 Ensemble LDA 方法。我的代码相当标准(我遵循文档),主要部分是:

           model = models.EnsembleLda(corpus=corpus,
                                   id2word=id2word,
                                   num_topics=ntopics,
                                   passes=2,
                                   iterations = 200,
                                   num_models=ncores,
                                   topic_model_class=models.LdaModel,
                                   ensemble_workers=nworkers,
                                   distance_workers=ncores)

(完整代码在https://github.com/erwanm/gensim-temporary/blob/main/gensim-topics.py

但是根据我的数据,我有时得到下面的错误。但是它也常常对一部分数据运行正确,所以我不知道问题是否与我的数据有关?

Process Process-52:
Traceback (most recent call last):
  File "/home/moreaue/anaconda3/envs/twarc2/lib/python3.10/multiprocessing/process.py", line 314, in _bootstrap
    self.run()
  File "/home/moreaue/anaconda3/envs/twarc2/lib/python3.10/multiprocessing/process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "/home/moreaue/anaconda3/envs/twarc2/lib/python3.10/site-packages/gensim/models/ensemblelda.py", line 534, in _asymmetric_distance_matrix_worker
    distance_chunk = _calculate_asymmetric_distance_matrix_chunk(
  File "/home/moreaue/anaconda3/envs/twarc2/lib/python3.10/site-packages/gensim/models/ensemblelda.py", line 491, in _calculate_asymmetric_distance_matrix_chunk
    mask = masking_method(ttd1, masking_threshold)
  File "/home/moreaue/anaconda3/envs/twarc2/lib/python3.10/site-packages/gensim/models/ensemblelda.py", line 265, in mass_masking
    smallest_valid = sorted_a[largest_mass][-1]
IndexError: index -1 is out of bounds for axis 0 with size 0

该错误似乎与多处理有关,因为 ensemblelda 运行多个线程(每个线程运行一个 LDA 实例)。

什么会导致此错误?关于如何解决它的任何建议?

【问题讨论】:

    标签: python nlp multiprocessing gensim


    【解决方案1】:

    通过阅读源代码,mass_masking 函数只是返回一个布尔数组(二进制掩码),其位置对应于 a 的元素:其中 a 的那些元素,如果你有对它们进行累积求和,将保持在 threshold 集以下(默认值为 0.95)。

    sorted_a[largest_mask][-1] 行引起了问题,因为在 mass_masking 函数中没有任何检查来确保 a 的最大元素低于阈值,它的前身 ttd1 也是如此。每当 ttd1a 的最大值等于或高于阈值时,就会引发 IndexError,因为 sorted_a[largest_mass] 返回一个空数组,然后尝试由 @987654336 对其进行索引@.下面的最小示例展示了这个问题。

    ttd1 是在 _calculate_asymmetric_distance_matrix_chunk() 函数中创建的,它枚举了 ttda1。它调用masking_method(ttd1, masking_threshold),随后调用mass_masking,它在EnsembleLda类初始化时被设置为默认方法。我怀疑这是多处理期间普遍存在的错误,因为 _calculate_assymetric_distance_matrix_multiproc() 函数实例化 Process 并将 target 设置为 _asymmetric_distance_matrix_worker() 函数,而这个 worker 函数将 entire_ttda 切片以创建 @987654346 @ 它传递给 chunk 函数,但同样,没有检查以确保它没有创建其元素之一等于或大于 threshold 的切片。

    这是 mass_making 应该如何运作的最小工作示例:

    import numpy as np
    
    
    def mass_masking(a, threshold=None):
        """Original masking method. Returns a new binary mask."""
        if threshold is None:
            threshold = 0.95
    
        sorted_a = np.sort(a)[::-1]  # [0.5   0.449 0.2   0.1  ]
        # sorted_a.cumsum() outputs [0.5   0.949 1.149 1.249] then threshold is taken
        largest_mass = sorted_a.cumsum() < threshold  # [ True  True False False]
        # sorted_a[largest_mass] outputs [0.5   0.449] then last element is taken
        smallest_valid = sorted_a[largest_mass][-1]  # 0.449
        return a >= smallest_valid # [ True False False  True]
    
    
    test_arr = np.array([0.5, 0.2, 0.1, 0.449])
    print(mass_masking(test_arr))
    # Output: [ True False False  True]
    

    a的最大元素大于或等于0.95时,引发IndexError

    import numpy as np
    
    
    def mass_masking(a, threshold=None):
        """Original masking method. Returns a new binary mask."""
        if threshold is None:
            threshold = 0.95
    
        sorted_a = np.sort(a)[::-1]  # [0.96  0.5   0.449 0.2  ]
        # sorted_a.cumsum() outputs [0.96  1.46  1.909 2.109] then threshold is taken
        largest_mass = sorted_a.cumsum() < threshold  # [False False False False]
        # sorted_a[largest_mass] outputs [] then last element is taken
        smallest_valid = sorted_a[largest_mass][-1]  # IndexError
        return a >= smallest_valid # function fails to return binary mask
    
    
    test_arr = np.array([0.5, 0.2, 0.96, 0.449])
    print(mass_masking(test_arr))
    # Output: IndexError: index -1 is out of bounds for axis 0 with size 0
    

    了解这一点,并假设我没有误解整组 calculate_asymmetric_distance_matrix 函数在多处理期间的工作方式,您可以尝试确保自己没有任何值大于或等于默认阈值,或者设置 masking_threshold初始化 EnsembleLda 时更高。

    【讨论】:

      猜你喜欢
      • 2021-07-15
      • 1970-01-01
      • 2015-10-13
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      相关资源
      最近更新 更多