Вопрос или проблема
Я успешно использовал 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()
. Если возникнут дальнейшие вопросы, не стесняйтесь делиться ими.