【SEO対策】知らない言葉をwikipediaのキーワードだけで推測できるか


# はじめに
**膨大な量の文章がネットの海に公開されている時代です。**
ページにたどり着いてもそのページに何が書かれているかは、読まないとわかりません。
そこでキーワードだけ抽出して並べたらページの要約として使えないか？と思いました。
もちろんキーワードを並べるだけではわかりません。
人的推理が必要ではありますが、なんとなくどういったことが書かれているかは把握できると思いました。

**最近は意味の薄い文章を書き並べ「いかがでしたか？」で無理やりいい感じに終わらせるページもたまに目にします。**
せっかく時間をかけて読んだのに、結局何もわからないというのが精神的につらいとよく聞きます。


**キーワードを抽出することで人間がページを理解する補助にならないか試してみました。**

#結果
Wikipediaから適当にページを選びます。
今回は**「アーサー・オンズロー」**というページを選びました。
アーサー・オンズローが何なのかはこの時点で僕はわかっていません。



**結果としてはキーワードを眺めるだけでその単語を何となく理解できるということがわかりました。**
![コマンド-プロンプト-2019_02_22-17_52_38 (1).gif](https://qiita-image-store.s3.amazonaws.com/0/277931/21b3f509-f6df-cd12-cd61-182af39e691b.gif)
スクリプト実行画面

スクリプトについては結果の後にソースコードを記載しておきます。
機能としては指定したurlをスクレイピングしてテキスト情報を取得します。
取得後は形態素解析をかけ出現回数の多い順にソートし出力します。

スクリプトを回してみて思ったのですが、数字や記号が混じって見にくかったです。
不要な記号や数字を除外するコードを追加してみるといいかも・・・。
形態素解析ライブラリはjanomeを使ったのですが
それだとそういったものも名詞としてカウントされるご様子です。

なので結果をExcelにコピペして
**数字や記号は除外してみた結果が以下になります。**


```html:
年	92
英語	61
オンズロー	36
月	36
庶民	24
院	24
選挙	14
区	12
編集	12
ギルフォード	11
議員	10
議長	9
ジョージ	9
選出	8
ページ	6
1728    7
アーサー	5
事典	5
家	5
イギリス	5
ウォルポール	5
サリー	5
識別子	5
指定	5
記事	5
世	4
者	4
評価	4
長男	4
ため	4
リチャード・オンズロー	4
就任	4
演説	4
支持	4
法案	4
リチャード	4
文書	4
集	4
議会	4
郵政　　3
```

これを見て僕が注目したのがこれらの単語です。

```html:
院	24
選挙	14
区	12
議員	10
議長	9
選出	8
1728    7
イギリス	5
・・・
就任	4
演説	4
支持	4
法案	4
議会	4
郵政  3
```

ここからアーサー・オンズローとは何なのかを推理していきます。
**まず選挙、議員という単語から「アーサー・オンズロー」は選挙関係の言葉という推論が立ちます。**
次に「アーサー・オンズロー」が人なのか物なのかということですが、
これについては「選出」という言葉があるため、**議員に選出された「人」ではないかという推論も同時に立ちます。**

そして地名と年代ですが「イギリス」「1728」という単語もあることから、
**イギリス人で1700年代に活躍した人物ではないかと思われます。**

最後に「郵政」とあることから郵便事業に馴染み深い人物だと思われます。
**まとめると「アーサー・オンズローは18世紀ごろにイギリスで議員を務め、郵政事業に勤しんだ人物である」ということが推理できました。**

#答え合わせ
アーサー・オンズローのページ
https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%BC%E3%82%B5%E3%83%BC%E3%83%BB%E3%82%AA%E3%83%B3%E3%82%BA%E3%83%AD%E3%83%BC
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Arthur_Onslow_by_Hans_Hysing.jpg/220px-Arthur_Onslow_by_Hans_Hysing.jpg" width="250">
アーサー・オンズローさん(1691年10月1日~1768年2月17日)

ということで答え合わせしていきたいと思います。
僕がおこなった人的推理としては「18世紀ごろにイギリスで議員を務め、郵政事業に勤しんだ人物である」というものです。

18世紀ごろ　〇
イギリスで　〇
議員を務め　〇
郵政事業に勤しんだ　×
人物　〇

上記のような結果になりました。
ちなみに「郵政」についてはwikipediaにこのような記述がありました。
「1715年に伯父が離任すると、**郵政**収入役の職を得た。また1719年にはギルフォードの市裁判所判事になった。1720年2月の補欠選挙でギルフォード選挙区（英語版）からホイッグ党の候補として当選すると、庶民院議員と**郵政**収入役を同時に務めることができなかったため、**郵政**収入役を弟のリチャード・オンズローに譲った」

要約すると「議員と郵政収入役を掛け持ちできなかったので別の人に譲った」ということらしいです。
ちなみに郵政収入役とは日本で言う地方の出納長だそうです。

ここだけ推理は外れてしまいました。

###結果からの考察
キーワードを抽出して推論するということを初めてやりましたが、
大きな外れはなく、推理できたのではないかと思います。
**キーワードはその単語の意味を理解するのに重要なものだということがわかりました。**

ここで気になるのがGoogleがこれをおこなっているかどうかです。

単語の意味、文章の意味を深く知ろうとしているのはおそらく世界的に見てGoogleが一番進んでいると思います。
検索結果を表示するアルゴリズムをGoogleは公表していませんが、
**セマンティックWebの技術者を募集していたあたり、
これに近いことをしていると思います。**
（セマンティックWebとは単語の意味を理解する技術のこと）

キーワードが大量に出現するサイトが上位表示されていたのはすでに過去の話ですが、
キーワード数が多ければその単語に関して造詣が深いページとして評価されるかもしれません。

**キーワードの出現率は今だ重要なのかなと思っていたりします。（やりすぎはダメ）**

#作成したスクリプト

```python:morphological.py
import requests
import pandas as pd
from bs4 import BeautifulSoup
import sys
import pyperclip
# python解析器janomeをインポート - 1
from janome.tokenizer import Tokenizer

def text_mining(original_text):
    # 形態素解析用オブジェクトの生成 - 2
    text = Tokenizer()
    # データの読み込み
    txt = original_text
    print("読み込み完了--------------------")
    

    word_dic = {}
    lines_1 = txt.split("\r\n")
    #1行ごとに解析開始 -5
    print("text.tokenize開始--------------------")
    for line in lines_1:
        malist = text.tokenize(line)
        for w in malist:
            word = w.surface
            ps = w.part_of_speech # 品詞 - 6
            if ps.find("名詞") < 0: continue # 名詞だけをカウント - 7
            if not word in word_dic:
                word_dic[word] = 0
            word_dic[word] += 1
    print("解析完了--------------------")
    # よく使われる単語を表示 - 8
    keys = sorted(word_dic.items(), key=lambda x:x[1], reverse=True)
    for word, cnt in keys[:100]:
        print("{0}({1}) ".format(word,cnt))



if __name__ == '__main__':
    if len(sys.argv) > 1:#urlの受け取り(引数から。なければクリップボードから)
        search_url= ' '.join(sys.argv[1:])
    else:
        search_url= pyperclip.paste()
    print(search_url)
    html=requests.get(search_url).text
    soup=BeautifulSoup(html,"html.parser")
    for script in soup(["script", "style"]):#不要なscriptやstyleを含む要素を削除
        script.decompose()
    text=soup.get_text()#テキストのみ取得
    lines= [line.strip() for line in text.splitlines()]#textを改行ごとにリストに入れて、リスト内の要素の前後の空白を削除
    text="\n".join(line for line in lines if line)#空白以外の要素をすべて文字列に戻る
    print(text)
    text_mining(text)
```

使用した形態素解析ライブラリはjanome
テキストマイニングはBeautifulSoupです。
必要なものはpipでインストールしてください。


##使い方
```
python morphological.py https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%BC%E3%82%B5%E3%83%BC%E3%83%BB%E3%82%AA%E3%83%B3%E3%82%BA%E3%83%AD%E3%83%BC
```
またはurlをコピーしている状態で以下のコードを実行

```
python morphological.py 
```

pyperclipというクリップボードの情報を取得するものを使っています。
何回もコマンドラインにurlをコピペするのが面倒だったのでurlをコピーして
実行するだけで動くようにしました。

pyperclipをいれるのが面倒という人がいたら、その部分のコードを削除してお使いください。

# 参考文献
https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%BC%E3%82%B5%E3%83%BC%E3%83%BB%E3%82%AA%E3%83%B3%E3%82%BA%E3%83%AD%E3%83%BC
https://qiita.com/itkr/items/513318a9b5b92bd56185

▼運営サイト一例
[引っ越し見積もりサイト：引越し侍](https://hikkoshizamurai.jp/ "引越し侍")
[同市内など近距離の引越し見積もりを安くする方法：引越し侍](https://hikkoshizamurai.jp/estimate/short/ "引越し侍")
[インターネット・プロバイダ比較サイト：Proval：引越し侍](https://internet-connect.net/ "Proval")
[シロアリ駆除・工事・修理のプロ探し：ファインドプロ：引越し侍](https://findpro.jp/ "ファインドプロ")
[エアコン取り付け工事サイト：エアコンサポートセンター](https://エアコン取り付け工事.net/ "エアコンサポートセンター")
「SEOの研究をしたい！」
「複数のサイトのSEOを担当したい！」
そんな方は、ぜひエイチーム引越し侍の採用サイトにご連絡ください。

皆さんのご連絡をお待ちしております！！

[採用サイトはこちら](http://www.a-tm.co.jp/recruit/requirements/career/ "採用サイト")