検索キーワード を python sklearn の ナイーブベイズ分類 で カテゴリ分けする


Google Search Console の キーワードを python で カテゴリ分けしてみた結果を記載します。
今回は、ナイーブベイズ分類 を使います。


過去の記事


前提


検索キーワードの分類について

ハイボールを飲みながら、実装していたのですが久しぶりで、何をやっているのかよくわからなくなっていたので、自分自身のためにまとめておきます。
ここでは、自サイトのキーワード分類について言及します。

分類、クラスタリングするとわかること

  • 自サイトがどのようなコンテキストで閲覧されているかを知れる。
    集計結果により、自サイトがどのようなコンテキストで検索、閲覧されているのかを知ることができます。
    狙った分類での検索数が少なかったり、多かったり、目指すところと現実での差分がわかるのではないかと思います。

  • クラスタリングして認知していなかった分類を発見する
    自動分類で、今まで認知していなかった分類を発見することができます。
    自分が伺い知らぬコンテキストで検索、閲覧されていたなどがわかるのではないかと思います。

一般的なテキスト分類手法

文書分類 - 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    

参考

以下、参考にした記事になります。

まだ、他の分類APIもあるので、後日試してみようかと思います。
使うことはできますが、意味を理解して効果的に使うのは難しいです。
以上です。

コメント

カテゴリー