難しいトピックモデルを簡単に!PythonライブラリGensimの使い方フクロウ2018/8/142019/9/1自然言語処理や情報検索の分野に、トピックモデルという手法があります。トピックモデルは文書分類や推薦システムなどに応用できる技術です。詳しくは以下を参考にしてください。トピックモデルとはトピックモデルは非常に難しい(と個人的に思う)手法ですが、Pythonではgensimというライブラリを使うことで簡単に使うことができます。gensim公式ページ]gensimは、様々なトピックモデルを実装したPythonライブラリです。humans」とあるように、実装が大変なトピックモデルを簡単に使うことができます。Modeling)などのトピックモデルが実装されています。embedding手法もgensimから使うことができます。gensimの基本的な使い方gensimの基本的な使い方を紹介していきます。文書データから辞書(単語とそれに対応したインデックスの辞書)を作るカウントベースやTF-IDFなどの方法を使って文書データを変換するLDAなどのトピックモデルが実装されたクラスに2で作ったオブジェクトを渡して学習するの4ステップです。ここではそれに加えて、トピックモデルの結果の可視化まで行ってみる一連の実験を行います。この実験を通してgensimの使い方を確認しましょう。ステップ1:前処理ここでは文書データを読み込んで、文書データから辞書を作成します。ライブラリをimportしましょう。WordCloud次に、データセットを読み込みます。'quotes'))scikit-learnを使ってデータを読み込みます。groupsという、文書データを収めたデータセットです。文書分類に適したデータセットで、20クラスにラベル付けされたテキストが収められています。読み込んだデータセットはtwenty_news変数に収められているので、printして中身を確認してください。トピックモデルを使うにあたり、文書データを簡単に前処理してきれいにしなければなりません。ストップワードの除去です。haveのような出現頻度は多いがあまり意味の無い単語のことです。これはストップワードリストを使ってフィルタリングを行うのが簡単です。ここでは、gistで見つけたストップワードリストを保存して使っています。stopwords.split()これでストップワードのリストができたので、これを使ってフィルタリングを行います。ストップワードリストに入っている単語を消しながら、gensimの入力データの形にデータを整形します。ちなみにこの時点で、docsの中身はリストの中にstr型が入っている形です。docs]英語には大文字と小文字があります。これらを全て小文字に直してから、ストップワードリストの中にある単語ならば削除しています。...]の形になっています。実は文書データの中で使われている単語の出現頻度には偏りが非常に大きいということが知られています。これをグラフを使って確認してみましょう。3289)]Counterクラスのmost_commonを使うとリストの中の要素が何回出現しているのかを、上のように数え上げてくれます。これを使ってグラフを作ってみました。count.most_common()]plt.plot(y)x軸は単語です(約200000個くらいの単語があります。)yはそれぞれの単語の出現回数です。本当に一握りの高頻出の単語と、それ以外のほとんど出現しない単語に分かれていますね。対数グラフにすると以下のようになります。ほとんどの単語が1回しか出ていないようです。トピックモデルを使うとき、一回しか出ていないような本当に低い出現頻度の単語や、めちゃくちゃ出現頻度の高い単語をフィルタリングしてしまうという前処理があります。ここではそれを採用します。ステップ3を行ってから使いましょう。出現頻度上位5%の単語をフィルタリングしました。前処理が終わったら、辞書を作成します。gensimで使う辞書の作成には、gensim.corpora.Dictionary関数を使います。この辞書は前述したとおり、単語とindexの組み合わせを持っています。これを使って、そのまま文書データをgensimで使える形に変換します。この変換にはdoc2vecメソッドを使います。...中略...]変換したデータは、indexと出現回数のタプルのリストが文書の分だけ入ったリストになっています。出力結果をみてください。...]になっています。このリストで一つの文書に相当するので、corpus変数には、このリストを文書数分だけ内包したリストを持っています。トピックモデルの学習ここまででgensimで入力データとして使えるオブジェクト(corpus)ができました。これと辞書オブジェクト(dictionary)を使って、LDAモデルの学習を試してみましょう。LdaModelクラスを使うには、最低3つのパラメータを設定します。id2wordの3つです。LDAはtopic数を利用者が決める必要があるので、ここはint型で指定してください。id2wordは辞書オブジェクトを渡せばOKです。id2word=dictionary)これで学習ができました。データの大きさによっては時間がかかるので気をつけてください。結果の確認トピックを可視化してみましょう。今回はワードクラウドを使って可視化します。単語の大きさがその単語のそのトピックにおける所属確率の高さになります。str(t))左上がtopic0、右下がtopic19になっています。今回はチューニングを適当にしていますし、前処理も最低限ですのであまりきれいにはトピックができていませんね。topic14やtopic17のような、なんとなく意味的なまとまりがありそうなトピックもできているようです。これを更にきれいなトピックが作れるようにチューニングしたり、可視化の方法を変えたりといった方法について勉強すると面白いですよ。まとめこの記事ではgensimの使い方について、実際に簡単に実験を一通り行うことで紹介しました。gensimにはここで紹介したLDA以外にもたくさんのモデルが実装されています。Learning以外にも面白い機械学習手法があること、それがgensimなどのライブラリによって手軽に試せることを実感していただけたら嬉しいです。TweetPocket無料でSEからWebエンジニアへ転職しませんか?侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、システムエンジニアという職業だけどコードが書けない事務作業が多くスキルがないため将来が不安スクールに通うと完全未経験者と同じスタートになるからレベルが合わないという、すでに知識があるSEならではのお悩みがあることに気づきました。弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。こちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。無料体験レッスンを予約する書いた人フクロウ第一言語はPythonです。皆さんRustやりましょう。