{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# トピックモデルによるクラスタリング\n", "トピックモデルとは文書中の単語出現分布を元に傾向(≒トピックらしきもの)を観察しようとするアプローチで、クラスタリングの一種である。なお、一般的なクラスタリング(例えば[k平均法](https://ja.wikipedia.org/wiki/K平均法))では一つのサンプルが一つのクラスタに属するという前提でグルーピングを行うのに対し、トピックモデルでは一つのサンプルが複数のクラスタを内包しているという前提でグルーピングを行う。次の例を眺めるとイメージをつかみやすいだろう。\n", "\n", "- 例1: [トピックモデル入門:WikipediaをLDAモデル化してみた](https://recruit.gmo.jp/engineer/jisedai/blog/topic-model/)\n", "- 例2: [Wikipedia: Topic model](https://en.wikipedia.org/wiki/Topic_model)\n", "\n", "基本的には文書を BoW (CountVectrizor) やそれの重みを調整した TF-IDF 等の「文書単語行列」を作成し、ここから文書館類似度や単語間類似度を元に集約(≒次元削減)を試みる。文書単語行列の作成方法や次元削減方法、類似度の求め方などで様々なアルゴリズムが提案されている。ここでは (1) Bow + [LDA](https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.LatentDirichletAllocation.html) によりトピックモデルを行い、[PyLDAvis](https://github.com/bmabey/pyLDAvis)による可視化を通してトピックを観察してみよう。\n", "\n", "なお、トピックモデルの注意点として、トピックそのものは人手による解釈が求められる点が挙げられる。例えば先に上げた[トピックモデル入門:WikipediaをLDAモデル化してみた](https://recruit.gmo.jp/engineer/jisedai/blog/topic-model/)における図2(下図)では「政治」「スポーツ」「国際」といったトピックが並んでいるが、実際には「4-1. トピック観察」を行う必要がある。実際に観察してみよう。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## データの準備\n", "これまで見てきたいつものやつ。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " % Total % Received % Xferd Average Speed Time Time Time Current\n", " Dload Upload Total Spent Left Speed\n", "100 34834 100 34834 0 0 100k 0 --:--:-- --:--:-- --:--:-- 103k\n" ] } ], "source": [ "!curl -O https://ie.u-ryukyu.ac.jp/~tnal/2022/dm/static/r_assesment.pkl" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", " | title | \n", "grade | \n", "required | \n", "q_id | \n", "comment | \n", "
---|---|---|---|---|---|
0 | \n", "工業数学Ⅰ | \n", "1 | \n", "True | \n", "Q21 (1) | \n", "特になし | \n", "
1 | \n", "工業数学Ⅰ | \n", "1 | \n", "True | \n", "Q21 (2) | \n", "正直わかりずらい。むだに間があるし。 | \n", "
2 | \n", "工業数学Ⅰ | \n", "1 | \n", "True | \n", "Q21 (2) | \n", "例題を取り入れて理解しやすくしてほしい。 | \n", "
3 | \n", "工業数学Ⅰ | \n", "1 | \n", "True | \n", "Q21 (2) | \n", "特になし | \n", "
4 | \n", "工業数学Ⅰ | \n", "1 | \n", "True | \n", "Q21 (2) | \n", "スライドに書く文字をもう少しわかりやすくして欲しいです。 | \n", "
\n", " | title | \n", "grade | \n", "required | \n", "q_id | \n", "comment | \n", "wakati | \n", "
---|---|---|---|---|---|---|
0 | \n", "工業数学Ⅰ | \n", "1 | \n", "True | \n", "Q21 (1) | \n", "特になし | \n", "特に なし | \n", "
1 | \n", "工業数学Ⅰ | \n", "1 | \n", "True | \n", "Q21 (2) | \n", "正直わかりずらい。むだに間があるし。 | \n", "正直 わかる ずらい むだ 間 ある | \n", "
2 | \n", "工業数学Ⅰ | \n", "1 | \n", "True | \n", "Q21 (2) | \n", "例題を取り入れて理解しやすくしてほしい。 | \n", "例題 取り入れる 理解 する | \n", "
3 | \n", "工業数学Ⅰ | \n", "1 | \n", "True | \n", "Q21 (2) | \n", "特になし | \n", "特に なし | \n", "
4 | \n", "工業数学Ⅰ | \n", "1 | \n", "True | \n", "Q21 (2) | \n", "スライドに書く文字をもう少しわかりやすくして欲しいです。 | \n", "スライド 書く 文字 もう 少し わかる する | \n", "
... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
165 | \n", "データマイニング | \n", "3 | \n", "False | \n", "Q22 | \n", "課題が難しいものが多く、時間を多くとってもらえたのは非常に良かったですがかなりきつかったです... | \n", "課題 難しい もの 多い 時間 多い とる もらえる 非常 良い かなり きつい ござる | \n", "
166 | \n", "ICT実践英語Ⅰ | \n", "3 | \n", "False | \n", "Q22 | \n", "オンラインなどで顔を合わせてやりたかったです。 | \n", "オンライン 顔 合わせる やる | \n", "
167 | \n", "知能情報実験Ⅲ | \n", "3 | \n", "True | \n", "Q21 (2) | \n", "unityの操作方法の説明などを最初に行ってもらえたらもう少しスムーズにできたのではないかと思う。 | \n", "unity 操作方法 説明 最初 行く もらえる もう 少し スムーズ できる 思う | \n", "
168 | \n", "知能情報実験Ⅲ | \n", "3 | \n", "True | \n", "Q22 | \n", "それぞれに任せるといった形で進められたものだったのでそれなりに進めやすかったですが、オンライ... | \n", "それぞれ 任せる いう 形 進める もの なり 進める オンライン 班 員 指導 全く する... | \n", "
169 | \n", "知能情報実験Ⅲ | \n", "3 | \n", "True | \n", "Q22 | \n", "モバイルアプリ班\\r\\nHTML/CSS,JavaScriptなどを用いてアプリケーションを... | \n", "モバイルアプリ 班 \\r\\n HTML CSS javascript 用いる アプリケーショ... | \n", "
170 rows × 6 columns
\n", "