TM09 Topic Modeling by BERtopic#

Alt text

Process comparison#

  • 原始的群集法需要先把文檔處理成近似「Document-Term Matrix」的型態(雖然現在skilearn都可以代勞)。在這之前會需要做好幾個步驟的資料清理,包含去除一些數字或英文字母、移除空白、斷詞、移除停用詞、留下保留字等。

  • 若是用Embedding則不需要先移除停用詞,因為停用詞也可能是其他詞的「脈絡」,若把停用詞都移掉了,可能會喪失一些脈絡,因此,使用Embedding的話,先不用移除停用詞,也不見得需要做TF-IDF的重要關鍵字萃取。

  • 如果是用SimpleTransformer與BERTopic這類深度學習架構,因為模型中包含將文檔轉換為文檔向量的過程,所以不用特地做資料清理或抽取關鍵字,都是在最後一個階段的群集結果呈現時,才需要對文檔做斷詞以便於呈現。

Alt text

from IPython.display import display
pd.options.display.float_format = '{:.4f}'.format

import warnings
warnings.filterwarnings("ignore", message=".*The 'nopython' keyword.*")
# import os
# os.environ["TOKENIZERS_PARALLELISM"] = "false"

import re
import zhon.hanzi
from collections import Counter
zh_pat = f"[{zhon.hanzi.characters}|{zhon.hanzi.punctuation}]"

with open("data/stopwords_zh-tw.txt", encoding="utf-8") as fin:
    stopwords = fin.read().split("\n")[1:]
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[1], line 2
      1 from IPython.display import display
----> 2 pd.options.display.float_format = '{:.4f}'.format
      4 import warnings
      5 warnings.filterwarnings("ignore", message=".*The 'nopython' keyword.*")

NameError: name 'pd' is not defined

Step 1. Import and clean data#

Notes that we don’t need tokenization and stop-word removal here. Just clean up space or punctuation.

import pandas as pd
df = pd.read_csv('data/sentiment.csv')

def clean_text(text):
    text = re.sub("[\r\t ]+", " ", text)
    text = "".join(re.findall(zh_pat, text))
    return text

df["cleaned"] = df["text"].apply(clean_text)

Step 2 Run BERTopic#

2.1 Prepare envs for bertopic#

df.cleaned
0                        店家很給力,快遞也是相當快,第三次光顧啦
1       這樣的配置用系統還是有點卡。指紋收集器。沒送原裝滑鼠還需要自己買,不太好。
2                        不錯,在同等檔次酒店中應該是值得推薦的!
3                             哎!不會是蒙牛乾的吧嚴懲真凶!
4                 空尤其是三立電視臺女主播做的序尤其無趣像是硬湊那麼多字
                        ...                  
6383                      價效比高、記憶體大、功能全,螢幕超清晰
6384                你太狠了…告訴你他們不會喧譁的人,肯定是蒙牛喝多了
6385                 醫生居然買了蒙牛,我是喝呢還是不喝呢還是不喝呢?
6386                     我只想說夾蒙牛是不對的販賣毒品是犯罪行為
6387                                     蒙牛便宜
Name: cleaned, Length: 6388, dtype: object

2.1 Initialize model#

# !pip install bertopic
# !pip install hdbscan
# !pip install jieba

from bertopic import BERTopic
from transformers.pipelines import pipeline

from bertopic.vectorizers import ClassTfidfTransformer
from bertopic.representation import KeyBERTInspired
from sklearn.feature_extraction.text import CountVectorizer

import jieba
jieba.load_userdict("data/userdict.txt") # prepared by yourself

from hdbscan import HDBSCAN

def tokenize_zh(text):
   words = jieba.lcut(text)
   return words


# embedding_model = pipeline("feature-extraction", model="ckiplab/bert-base-chinese")
# embeddings = [embedding_model(doc)[0] for doc in docs] # Asking chatGPT but wrong
# embeddings = embedding_model.encode(docs, show_progress_bar=False) # by BERTopic's sentence transformer


vectorizer_model = CountVectorizer(tokenizer=tokenize_zh, stop_words=stopwords)
ctfidf_model = ClassTfidfTransformer(reduce_frequent_words=True)
representation_model = KeyBERTInspired()
hdbscan_model = HDBSCAN(min_cluster_size = 20, metric='euclidean',
                        cluster_selection_method='eom', prediction_data=True, min_samples=10)


docs = df["cleaned"]
print(len(docs))
6388
Batches: 100%|██████████| 200/200 [00:27<00:00,  7.26it/s]
2023-12-03 00:52:55,997 - BERTopic - Transformed documents to Embeddings
2023-12-03 00:53:06,965 - BERTopic - Reduced dimensionality
2023-12-03 00:53:08,310 - BERTopic - Clustered reduced embeddings

2.2 Run bertopic#

"""
There are a few parameters that you can tune to improve your topic model.
Here I provides some examples:
Model 1: Default parameters
Model 2: Specify the language and embedding model
Model 3: Specify more parameters
"""

# Model 1
# topic_model = BERTopic()

# Model 2
# topic_model = BERTopic(
#     language="chinese (traditional)",
#     embedding_model="distiluse-base-multilingual-cased-v1",
#     calculate_probabilities=True, verbose=True)

# Model 3
topic_model = BERTopic(
    language="chinese (traditional)",
    #    embedding_model="paraphrase-xlm-r-multilingual-v1",
    embedding_model="distiluse-base-multilingual-cased-v1",
    vectorizer_model=vectorizer_model,
    #    representation_model=representation_model,
    #    ctfidf_model=ctfidf_model,
    calculate_probabilities=True, verbose=True)
topics, probs = topic_model.fit_transform(docs)
Batches: 100%|██████████| 200/200 [00:32<00:00,  6.07it/s]
2023-12-03 12:04:38,881 - BERTopic - Transformed documents to Embeddings
2023-12-03 12:04:43,698 - BERTopic - Reduced dimensionality
2023-12-03 12:04:44,907 - BERTopic - Clustered reduced embeddings

Step 3. Result exploration#

Terms probability of each topic#

topic_model.get_topic(0)
[('酒店', 0.03997580428200383),
 ('房間', 0.038745198337690454),
 ('住', 0.022947505352807967),
 ('服務', 0.021592129521251717),
 ('環境', 0.02153355858267068),
 ('早餐', 0.020479389742980674),
 ('設施', 0.020377022207918306),
 ('入住', 0.017575327768934505),
 ('方便', 0.015658263760673603),
 ('交通', 0.015161822535778819)]

Topic counts and representative docs#

freq = topic_model.get_topic_info();
freq.head(16)
Topic Count Name Representation Representative_Docs
0 -1 2010 -1_蒙牛_ _買_喝 [蒙牛, , 買, 喝, 不錯, 書, 外觀, 好, 支援, 說] [喜歡喝蒙牛不?, 為何沒有蒙牛?, 蒙牛好!!]
1 0 842 0_酒店_房間_住_服務 [酒店, 房間, 住, 服務, 環境, 早餐, 設施, 入住, 方便, 交通] [環境很好,服務也不錯,推薦下次還會住這裡, 酒店位置很好,房間也很舒服,下次還會入住。, ...
2 1 160 1_電池_小時_電池續_耐用 [電池, 小時, 電池續, 耐用, 機時間, 時間, 航時間, 短, 能力, 長] [電池待機時間長,機身小巧,功能比較實用, 電池待機時間長,機身小巧時尚, 外觀漂亮,電池很...
3 2 148 2_鍵盤_手感_舒服_按鍵 [鍵盤, 手感, 舒服, 按鍵, 鍵, 螢幕, 好, 價效, 外觀, 盤] [散熱好,螢幕清晰,鍵盤手感很好,處理速度快,硬碟聲音小,做工不錯, 價效比好。鍵盤手感挺好...
4 3 133 3_鈴聲_聲音_效果_音質 [鈴聲, 聲音, 效果, 音質, 功能, 聽, 螢幕, 音量, 顯示, 拍照] [聲音好聽,外觀漂亮。功能比較多!, 螢幕顯示效果不夠細膩;鈴聲效果一般,內建圖片和鈴聲偏少...
5 4 119 4_內容_說_失望_優點 [內容, 說, 失望, 優點, 覺得, 人, 感覺, 暢銷, 宣傳, 好看] [優點很多大家都說了我就不多說了, 一點都不好笑很失望內容也不是很實用, 內容太簡單了,都是...
6 5 119 5_螢幕_屏_顯示_完美 [螢幕, 屏, 顯示, 完美, 亮點, 效果, 外觀, 功能, 色彩, 配置] [雖說費了九牛二虎之力才把系統裝上,感覺用著不錯,速度很快,散熱還好,螢幕完美屏,色彩顯示不...
7 6 118 6_蒙牛_逼_牛_抵制 [蒙牛, 逼, 牛, 抵制, 真, 悲劇, 傻, 可怕, , 垃圾] [蒙牛,牛逼!, 蒙牛,牛逼, 蒙牛牛逼!]
8 7 98 7_收到_月_日_訂單 [收到, 月, 日, 訂單, 還沒, 書, 噹噹, 通知, 缺貨, 沒貨] [月日的訂單,到今天(日)還沒到貨!, 真是讓人鬱悶,噹噹的速度真是慢的讓人崩潰,月日發貨到...
9 8 98 8_安裝_師傅_還沒安裝_安裝費 [安裝, 師傅, 還沒安裝, 安裝費, 東西, 再, 好, 正品, 先給, 好評] [東西不錯,很好用,安裝師傅服務也很到位,很熱心,贊一個!, 沒有安裝,使用。, 還沒有安裝...
10 9 87 9_光碟_硬碟_分割_槽 [光碟, 硬碟, 分割, 槽, 機, 外接, 系統, 燒錄, 麻煩, 驅動] [此款機型硬碟除了服務分割槽外只有一個主分割槽,系列可以考慮出廠預裝系統時做好分割槽, 分割...
11 10 85 10_這本書_書_一本_作者 [這本書, 書, 一本, 作者, 寫, 內容, 沒什麼, 完, 炒作, 文筆] [這本書真的很好我向很多朋友介紹了這本書讓人受益非淺, 錯了不是這本書是另外一本真是抱歉不是...
12 11 85 11_系統_預裝_裝系統_安裝 [系統, 預裝, 裝系統, 安裝, 麻煩, 弄, 作業, 軟體, 裝, 解除] [作業系統啊真不好加一個又用不了多少錢?建議增加安裝系統的服務, 用起來不習慣,速度慢,分割...
13 12 84 12_酸奶_牛奶_紅棗_喜歡 [酸奶, 牛奶, 紅棗, 喜歡, 好喝, 酸牛奶, 蒙牛, 喝, 酸酸乳, 味道] [我也喜歡蒙牛的牛奶, 酸奶喝來喝去,還是最喜歡蒙牛的紅棗酸奶,味道香,還便宜, 其實吧。。...
14 13 77 13_簡訊_電話_訊號_通話 [簡訊, 電話, 訊號, 通話, 關機, 訊, 彩信, 容量, 不好, 短] [機子質量不怎麼樣,電話本和簡訊的容量比較小,售後不熱情,待機時間比較短!, 電話或簡訊儲存...
15 14 77 14_記憶體_加_跑_體條 [記憶體, 加, 跑, 體條, 太小, 記憶, 升級, 插槽, 系統, 速度] [記憶體比較小了。以後要是裝的話需要加裝一根的記憶體。。, 鍵盤手感不太好。就一個記憶體插槽...

Inspect documnets of each topic#

doc_info = topic_model.get_document_info(docs)
doc_info.query("Topic==1")
Document Topic Name Representation Representative_Docs Top_n_words Probability Representative_document
21 訊號差得要命。軟體容易出問題。動不動就死。說不完。電池不好。 1 1_電池_小時_電池續_耐用 [電池, 小時, 電池續, 耐用, 機時間, 時間, 航時間, 短, 能力, 長] [電池待機時間長,機身小巧,功能比較實用, 電池待機時間長,機身小巧時尚, 外觀漂亮,電池很... 電池 - 小時 - 電池續 - 耐用 - 機時間 - 時間 - 航時間 - 短 - 能力 - 長 0.2613 False
27 螢幕轉軸有點鬆,不知道是不是個例電池使用時間實在是一般在網上找不到讀卡器驅動 1 1_電池_小時_電池續_耐用 [電池, 小時, 電池續, 耐用, 機時間, 時間, 航時間, 短, 能力, 長] [電池待機時間長,機身小巧,功能比較實用, 電池待機時間長,機身小巧時尚, 外觀漂亮,電池很... 電池 - 小時 - 電池續 - 耐用 - 機時間 - 時間 - 航時間 - 短 - 能力 - 長 0.1653 False
152 外形小巧,白色很精緻。功能齊全,無線,藍芽,硬碟,電池續航時間長。 1 1_電池_小時_電池續_耐用 [電池, 小時, 電池續, 耐用, 機時間, 時間, 航時間, 短, 能力, 長] [電池待機時間長,機身小巧,功能比較實用, 電池待機時間長,機身小巧時尚, 外觀漂亮,電池很... 電池 - 小時 - 電池續 - 耐用 - 機時間 - 時間 - 航時間 - 短 - 能力 - 長 0.3567 False
260 不錯的。非常方便,可以拿到國家圖書館查查資料。電池續航時間非常長,個多小時。 1 1_電池_小時_電池續_耐用 [電池, 小時, 電池續, 耐用, 機時間, 時間, 航時間, 短, 能力, 長] [電池待機時間長,機身小巧,功能比較實用, 電池待機時間長,機身小巧時尚, 外觀漂亮,電池很... 電池 - 小時 - 電池續 - 耐用 - 機時間 - 時間 - 航時間 - 短 - 能力 - 長 0.3012 False
267 價效比高,電池厲害,速度快,軟體豐富 1 1_電池_小時_電池續_耐用 [電池, 小時, 電池續, 耐用, 機時間, 時間, 航時間, 短, 能力, 長] [電池待機時間長,機身小巧,功能比較實用, 電池待機時間長,機身小巧時尚, 外觀漂亮,電池很... 電池 - 小時 - 電池續 - 耐用 - 機時間 - 時間 - 航時間 - 短 - 能力 - 長 0.2374 False
... ... ... ... ... ... ... ... ...
6252 電池好,螢幕好漂亮實測上網、聊天的話可以堅持個半小時,還不錯 1 1_電池_小時_電池續_耐用 [電池, 小時, 電池續, 耐用, 機時間, 時間, 航時間, 短, 能力, 長] [電池待機時間長,機身小巧,功能比較實用, 電池待機時間長,機身小巧時尚, 外觀漂亮,電池很... 電池 - 小時 - 電池續 - 耐用 - 機時間 - 時間 - 航時間 - 短 - 能力 - 長 0.1888 False
6271 螢幕很亮,鍵盤也還挺舒服的,感覺不出特別小,電池好像可以撐個小時左右 1 1_電池_小時_電池續_耐用 [電池, 小時, 電池續, 耐用, 機時間, 時間, 航時間, 短, 能力, 長] [電池待機時間長,機身小巧,功能比較實用, 電池待機時間長,機身小巧時尚, 外觀漂亮,電池很... 電池 - 小時 - 電池續 - 耐用 - 機時間 - 時間 - 航時間 - 短 - 能力 - 長 0.1979 False
6277 便宜好用,經濟實惠,剛開始待機時間超長,可能和有專門的電源管理模式軟體有關。 1 1_電池_小時_電池續_耐用 [電池, 小時, 電池續, 耐用, 機時間, 時間, 航時間, 短, 能力, 長] [電池待機時間長,機身小巧,功能比較實用, 電池待機時間長,機身小巧時尚, 外觀漂亮,電池很... 電池 - 小時 - 電池續 - 耐用 - 機時間 - 時間 - 航時間 - 短 - 能力 - 長 0.0848 False
6304 電池是芯的雞肋不是芯的也就罷了芯的總該算標準配置吧不厚道 1 1_電池_小時_電池續_耐用 [電池, 小時, 電池續, 耐用, 機時間, 時間, 航時間, 短, 能力, 長] [電池待機時間長,機身小巧,功能比較實用, 電池待機時間長,機身小巧時尚, 外觀漂亮,電池很... 電池 - 小時 - 電池續 - 耐用 - 機時間 - 時間 - 航時間 - 短 - 能力 - 長 0.5785 False
6330 螢幕不錯,怕麻煩直接裝了系統,用著還不錯!電池小時左右,有幾種節電模式可以選! 1 1_電池_小時_電池續_耐用 [電池, 小時, 電池續, 耐用, 機時間, 時間, 航時間, 短, 能力, 長] [電池待機時間長,機身小巧,功能比較實用, 電池待機時間長,機身小巧時尚, 外觀漂亮,電池很... 電池 - 小時 - 電池續 - 耐用 - 機時間 - 時間 - 航時間 - 短 - 能力 - 長 0.0990 False

160 rows × 8 columns

Topic-terms overview of all topics#

all_topics = topic_model.get_topics()
df_all_topics = pd.DataFrame(all_topics)
df_all_topics
-1 0 1 2 3 4 5 6 7 8 ... 82 83 84 85 86 87 88 89 90 91
0 (蒙牛, 0.012909055419502172) (酒店, 0.03997580428200383) (電池, 0.10812010727779262) (鍵盤, 0.09556198048611775) (鈴聲, 0.05432354411091842) (內容, 0.04941998010576315) (螢幕, 0.07327764549880973) (蒙牛, 0.09746961535036144) (收到, 0.06910198665903361) (安裝, 0.08700249495130657) ... (上網, 0.1805240316283576) (支援, 0.28485833794752696) (三星, 0.2527582950143057) (勤快, 0.1733242492439626) (孩子, 0.11926070690712227) (韓國, 0.29115665145034614) (效能, 0.10957715708241836) (半年, 0.10860631942284178) (綠色, 0.35820255692392555) (時尚, 0.28523500449575795)
1 ( , 0.010304950123438766) (房間, 0.038745198337690454) (小時, 0.03984937954514461) (手感, 0.047830507131678635) (聲音, 0.04106639099316521) (說, 0.037074906367358676) (屏, 0.028146483478746955) (逼, 0.06656569965699044) (月, 0.05407443598159331) (師傅, 0.06008049613116295) ... (太麻煩, 0.0904118022924759) (贊助, 0.24187349561088978) (屏, 0.09188999018061507) (大衣, 0.09683516753508406) (兒子, 0.07379013954364308) (韓國人, 0.1688428181614436) (執行, 0.0666042368056778) (月, 0.10280818692796752) (心情, 0.21880061277617552) (功能, 0.1810634432026829)
2 (買, 0.008769904965208518) (住, 0.022947505352807967) (電池續, 0.035890356214032144) (舒服, 0.027319204208813903) (效果, 0.0401551840731225) (失望, 0.03257476908734506) (顯示, 0.026441819533747322) (牛, 0.06432426930409332) (日, 0.04271689794271339) (還沒安裝, 0.05156862237250838) ... (連線, 0.08663081788262814) (一如既往, 0.1612489970739265) (完美, 0.06793316253707489) (外號, 0.09683516753508406) (大點, 0.06983398813978024) (中國國情, 0.08818020536294285) (很小, 0.0625324245648859) (兩天, 0.08808687894097948) (笑, 0.1051445302991416) (外型, 0.16232890097909425)
3 (喝, 0.008295668253548046) (服務, 0.021592129521251717) (耐用, 0.023812950945556306) (按鍵, 0.019931836455130924) (音質, 0.037809712251507026) (優點, 0.025207720385531977) (完美, 0.025704439878893197) (抵制, 0.059442883742549545) (訂單, 0.04271689794271339) (安裝費, 0.04237693574593841) ... (網路, 0.07944077562404209) (實力, 0.11758556057831634) (記憶體, 0.04618051995647507) (悲涼, 0.09683516753508406) (女兒, 0.05638407725927712) (差異, 0.08135447903017971) (散熱, 0.062306981011400635) (沒死, 0.0812937208936508) (悲春傷, 0.09828046854307039) (強大質量, 0.13718315400803574)
4 (不錯, 0.007054007264300265) (環境, 0.02153355858267068) (機時間, 0.023096786477421298) (鍵, 0.019332443408215924) (功能, 0.03189185647319983) (覺得, 0.024410570339298696) (亮點, 0.023289275436560897) (真, 0.04093362592078666) (還沒, 0.03452525938917517) (東西, 0.03731307583454291) ... (線, 0.07610450044555302) (湯之贇, 0.11758556057831634) (我加, 0.04221020123324177) (遞進, 0.09683516753508406) (喜歡, 0.054365359638345184) (女人, 0.07278916286258653) (效果, 0.059078891509881375) (用天, 0.0812937208936508) (秋, 0.09828046854307039) (夠輕薄, 0.13718315400803574)
5 (書, 0.006872649797849081) (早餐, 0.020479389742980674) (時間, 0.02285988070535654) (螢幕, 0.01670485474907205) (聽, 0.027846290729857216) (人, 0.0219268791461538) (效果, 0.022558883729691365) (悲劇, 0.04023492974101406) (書, 0.034397328244441354) (再, 0.02817535305805783) ... (網絡卡, 0.07324697651104445) (我算, 0.11758556057831634) (頭暈, 0.04221020123324177) (好棒, 0.09683516753508406) (歲, 0.05144576105648887) (文化, 0.07278916286258653) (日常, 0.053736463772389824) (過機, 0.0812937208936508) (最怕, 0.09828046854307039) (多外觀, 0.13718315400803574)
6 (外觀, 0.006786229328450595) (設施, 0.020377022207918306) (航時間, 0.022430461802901747) (好, 0.015471207546496252) (螢幕, 0.02661743013461871) (感覺, 0.02090861601908716) (外觀, 0.01993637101120427) (傻, 0.03966353099568117) (噹噹, 0.03352139356408797) (好, 0.02723021895285468) ... (臥室, 0.06931359360406017) (湯湯, 0.11758556057831634) (友達屏, 0.04221020123324177) (好帥, 0.09683516753508406) (回來, 0.045617814135654716) (這本書, 0.0675805295625417) (挺快, 0.046353688903389485) (不關機, 0.0812937208936508) (愛吃, 0.09828046854307039) (夠時, 0.13718315400803574)
7 (好, 0.006520041858347239) (入住, 0.017575327768934505) (短, 0.020217140990209503) (價效, 0.014554356827744926) (音量, 0.022135759224421948) (暢銷, 0.019759176884332354) (功能, 0.017064884459850917) (可怕, 0.03562739263571287) (通知, 0.03288682397142727) (正品, 0.024886767779991912) ... (說產品, 0.06931359360406017) (噠, 0.11758556057831634) (人靜, 0.04221020123324177) (穿, 0.09683516753508406) (薰, 0.044193230821380644) (書, 0.05611428548351661) (網本強, 0.04541235443024632) (字, 0.07880012749439036) (會毫, 0.09828046854307039) (外形, 0.12929178036755362)
8 (支援, 0.006246563289206007) (方便, 0.015658263760673603) (能力, 0.02013993549795948) (外觀, 0.013659179514628934) (顯示, 0.02167928726545306) (宣傳, 0.018008594527023355) (色彩, 0.017049676086780086) ( , 0.0275336479021026) (缺貨, 0.03157323019629331) (先給, 0.024211421249839108) ... (老好, 0.06931359360406017) (出國, 0.11758556057831634) (友達, 0.04221020123324177) (很虎勢, 0.09683516753508406) (許不會, 0.044193230821380644) (人俗, 0.05580331688462471) (網發, 0.04541235443024632) (目前, 0.0752711812083832) (肖傑夫, 0.09828046854307039) (基本功能, 0.11435286929493096)
9 (說, 0.005924667413511004) (交通, 0.015161822535778819) (長, 0.01995175249529089) (盤, 0.012682195897824317) (拍照, 0.020016906486091956) (好看, 0.017409958362111826) (配置, 0.01472443214030595) (垃圾, 0.027003363852405215) (沒貨, 0.03157323019629331) (好評, 0.02369382457538249) ... (草草, 0.06931359360406017) (偶素, 0.11758556057831634) (確挺響, 0.04221020123324177) (經習慣, 0.09683516753508406) (共同, 0.044193230821380644) (韓劇裡頭, 0.05580331688462471) (比上, 0.04541235443024632) (接下, 0.07275338857153986) (腿, 0.09828046854307039) (尚, 0.09681529968931507)

10 rows × 93 columns

LDAVis (Relation between topics)#

topic_model.visualize_topics()
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
File ~/opt/anaconda3/envs/new_tm/lib/python3.9/site-packages/IPython/core/formatters.py:922, in IPythonDisplayFormatter.__call__(self, obj)
    920 method = get_real_method(obj, self.print_method)
    921 if method is not None:
--> 922     method()
    923     return True

File ~/opt/anaconda3/envs/new_tm/lib/python3.9/site-packages/plotly/basedatatypes.py:834, in BaseFigure._ipython_display_(self)
    831 import plotly.io as pio
    833 if pio.renderers.render_on_display and pio.renderers.default:
--> 834     pio.show(self)
    835 else:
    836     print(repr(self))

File ~/opt/anaconda3/envs/new_tm/lib/python3.9/site-packages/plotly/io/_renderers.py:396, in show(fig, renderer, validate, **kwargs)
    391         raise ValueError(
    392             "Mime type rendering requires ipython but it is not installed"
    393         )
    395     if not nbformat or Version(nbformat.__version__) < Version("4.2.0"):
--> 396         raise ValueError(
    397             "Mime type rendering requires nbformat>=4.2.0 but it is not installed"
    398         )
    400     ipython_display.display(bundle, raw=True)
    402 # external renderers

ValueError: Mime type rendering requires nbformat>=4.2.0 but it is not installed

Topic-term bar-charts#

topic_model.visualize_barchart(top_n_topics=10, n_words = 10, topics = range(10))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
File ~/opt/anaconda3/envs/new_tm/lib/python3.9/site-packages/IPython/core/formatters.py:922, in IPythonDisplayFormatter.__call__(self, obj)
    920 method = get_real_method(obj, self.print_method)
    921 if method is not None:
--> 922     method()
    923     return True

File ~/opt/anaconda3/envs/new_tm/lib/python3.9/site-packages/plotly/basedatatypes.py:834, in BaseFigure._ipython_display_(self)
    831 import plotly.io as pio
    833 if pio.renderers.render_on_display and pio.renderers.default:
--> 834     pio.show(self)
    835 else:
    836     print(repr(self))

File ~/opt/anaconda3/envs/new_tm/lib/python3.9/site-packages/plotly/io/_renderers.py:396, in show(fig, renderer, validate, **kwargs)
    391         raise ValueError(
    392             "Mime type rendering requires ipython but it is not installed"
    393         )
    395     if not nbformat or Version(nbformat.__version__) < Version("4.2.0"):
--> 396         raise ValueError(
    397             "Mime type rendering requires nbformat>=4.2.0 but it is not installed"
    398         )
    400     ipython_display.display(bundle, raw=True)
    402 # external renderers

ValueError: Mime type rendering requires nbformat>=4.2.0 but it is not installed

Document distribution with topics#

topic_model.visualize_documents(docs, hide_document_hover = True, topics=range(16))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
File ~/opt/anaconda3/envs/new_tm/lib/python3.9/site-packages/IPython/core/formatters.py:922, in IPythonDisplayFormatter.__call__(self, obj)
    920 method = get_real_method(obj, self.print_method)
    921 if method is not None:
--> 922     method()
    923     return True

File ~/opt/anaconda3/envs/new_tm/lib/python3.9/site-packages/plotly/basedatatypes.py:834, in BaseFigure._ipython_display_(self)
    831 import plotly.io as pio
    833 if pio.renderers.render_on_display and pio.renderers.default:
--> 834     pio.show(self)
    835 else:
    836     print(repr(self))

File ~/opt/anaconda3/envs/new_tm/lib/python3.9/site-packages/plotly/io/_renderers.py:396, in show(fig, renderer, validate, **kwargs)
    391         raise ValueError(
    392             "Mime type rendering requires ipython but it is not installed"
    393         )
    395     if not nbformat or Version(nbformat.__version__) < Version("4.2.0"):
--> 396         raise ValueError(
    397             "Mime type rendering requires nbformat>=4.2.0 but it is not installed"
    398         )
    400     ipython_display.display(bundle, raw=True)
    402 # external renderers

ValueError: Mime type rendering requires nbformat>=4.2.0 but it is not installed