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もあるので、後日試してみようかと思います。
使うことはできますが、意味を理解して効果的に使うのは難しいです。
以上です。
コメント