使用 BerTopic 在 Python 中進(jìn)行主題建模
譯文【51CTO.com快譯】通過(guò)主題建模,你可以收集非結(jié)構(gòu)化數(shù)據(jù)集,分析文檔,并獲得相關(guān)和所需的信息,這些信息能幫你做出更好的決策。
執(zhí)行主題建模有不同的技術(shù)(如LDA),但是在本NLP教程中,你將學(xué)習(xí)如何使用Maarten Grootendorst開(kāi)發(fā)的BerTopic技術(shù)。
什么是 BerTopic?
BerTopic是一種主題建模技術(shù),它使用轉(zhuǎn)換器(BERT嵌入)和基于類(lèi)的TF-IDF來(lái)創(chuàng)建密集集群。它還允許您輕松地解釋和可視化生成的主題。
BerTopic算法包含三個(gè)階段:
1.嵌入文本數(shù)據(jù)(文檔):此步驟中,算法使用BERT提取文檔嵌入,也可以使用其他任何嵌入技術(shù)。
默認(rèn)情況下,它使用下面的句子轉(zhuǎn)換器
- “ paraphrase-MiniLM-L6-v2” - 這是一個(gè)基于英語(yǔ) BERT 的模型,專門(mén)針對(duì)語(yǔ)義相似性任務(wù)進(jìn)行訓(xùn)練。
- “ paraphrase-multilingual-MiniLM-L12-v2 ” - 這與第一個(gè)類(lèi)似,一個(gè)主要區(qū)別是 xlm 模型適用于 50 多種語(yǔ)言。
2.Cluster文檔:使用UMAP降低嵌入的維數(shù),使用HDBSCAN技術(shù)聚類(lèi)減少嵌入并創(chuàng)建語(yǔ)義相似文檔的聚類(lèi)。
3.創(chuàng)建主題表示:利用基于類(lèi)的TF-IDF進(jìn)行主題提取和精簡(jiǎn),提高最大邊緣關(guān)聯(lián)詞的一致性。
如何安裝 BerTopic
可以通過(guò) pip 安裝軟件包:
pip install bertopic
如果你對(duì)可視化選項(xiàng)感興趣,你需要按照如下方式安裝它們。
pip install bertopic[visualization]
BerTopic支持不同的轉(zhuǎn)換器和語(yǔ)言后端,你可以使用它們來(lái)創(chuàng)建模型。你可以根據(jù)下面可用的選項(xiàng)安裝一個(gè)。
- pip install bertopic[天賦]
- pip install bertopic[gensim]
- pip install bertopic[spacy]
- pip install bertopic[使用]
庫(kù)
我們將使用以下庫(kù)來(lái)幫助我們加載數(shù)據(jù)并從BerTopic創(chuàng)建模型。
#import packages
import pandas as pd
import numpy as np
from bertopic import BERTopic
步驟1:加載數(shù)據(jù)
在本NLP教程中,我們將使用2020年?yáng)|京奧運(yùn)會(huì)推文,目標(biāo)是創(chuàng)建一個(gè)模型,該模型可以根據(jù)推文的主題自動(dòng)分類(lèi)。
#load data
import pandas as pd
df = pd.read_csv("/content/drive/MyDrive/Colab Notebooks/data/tokyo_2020_tweets.csv", engine='python')
# select only 6000 tweets
dfdf = df[0:6000]
注:出于計(jì)算原因,我們只選擇了6000條推文。
步驟2:創(chuàng)建模型
要使用BERTopic創(chuàng)建模型,需要將推文作為列表加載,然后將其傳遞給fit_transform方法。這個(gè)方法將做以下工作:
- 在推文集合上擬合模型;
- 生成話題;
- 返回帶有主題的推文。
# create model
model = BERTopic(verbose=True)
#convert to list
docs = df.text.to_list()
topics, probabilities = model.fit_transform(docs)
步驟3:選擇高級(jí)主題
訓(xùn)練模型后,可以按降序訪問(wèn)主題的大小。
model.get_topic_freq().head(11)
注:Topic -1是最大的,它指的是沒(méi)有分配給生成的任何主題的離群推文。在本例中,我們將忽略Topic -1。
步驟4:選擇一個(gè)主題
你可以選擇一個(gè)特定的主題,并得到該主題的前n個(gè)單詞和他們的c-TF-IDF分?jǐn)?shù)。
model.get_topic(6)
對(duì)于這個(gè)選定的話題,常用詞是瑞典,目標(biāo),羅爾夫,瑞典人,目標(biāo),足球。很明顯,這個(gè)話題的重點(diǎn)是“瑞典隊(duì)的足球”。
步驟5:主題建模可視化
BerTopic允許您以非常類(lèi)似于LDAvis的方式可視化生成的主題。這會(huì)讓你對(duì)主題的質(zhì)量有更多的了解。在本文中,我們將介紹三種可視化主題的方法。
可視化的話題
visualize_topics方法可以幫助您可視化生成的主題及其大小和相應(yīng)的單詞。視覺(jué)化的靈感來(lái)自于LDavis。
model.visualize_topics()
可視化術(shù)語(yǔ)
visualize_barchart方法將通過(guò)創(chuàng)建c-TF-IDF分?jǐn)?shù)的條形圖來(lái)顯示選定的幾個(gè)主題術(shù)語(yǔ)。然后,您可以比較彼此的主題表示,并從生成的主題中獲得更多的見(jiàn)解。
model.visualize_barchart()
上面的圖表中,你可以看到話題4的熱門(mén)詞是proud, thank, cheer4india, cheer和congrats。
可視化主題相似性
你還可以可視化某些主題之間的相似程度。要可視化熱圖,只需調(diào)用。
model.visualize_heatmap()
在上圖中,你可以看到topic 93與topic 102相似,相似度為0.933。
主題減少
有時(shí)您可能會(huì)生成過(guò)多或過(guò)少的主題,BerTopic為您提供了一種選擇,以不同的方式控制這種行為。
(a)你可以通過(guò)設(shè)置參數(shù)nr_topics來(lái)設(shè)置你想要的主題數(shù)量。BerTopic將找到類(lèi)似的主題并合并它們。
model = BERTopic(nr_topics=20)
在上面的代碼中,將要生成的主題的數(shù)量是20。
(b)另一種選擇是自動(dòng)減少專題的數(shù)目。要使用這個(gè)選項(xiàng),你需要在訓(xùn)練模型之前將"nr_topics"設(shè)置為"auto"。
model = BERTopic(nr_topics="auto")
(c)最后一種選擇是減少模型訓(xùn)練后的主題數(shù)量。這是一個(gè)很好的選擇,如果重新培訓(xùn)模型將花費(fèi)許多小時(shí)。
new_topics, new_probs = model.reduce_topics(docs, topics, probabilities, nr_topics=15)
在上面的示例中,在訓(xùn)練模型之后,您將主題的數(shù)量減少到15個(gè)。
步驟6:做出預(yù)測(cè)
要預(yù)測(cè)新文檔的主題,需要在轉(zhuǎn)換方法上添加一個(gè)(或多個(gè))新實(shí)例。
topics, probs = model.transform(new_docs)
步驟7:保存模型
你以使用save方法保存訓(xùn)練過(guò)的模型。
model.save("my_topics_model")
步驟8:加載模型
你可以使用load方法來(lái)加載模型。
BerTopic_model = BERTopic.load("my_topics_model")
最后
在創(chuàng)建模型時(shí),BerTopic提供了許多特性。例如,如果您有一個(gè)特定語(yǔ)言的數(shù)據(jù)集(默認(rèn)情況下,它支持英語(yǔ)模型),您可以通過(guò)在配置模型時(shí)設(shè)置語(yǔ)言參數(shù)來(lái)選擇語(yǔ)言。
model = BERTopic(language="German")
注意:請(qǐng)選擇其嵌入模型存在的語(yǔ)言。
如果你的文檔中混合了多種語(yǔ)言,你可以設(shè)置language="multilingual"以支持超過(guò)50種語(yǔ)言。
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】