Python
自然言語処理
SEO
janome

Pythonで、SEO対策用の共起語特定ツールを作成してみた。Selenium | Janome

More than 1 year has passed since last update.

やってみたこと

  • Googleで特定の言語を検索したときに、その語句の共起語を表示するツールの作成
  • SEO対策で上位表示されるためには、共起語の出現頻度を上げるといいとか聞いたので。

アルゴリズム

  • コマンドライン引数に、検索語句を入力する 例「東ロボ 偏差値」
  • Google検索結果の上位10記事を取得する
  • 一つ一つのページに入り、HTMLファイルのbodyの中を取得する
  • 共起語を取得する
  • 共起語をテキストファイルに保存する
  • 最後のページまでおなじ動作を繰り返す
  • テキストを保存して終了

結果

  • 検索したクエリで、共起語を取得できている。
  • 東大の研究所がやっている、ロボットによる大学受験プログラムなのだが、それに近い単語の表示頻度が多いことがわかる。
  • ページによってはエラーが出てスキップされてしまっているので改善が必要
  • 内容語ではない名詞や動詞が含まれている(する、れる等)ので、もう少し改善が必要
$ python3 cooccur.py 東ロボ 偏差値

image.png

  • 出力結果
[INFO]タイトル:「東ロボくん」が偏差値57で東大受験を諦めた理由 | DOL特別レポート | ダイヤモンド・オンライン :1位
する | 15 

ため | 7 

東大 | 7 

試験 | 6 

東 | 5 

の | 5 

年 | 5 

記事 | 5 

くん | 5 

単語 | 5 

こと | 5 

見る | 5 

ロボ | 5 

夫 | 4 

的 | 4 

人 | 4 

妻 | 4 

突破 | 4 

学 | 4 

いる | 4 

-----------------------------------------------------------------------
[INFO]タイトル:AIで東大合格断念 「東ロボくん」偏差値伸びず  :日本経済新聞 :5位
日経 | 25 

する | 23 

情報 | 13 

円 | 8 

会員 | 8 

有料 | 8 

限定 | 7 

合格 | 7 

企業 | 6 

値 | 6 

接待 | 6 

電子 | 6 

一覧 | 6 

版 | 6 

偏差 | 5 

イベント | 5 

試験 | 5 

東 | 5 

東京 | 5 

模試 | 5 

-----------------------------------------------------------------------
[INFO]タイトル:東ロボくん - Wikipedia :6位
する | 21 

大学 | 16 

同上 | 12 

東大 | 11 

編集 | 10 

研究 | 10 

値 | 9 

偏差 | 9 

情報 | 9 

くん | 8 

東 | 8 

合格 | 8 

ロボット | 8 

研究所 | 8 

国立 | 8 

ロボ | 8 

入れる | 7 

人工 | 7 

いる | 7 

模試 | 7 

-----------------------------------------------------------------------
[INFO]タイトル:「東ロボくん」偏差値横ばい「57」 人工知能、東大合格は断念 - 産経ニュース :8位
[INFO]タイトル:ロボットは東大に入れるか。Todai Robot Project :9位
する | 12 

プロジェクト | 10 

新聞 | 8 

れる | 7 

年度 | 6 

研究 | 5 

掲載 | 5 

面 | 5 

件 | 5 

的 | 4 

ロボ | 4 

成果 | 4 

東 | 4 

こと | 4 

月日 | 4 

日経 | 4 

付 | 4 

産業 | 4 

朝刊 | 4 

試験 | 3 

-----------------------------------------------------------------------
[INFO]タイトル:AIプロ「東ロボくん」、東大諦めたら偏差値急上昇 数学44.3→76.2に (1/2ページ) - SankeiBiz(サンケイビズ) :4位
する | 13 

円 | 7 

氏 | 6 

問題 | 6 

模試 | 6 

東大 | 6 

数学 | 6 

企業 | 5 

情報 | 5 

車 | 5 

一覧 | 5 

日本 | 5 

兆 | 5 

スポーツ | 4 

偏差 | 4 

ソフトバンク | 4 

マテ | 4 

一 | 4 

いる | 4 

値 | 4 

-----------------------------------------------------------------------
[INFO]タイトル:【やじうまPC Watch】東大をあきらめた“東ロボくん”の偏差値が急上昇 ~東大模試数学で偏差値44.3から76.2に - PC Watch :5位
[INFO]タイトル:「AIの性能を上げている場合ではない」──東ロボくん開発者が危機感を募らせる、AIに勝てない中高生の読解力 - ITmedia NEWS :6位
する | 47 

いる | 16 

の | 12 

問題 | 12 

ある | 12 

新井 | 11 

教授 | 11 

東 | 10 

ロボ | 10 

東大 | 10 

こと | 10 

くん | 9 

文 | 9 

サイト | 9 

できる | 8 

情報 | 8 

理解 | 8 

割 | 8 

中高生 | 8 

企業 | 7 

-----------------------------------------------------------------------
[INFO]タイトル:「東ロボくん」、東大合格を断念 苦手科目を克服できず:朝日新聞デジタル :8位
[INFO]タイトル:国立情報学研究所の人工知能プロジェクト「ロボットは東大に入れるか」で数学と物理の偏差値を大幅に向上! : 富士通 :9位
する | 63 

問題 | 33 

処理 | 24 

技術 | 22 

研究所 | 22 

模試 | 19 

情報 | 18 

数学 | 18 

値 | 17 

開発 | 16 

偏差 | 16 

富士通 | 16 

物理 | 15 

研究 | 15 

言語 | 15 

東大 | 13 

入試 | 12 

数式 | 12 

大学 | 12 

国立 | 12 

-----------------------------------------------------------------------

image.png

実装

  • 形態素解析ライブラリJanome
  • スクレイピングツールSelenium
  • 細かい環境とかブログとか、コードの解説はブログで。
cooccur.py
import sys
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.tokenfilter import *

import re
import nltk


def filterText(text):
   """
   :param text: str
   :rtype : str
   """
   # アルファベットと半角英数と記号と改行とタブを排除
   text = re.sub(r'[a-zA-Z0-9¥"¥.¥,¥@]+', '', text)
   text = re.sub(r'[!"“#$%&()\*\+\-\.,\/:;<=>?@\[\\\]^_`{|}~]', '', text)
   text = re.sub(r'[\n|\r|\t]', '', text)

   # 日本語以外の文字を排除(韓国語とか中国語とかヘブライ語とか)
   jp_chartype_tokenizer = nltk.RegexpTokenizer(u'([ぁ-んー]+|[ァ-ンー]+|[\u4e00-\u9FFF]+|[ぁ-んァ-ンー\u4e00-\u9FFF]+)')
   text = "".join(jp_chartype_tokenizer.tokenize(text))
   text = text.replace(" ", "")
   text = text.replace(" ", "")
   return text

if __name__ == '__main__':
    browser = webdriver.Chrome(executable_path='/mnt/c/workspace/pydev/chromedriver.exe')#Selenium Chromedriverにパスを通す
    browser.get("https://www.google.co.jp/")
    print("[INFO]Googleにアクセスしました")
    query = ""
    argvs = sys.argv  # コマンドライン引数を格納したリストの取得
    if len(argvs) > 1:
        for argv in argvs[1:]: # 検索語句が複数の場合は、それを全部渡す
            query +=  argv + " "
    else:
        query = argvs[0]
    print("[INFO]「{}」で検索しています....".format(query))
    element = browser.find_element_by_id("lst-ib")
    element.send_keys(query) #クエリを入力
    element.send_keys(Keys.ENTER) #Enterキーを押下する
    print("[INFO]検索に成功しました")
    f = open("{}.csv".format(query), 'w') #共起語レポートの作成

    urlsList = [] #ここに変数を格納しないと覚えておいてくれない

    urls = browser.find_elements_by_css_selector("h3.r a")
    print(len(urls))
    for url in urls:
        urlsList.append(url.get_attribute("href"))

    print("[INFO]{}件の検索結果が見つかりました。".format(len(urlsList)))
    count = 1
    for url in urlsList:
        try:

            browser.get(url)
            print("-----------------------------------------------------------------------")
            print("[INFO]{}ページ目にアクセスしました".format(count))
            title = "[INFO]タイトル:{} :{}位".format(browser.title,count)
            f.write(title) # 引数の文字列をファイルに書き込む

            text = browser.find_element_by_css_selector("body").text
            print("[INFO]HTMLを取得しました。")
            print("---------------------------------------")
            filterdText = filterText(text)

            print(filterdText)
            print("---------------------------------------")
            token_filters = [POSKeepFilter(['名詞','動詞']), TokenCountFilter(att='base_form')]
            a = Analyzer(token_filters=token_filters)
            top_words = list(a.analyze(filterdText))[:20]
            print("[INFO]共起語を取得しています。")
            print("-----------------------------------------------------------------------")
            for name, count in top_words:
                output = "{} | {}".format(name,count)
                print(output)
                f.write(output)
            print("-----------------------------------------------------------------------")
        except Exception as e:
            "[ERROR] 共起語を見つけられませんでした。"
        count += 1
    f.close() # ファイルを閉じる    

ブログも見てね

【Python】SEO対策向けの共起語取得ツールを作ってみた Selenium + Janome
https://review-of-my-life.blogspot.jp/2017/11/pythonseo-selenium-janome.html