你好,
我想尝试使用Huggingface的自定义嵌入模型,而不是sentence-transformers/all-MiniLM-L6-v2
。我阅读了之前打开和关闭的问题,并找到了以下方法:
代码:
# romanian_embedding_model = pipeline("feature-extraction", model="readerbench/RoBERT-large", tokenizer="readerbench/RoBERT-large")
# tokenizer_kwargs = {'padding':True,'truncation':True,'max_length':512,'return_tensors':'pt'}
# self.bertopic_model = BERTopic(embedding_model=lambda x: romanian_embedding_model(x, **tokenizer_kwargs), verbose=True, nr_topics='auto', n_gram_range=(1, 2))
# topics_1, probs_1 = self.bertopic_model.fit_transform(self.nontruncated_documents)
embedding_model = AutoModel.from_pretrained("dumitrescustefan/bert-base-romanian-cased-v1")
tokenizer = AutoTokenizer.from_pretrained("dumitrescustefan/bert-base-romanian-cased-v1")
romanian_embedding_model = pipeline("feature-extraction", model=embedding_model, tokenizer=tokenizer)
tokenizer_kwargs = {'padding':True, 'truncation':True, 'max_length':512, 'return_tensors':'pt'}
self.bertopic_model = BERTopic(embedding_model=lambda x: romanian_embedding_model(x, **tokenizer_kwargs), verbose=True, nr_topics='auto', n_gram_range=(1, 2))
topics_1, probs_1 = self.bertopic_model.fit_transform(self.nontruncated_documents)
然而,当我使用类似
import logging
logging.basicConfig()
logger = logging.getLogger('Something')
logger.setLevel(logging.INFO)
的记录器时,我发现BERTopic实际上并没有加载Huggingface模型,而只是加载了sentence-transformers/all-MiniLM-L6-v2
。为什么会这样呢?
证明:
我会继续使用多语言版本,直到这个问题得到解决。
感谢您的耐心 💯
3条答案
按热度按时间iyr7buue1#
Instead of this:
I think you should do this:
Also, I would advise not using
nr_topics="auto"
unless you played around with the underlying cluster model instead. See best practices .mpbci0fu2#
我之所以使用lambda函数和
tokenizer_kwargs
,主要是因为模型对输入大小有限制,而我的文档超过了这个限制(我的文档比512个标记还要大)。我完全无法找到其他替代方案。我想解决这个问题的唯一方法就是过滤掉我不关心的部分词性,比如副词(已经移除了停用词)。显然,文档也可以被截断,但我担心这种方法可能会丢失很多有用的数据(单词并不等同于标记,而且由于我不知道如何从输入中精确地测量要切出的标记数量,所以不得不使用kwargs
技巧)。感谢建议,我实际上会移除
nr_topics
,并尝试调整HDBSCAN组件以减少主题数量。kmpatx3s3#
我使用lambda函数和tokenizer_kwargs的主要原因是模型对输入大小有限制,而我的文档超过了这个限制(我的文档比512个标记还要大)。我完全无法找到其他替代方案。我想解决这个问题的唯一方法是过滤掉我不关心的部分词性,比如副词(已经移除了停用词)。显然,文档也可以被截断,但我担心这种方法可能会丢失很多有用的数据(单词并不等同于标记,而且由于我不知道如何从输入中精确地测量要切出的标记数量,所以不得不使用kwargs技巧)。
你也可以使用sentence-transformers来加载模型。我认为它可能更好地处理截断。另外,请注意,一个多语言嵌入模型可能会比一个没有专门训练生成语义相似度嵌入的BERT类模型表现得更好。