やってみたこと
- Googleで特定の言語を検索したときに、その語句の共起語を表示するツールの作成
- SEO対策で上位表示されるためには、共起語の出現頻度を上げるといいとか聞いたので。
アルゴリズム
- コマンドライン引数に、検索語句を入力する 例「東ロボ 偏差値」
- Google検索結果の上位10記事を取得する
- 一つ一つのページに入り、HTMLファイルのbodyの中を取得する
- 共起語を取得する
- 共起語をテキストファイルに保存する
- 最後のページまでおなじ動作を繰り返す
- テキストを保存して終了
結果
- 検索したクエリで、共起語を取得できている。
- 東大の研究所がやっている、ロボットによる大学受験プログラムなのだが、それに近い単語の表示頻度が多いことがわかる。
- ページによってはエラーが出てスキップされてしまっているので改善が必要
- 内容語ではない名詞や動詞が含まれている(する、れる等)ので、もう少し改善が必要
$ python3 cooccur.py 東ロボ 偏差値
- 出力結果
[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
-----------------------------------------------------------------------
実装
- 形態素解析ライブラリ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