Python
スクレイピング
形態素解析

就活のためのキーワード収集

目的

就活で履歴書やエントリーシートで何を書こうと悩んだ時に,キーワードとなる単語があれば書きやすいかなと思いました.なので企業のサイトをスクレイピングして,形態素解析にかけ,出現頻度の高い単語をリストアップしようと考えました.

結論から言うと,微妙な結果に終わりました.

実行環境

Ubuntu 16.04.4 LTS
Python 3.5.2

スクレイピング

スクレイピングするサイトはfreee株式会社の新卒採用ブログです.このサイトを選んだ理由はこの会社を志望しているからです.これを書いている今,1時面接の結果待ちです.おちました.

freeeさんの新卒採用ブログの最新記事のurlを基点に記事を遡っていきます.一つ前の記事のaタグにはrel属性にprevが指定してありますので,そのurlを取得します.なければ終了です.このブログの本文はspanタグとbタグで囲まれているので,これを取得します.

Python3
import time
import urllib.request

from bs4 import BeautifulSoup

# 最初にアクセスするurl
url = 'http://jobs.freee.co.jp/recruitblog/aboutus/kauteishinkoku-freee-team/'

# 保存するcsvファイルを開く
f_span = open('freee_span.txt', 'a')
f_b = open('freee_b.txt', 'a')

while True:
    # urlにアクセスする htmlが帰ってくる
    html = urllib.request.urlopen(url)

    # htmlをbeautifulsoupで扱う
    soup = BeautifulSoup(html, 'html.parser')

    # spanとbタグの部分をすべて取得する
    span = soup.find_all('span')
    b = soup.find_all('b')

    # タグに囲まれた文字の部分を抽出します.抽出できない場合はスルーします.
    for tag in span:
        try:
            f_span.write(tag.string)
        except:
            pass
    for tag in b:
        try:
            f_b.write(tag.string)
        except:
            pass

    try:
        # 過去記事のurlを取得する.なければ終了する
        a = soup.find('a', rel='prev')
        url = a.attrs['href']
        time.sleep(1)
    except:
        print('すべて終了しました')
        break

形態素解析

次に形態素解析を行います.形態素解析はMeCabを使用しました.mecab-python3をインストールするのが一番苦労しました.やることはスクレイピングして得られた文章を形態素解析にかけ,名詞を抜き出し,重複をカウントして多い順に並べ替えることです.

python3
import MeCab

# 読み込みファイル,書き込みファイル
read_file = 'freee_b.txt'
write_file = 'freee_b_kaiseki.txt'

# ファイル読み込み
f = open(read_file, 'r')
data = f.read()
f.close()

# taggerはデフォルト,
tagger = MeCab.Tagger()
nones = []

# 名詞ならnonesに追加する
for chunk in tagger.parse(data).splitlines()[: - 1]:
    (surface, feature) = chunk.split('\t')
    feature = feature.split(',')[0]
    if feature == '名詞':
        nones.append(surface)

# 重複する要素を数え上げ,降順にソートする
rank = [[word, nones.count(word)] for word in set(nones)]
rank.sort(key=lambda x: x[1], reverse=True)

# 得られた結果をファイルに書き込む
f = open(write_file, 'w')
for element in rank:
    f.write(element[0] + ' ' + str(element[1]) + '\n')
f.close()

結果(一部)

正直参考になるとは思えない,微妙な結果に終わってしまいました.

text
freee 286
- 219
採用 162
こと 121
新卒 96
の 90
人 87
中途 74
エンジニア 61
さん 60
入社 58
インターン 55
的 53
ん 53
よう 53
会社 53
自分 48
年 45
チーム 41
仕事 37
1 35
開発 35
担当 34
月 32
成長 32
メンバー 31
内定 30
中 30
2017 30
者 29
営業 28
企業 28
何 27
社員 27
方 27
事業 26
会計 26
セールス 26
イベント 25
そう 25
後 22
私 22
ビジネス 21
笑 20
2016 20
今 20
経験 20
式 20

改善点

記号とか数字をそのままにしているので,取り除きたい.
多分大規模なデータだとメモリ足りないし,時間もかかる.
htmlの構造を読み解けばもっと良い収集の仕方があると思う.

感想

スクレイピングの本を1冊でも読んでおけば,もっといいのがかけたかもしれない.
もっといいやり方が有ればおしえてください.
自己PR自動生成やってみたい

参考

Python Webスクレイピング 実践入門 - Qiita
Python3でmecabを使う - Qiita
Python3で、urllibとBeautifulSoupを使ってWebページを読み込む
Pythonでリストの重複要素アレコレ - PY BLOG
PythonでのMeCabを速くするtips - Qiita
Pythonでテキストマイニング ①形態素解析(再:Linux版) - Qiita