top of page
執筆者の写真NISHIO KEI

BERTopicを使った特許文章の分類

更新日:3月29日

1.はじめに

  • GuidedLDAというのを使って特許文章を分類しようとして、うまくライブラリが動かずに終わったことがありました。

  • その後、文章分類等はBERTを使って行っており、言葉の共起情報をもとにしたTopicModelingはあまり使ってませんでした。

  • 今回発見したBERTopicは、最初Topicmodelingの1種かと思っていたら全く違うもので、BERTによる埋め込み表現化、HDBSCANによる次元圧縮、UMAPによる分類とよい性能を出す機能を使って精度を上げるというアプローチでした。


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])

閲覧数:1,995回0件のコメント

最新記事

すべて表示

Comments


bottom of page