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

# やってみたこと

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

# アルゴリズム

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


# 結果

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






```shell-session:
$ python3 cooccur.py 東ロボ　偏差値
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/a957cff8-6016-1931-adfb-63a4c1ffb0cb.png)

- 出力結果

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

ため | 7 

東大 | 7 

試験 | 6 

東 | 5 

の | 5 

年 | 5 

記事 | 5 

くん | 5 

単語 | 5 

こと | 5 

見る | 5 

ロボ | 5 

夫 | 4 

的 | 4 

人 | 4 

妻 | 4 

突破 | 4 

学 | 4 

いる | 4 

-----------------------------------------------------------------------
[INFO]タイトル：ＡＩで東大合格断念　「東ロボくん」偏差値伸びず　　：日本経済新聞 :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]タイトル：「東ロボくん」偏差値横ばい「５７」　人工知能、東大合格は断念 - 産経ニュース :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]タイトル：ＡＩプロ「東ロボくん」、東大諦めたら偏差値急上昇　数学４４．３→７６．２に (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](https://qiita-image-store.s3.amazonaws.com/0/134704/7ec454e7-cd30-33c3-a74a-393c4f6a539c.png)

# 実装

- 形態素解析ライブラリJanome
- スクレイピングツールSelenium
- 細かい環境とかブログとか、コードの解説はブログで。


```python: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