1.はじめに
2.BERTopicについて参考文献
調べてみるといろいろと試されていました。
BERTopicは埋め込み表現化、次元圧縮、分類、可視化とすべてそろっているライブラリで、各ステップで独立しているので、各ステップの組み合わせ次第でカスタム性が高いのが特徴です。下図参照
3.分類で試してみた。
(1)最初の埋め込み表現化の方法としては、内部ではsentenceBEERTが利用されている、らしいので、こんな感じで指定すればよしなにやってくれます。
from bertopic import BERTopic
from cuml.cluster import HDBSCAN
from cuml.manifold import UMAP
# Create instances of GPU-accelerated UMAP and HDBSCAN
umap_model = UMAP(n_components=5, n_neighbors=15, min_dist=0.0)
hdbscan_model = HDBSCAN(min_samples=10, gen_min_span_tree=True, prediction_data=True)
# Pass the above models to be used in BERTopic
#topic_model = BERTopic(umap_model=umap_model, hdbscan_model=hdbscan_model)
topic_model = BERTopic(
language="japanese",
calculate_probabilities=False,
verbose=True,
nr_topics="20",
umap_model=umap_model,
hdbscan_model=hdbscan_model
)
topics, probs = topic_model.fit_transform(docs)
(2)結果
処理結果をいろんな形で見せてくれるのでありがたいです。
各トピックの主要単語の上位を見せてくれます。パッとタグ付けできるものとできないものがありそうですが、これは langchain taggingなども併用すれば結構進めそうです。
topic_model.visualize_barchart(
top_n_topics=14,
width=500
)
各トピックの大きさ(所属する文章数)とトピックの散らばりを見せてくれます。これだと9グループに分かれる感じですね。
topic_model.visualize_topics()
各トピック間の類似度を可視化
topic_model.visualize_heatmap()
出願人の切り口でのトピックの頻度をみてみます。各社のアプローチが結構出てくるのが面白いです。
#出願人毎の偏りを見てみる。
# Prepare data and classes
classes = df["出願人・権利者名"].tolist()
# Create topic model and calculate topics per class
topics, probs = topic_model.fit_transform(docs)
topics_per_class = topic_model.topics_per_class(docs, classes=classes)
topic_model.visualize_topics_per_class(topics_per_class)
トピックを階層クラスタリング。どの段階で切るか検討して、分析軸の選定に使えると思います。
topic_model.visualize_hierarchy()
入力文に似たトピックを抽出
similar_topics,similarity=topic_model.find_topics("motor",top_n=5)
topic_model.get_topic(similar_topics[0])
Comments