Google Search Console の キーワードを python で カテゴリ分けしてみた結果を記載します。
今回は、ナイーブベイズ分類 を使います。  
過去の記事
- 
LinearSVC で クラス分類する 
 Google Search Console の キーワードを python sklearn LinearSVC でクラス分類してカテゴリ分けする | Monotalk
- 
RandomForestClassifier で クラス分類する 
 Google Search Console の キーワードを python sklearn RandomForestClassifier でクラス分類してカテゴリ分けする | Monotalk
前提
- 
入力データ 
 Search Analytics for Sheets - Google スプレッドシート アドオン で、データをGoogle スプレッドシートに Export。
 Export 後のスプレッドシートをCSV化したデータを入力データとしています。
 Search Analytics for Sheets - Google スプレッドシート アドオン の使い方は、
 サーチコンソールの詳細データをGoogleスプレッドシートに自動反映させてTableauにインポートする方法 :: 「清水 誠」公式サイト
 が参考になりました。
- 
学習データ 
 入力データの一部のキーワードを切り出し、別シートに貼り付け、人力で800キーワードくらいを分類しました。
 それを、tsv 出力したものを学習データとしています。
 以下、学習データとして作成したtsvを一部抜粋しテーブル形式に変換したものになります。Query label_name sonarqube sonarqube no module named python (1_8.w001) the standalone template_* settings were deprecated in django 1.8 django //nosonar sonarqube 404 エラー 404 404エラー 404 404エラーページ 404 
検索キーワードの分類について
ハイボールを飲みながら、実装していたのですが久しぶりで、何をやっているのかよくわからなくなっていたので、自分自身のためにまとめておきます。 
ここでは、自サイトのキーワード分類について言及します。   
分類、クラスタリングするとわかること
- 
自サイトがどのようなコンテキストで閲覧されているかを知れる。 
 集計結果により、自サイトがどのようなコンテキストで検索、閲覧されているのかを知ることができます。
 狙った分類での検索数が少なかったり、多かったり、目指すところと現実での差分がわかるのではないかと思います。
- 
クラスタリングして認知していなかった分類を発見する 
 自動分類で、今まで認知していなかった分類を発見することができます。
 自分が伺い知らぬコンテキストで検索、閲覧されていたなどがわかるのではないかと思います。
一般的なテキスト分類手法
文書分類 - Wikipedia には、以下が記載されています。
検索キーワードの分類手法
検索キーワードの分類手法として調べた限り、以下のような方法がありました。 
実学に基づいていたり、機械学習を使っていたりします。  
- 
Excel マクロ、手作業での仕分け の合わせ技 
 以下、記事が参考になりました。キーワードに対してカテゴリを紐づけ、マクロを駆使して分類を実施しています。
 検索キーワードを自動分類して“ざっくり”分析するExcelの秘蔵テクニック 第8回 | 1万円で真似できる“戦略的サイト運用術” - 小さく作って速く改善 | Web担当者Forum
- 
機械学習での分類 (Webサービスを使う) 
 検索キーワード Machine Learning | Microsoft Azure を使って、検索キーワードを分類する方法の説明があります。
 【SEO・SEM】機械学習でキーワードのグルーピングを自動化 | Core Marketing Blog
- 
KMeans クラスタリング での分類 
 以前、sklearn の KMeans を使って、キーワード分類をしてみました。
 Google Search Console の キーワードを python でクラスタリングする。 | Monotalk
- 
KH Coder による キーワード分類 
 私は使用したことがないですが、KH Coder - Wikipediaを使うと、共起ネットワーク図や、クラスタリング等いろいろできるようです。
キーワード分類に scikit-learn を用いる前提で、 scikit-learn をざっくり知れるわかりやすい情報
以下、チートシートがわかりやすいです。 
素人なので、データ量でおすすめ分類手法が変わるのは知らなかったです。 
regression は回帰(分析)、dimension reduction は次元削減 と英語がわからず調べてしまいました。    
キーワード分類 「したい」人が python 触れるのか?
一般的にどうなのかはちょっとわかりませんが、個人的な経験からだとここは、「NO」です。  
ディレクションやる人は、デザイナ上がりの人が多い気がして、行動分析とか、データ系のところからアプローチする人はあまりいないんですかね? 会社によりけり?   
以上、キーワード分類について、考えた結果になります。
実装
作ったものは以下になります。
- search_console_naive_bayes_classsifier.py   
 # -*- coding: utf-8 - from __future__ import print_function from sklearn.naive_bayes import MultinomialNB from sklearn.feature_extraction.text import CountVectorizer import search_console_classifier_utils as utils import numpy as np def __get_max_label(array, score): index = 0 max_value = 0 for i in range(len(array)): item = array[i] if max_value < item: max_value = item index = i return {score[index]: max_value} def main(): # ---------------------------------------------------------------------------- # 1. 学習データと、サーチコンソールからの取得結果のキーワードをマージ、キーワード内の単語の出現頻度を数えて、結果を素性ベクトル化する。 # ------------------------------------------------------ keywords = [] # 学習データからキーワードを取得 for line in utils.read_from_learning_tsv(0): keywords.append(utils.exclude_stop_words(line)) # CSVからキーワードを取得 for line in utils.parse_report_tsv(): keywords.append(utils.exclude_stop_words(line)) # テキスト内の単語の出現頻度を数えて、結果を素性ベクトル化する(Bag of words) count_vectorizer = CountVectorizer() # csr_matrix(疎行列)が返る feature_vectors = count_vectorizer.fit_transform(keywords) # 学習したデータのみ切り出し learning_vectors = feature_vectors[:len(utils.read_from_learning_tsv(0))] # データに対応したラベルを取得 learning_labels = np.array(utils.read_from_learning_tsv(1)) # ---------------------------------------------------------------------------- # 2. ナイーブベイズ "MultinomialNB" で学習 # ------------------------------------------------------- clf = MultinomialNB() # 学習 clf.fit(learning_vectors, learning_labels) print("--------------------------------") print(clf.score(learning_vectors, learning_labels)) print("--------------------------------") # -------------------------------------- # 3. スコア算出&ラベリング # -------------------------------------- scores = clf.predict_proba( feature_vectors[len(utils.read_from_learning_tsv(0)):]) classes = clf.classes_ labels = [] for score in scores: max_dict = __get_max_label(score, classes) for k, v in max_dict.items(): if v > 0.50: # 0.50 より大きい場合、ラベルを設定 labels.append(k) else: # 上記以外の場合は、"unknown" labels.append("unknown") # スプレッドシート更新 utils.update_labels(labels) if __name__ == '__main__': main()
説明
- 各種ライブラリのインストール
 必要なライブラリをインストールしてください。
 gspreadは分類処理自体には必要ないですが、Googleスプレッッドシートからデータを取得するのに必要になります。
pip install sklearn numpy gspread    
- 
search_console_classifier_utils.py について 
 Google Search Console の キーワードを python sklearn RandomForestClassifier でクラス分類してカテゴリ分けする | Monotalk に記載していますのでそちらを参照ください。
- 
1. 学習データと、サーチコンソールからの取得結果のキーワードをマージ、キーワード内の単語の出現頻度を数えて、結果を素性ベクトル化する。 
 Google Search Console の キーワードを python sklearn LinearSVC でクラス分類してカテゴリ分けする | Monotalkとやり方は一緒なので、そちらをご確認ください。
- 
2. ナイーブベイズ “MultinomialNB” で学習 
 Google Search Console の キーワードを python sklearn LinearSVC でクラス分類してカテゴリ分けする | Monotalkと同様の手順で解析自体はできてしまいます。
 scikit-learn によるナイーブベイズ分類器 - Qiita
 INPUTに考えたのですが、GaussianNB、BernoulliNB、MultinomialNBを卓上理論上使うのが正しいのか理解できておらず、とりあえず、何かのsampleコードから拝借したMultinomialNBを使っております。
 分類クラスを変える、かつ、パラメータをいじると分類性能は上がったり、下がったりするのかと思います。
 新はてなブックマークでも使われてるComplement Naive Bayesを解説するよ - 射撃しつつ前転を読んだのですが、なるほどと思ったものの実装にはとても落としこめず、奥が深すぎてとりあえず、デフォルトで動かしております。
 定性的に見た感じだと、LinearSVC、RandomForestClassifierよりもいい感じに分類できているように見えます。
- 
3. スコア算出&ラベリング 
 こちらは、 Google Search Console の キーワードを python sklearn LinearSVC でクラス分類してカテゴリ分けする | Monotalkと同様なので割愛します。
 手続き的には、LinearSVCとほぼ同様で、APIのクラス名を変更すれば、そのまま動きます。
参考
以下、参考にした記事になります。
まだ、他の分類APIもあるので、後日試してみようかと思います。   
使うことはできますが、意味を理解して効果的に使うのは難しいです。     
以上です。
コメント