TM09 Topic Modeling by BERtopic#
Process comparison#
原始的群集法需要先把文檔處理成近似「Document-Term Matrix」的型態(雖然現在skilearn都可以代勞)。在這之前會需要做好幾個步驟的資料清理,包含去除一些數字或英文字母、移除空白、斷詞、移除停用詞、留下保留字等。
若是用Embedding則不需要先移除停用詞,因為停用詞也可能是其他詞的「脈絡」,若把停用詞都移掉了,可能會喪失一些脈絡,因此,使用Embedding的話,先不用移除停用詞,也不見得需要做TF-IDF的重要關鍵字萃取。
如果是用SimpleTransformer與BERTopic這類深度學習架構,因為模型中包含將文檔轉換為文檔向量的過程,所以不用特地做資料清理或抽取關鍵字,都是在最後一個階段的群集結果呈現時,才需要對文檔做斷詞以便於呈現。
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