Bertopic с встраиванием: не удается использовать find_topic

Вопрос или проблема

Я успешно использовал BERTopic для следующих задач: получение тем, визуализация (тем, столбчатых диаграмм, документов …) и DTM (расширенный для получения графика области с существенным успехом).

Тем не менее, я не могу использовать функцию find_topics().

(Есть еще несколько задач, с которыми я испытываю трудности, и я опубликую их как новые вопросы, чтобы не смешивать это с данной).

Я получаю сообщение об ошибке, указывающее на то, что я использую встраивание (что верно).

# Подготовка встраиваний с использованием стандартного 'встраивания предложений'
sentence_model = SentenceTransformer("all-MiniLM-L6-v2")
embeddings = sentence_model.encode(docs_bert, show_progress_bar=True)

Попытавшись это решить, я попробовал создать новую модель без встраивания.

model_ngram_embed2 = BERTopic(embedding_model=embeddings)

Но это выдало ошибку:

ValueError: Истинное значение массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all()

Мне нужно создать экземпляр перед тем, как я смогу применить fit_transform к моей документной базе (текстовому корпусу), после чего я смогу использовать find_topics().
Как мне это сделать? Что нужно сделать?

Что касается find_topics(), я читал о возможности предварительно вычисленных встраиваний в bertopic.find_topics() проблемы.
Примечание: Python 3.8.8 | IPython 7.31.1 | BERTopic 0.11.0

Чтобы решить это, я сделал следующее.
Во-первых, я обновил BERTopic до версии 0.12.0. Это не решило проблему само по себе.
Что работает, так это исключение seed_topics: то есть не использование полупринадлежного режима.

%%time
## создание экземпляра BERTopic с биграммой
model_ngram_noembed2 = BERTopic(top_n_words=10, min_topic_size=5, n_gram_range=(1,2), nr_topics=41, verbose=True)  
                     #, embedding_model=embeddings, seed_topic_list=seed_topic_list)

## Обучить модели на документе с встраиванием, сгенерировать темы и вернуть документы с темами
topics_bert_noembed2, probs_noembed2 = model_ngram_noembed2.fit_transform(docs_bert_dtm)

Для полноты остальное:

## Объяснить 'define' в рамках модели тем
keyterm_explore="define"

#pd_keyterm_explore = pd.DataFrame(topics_bert.find_topics(keyterm_explore,))
'''
Исключение: Этот метод можно использовать только в том случае, если вы не использовали пользовательские встраивания.'''

pd_keyterm_explore = pd.DataFrame(model_ngram_noembed2.find_topics(keyterm_explore), 
             columns=model_ngram_noembed2.find_topics(keyterm_explore)[0],
            dtype="float").round(decimals=2)

print(f'Исследуем {keyterm_explore}: \n{pd_keyterm_explore}')
    [out]
    Исследуем define: 
        21     12     19    7     3 
    0  21.00  12.00  19.00  7.00  3.00
    1   0.37   0.36   0.34  0.32  0.32

Ответ или решение

Решение проблемы с использованием find_topics() в BERTopic при использовании встраиваний

Проблема, с которой вы столкнулись при использовании функции find_topics() в BERTopic, связана с тем, что вы пытаетесь использовать встраивания (embeddings) при инициализации модели, что не поддерживается в этой функции. Позволите себе объяснить, как правильно настроить модель и использовать эти функции, избегая ошибок.

Шаг 1: Понимание проблемы

При вызове find_topics() вы получили сообщение об ошибке, указывающее, что вы не можете использовать пользовательские встраивания. Исходя из вашего описания, вы используете модель с пользовательскими встраиваниями, что ведет к ограничениям в использовании некоторых методов, таких как find_topics().

Шаг 2: Инициализация модели без встраиваний

Как вы уже заметили, инициализация модели без встраиваний и исключение параметра seed_topics может решить эту проблему. Вот как это можно сделать:

from bertopic import BERTopic

# Инициализация модели без передачи embeddings и seed_topics
model_ngram_noembed = BERTopic(
    top_n_words=10, 
    min_topic_size=5, 
    n_gram_range=(1, 2), 
    nr_topics=41, 
    verbose=True
)

# Обучение модели на вашем датасете docs_bert_dtm
topics_bert_noembed, probs_noembed = model_ngram_noembed.fit_transform(docs_bert_dtm)

Шаг 3: Использование find_topics()

После успешного обучения модели без встраиваний, вы можете использовать функцию find_topics() для поиска тем:

keyterm_explore = "define"
pd_keyterm_explore = pd.DataFrame(model_ngram_noembed.find_topics(keyterm_explore), 
                                   columns=["Topic", "Probability"],
                                   dtype="float").round(decimals=2)

print(f'Exploring {keyterm_explore}: \n{pd_keyterm_explore}')

Шаг 4: Обновление библиотеки

Вы упомянули, что уже обновили BERTopic до версии 0.12.0. Это важный шаг, так как в новых версиях часто исправляются ошибки и добавляются улучшения функционала. Регулярно проверяйте обновления библиотек, которыми вы пользуетесь, чтобы быть в курсе последних улучшений и исправлений.

Заключение

Избегайте использования пользовательских встраиваний, когда планируете применять функции, не поддерживающие их. Всегда проверяйте документацию для получения информации о совместимости функций и параметров. Если у вас остались вопросы или возникли другие ошибки в процессе работы с BERTopic, не стесняйтесь задавать их в новых темах, как вы и планировали.

Эта информация должна помочь вам правильно настроить BERTopic и успешно использовать функцию find_topics(). Если возникнут дальнейшие вопросы, не стесняйтесь делиться ими.

Оцените материал
Добавить комментарий

Капча загружается...