アゴ乗せ日記

適当なポジティブ日記

スポンサーリンク

はてなブログの記事をJanomeで形態素解析してワードクラウドで確認すんぜ

何言ってるかわからん!!

過去のおさらい

(1)ワードクラウドなるものを作って我がブログの検索キーワードを可視化

www.agonose-nikki.com

(2)はてなブログのAPIを使って過去記事の抽出

www.agonose-nikki.com

つまり


応用だよ応用!!

やっていく

今回もGoogle Colabで作っていく

やる場合は各手順ごとに
「+コード」ボタンでコードを追加して、▶︎の実行ボタンを押してってね。(実行の順番大事

f:id:agonosetaro:20200331194931p:plain

(1)必要なライブラリを追加

pip install wordcloud janome

(2)日本語対応(フォントの追加)

!apt-get -y install fonts-ipafont-gothic

(3)環境設定

import requests
import xml.etree.ElementTree as ET
import json
from bs4 import BeautifulSoup
import re
from janome.analyzer import Analyzer
from janome.tokenfilter import *
from wordcloud import WordCloud
from pathlib import Path
import os
import pandas as pd

# --------------------------------------------------
# ここ修正ください
# --------------------------------------------------
api_url = "https://blog.hatena.ne.jp/agonosetaro/agonosetaro.hatenablog.com/atom/entry"
auth = ('ユーザID', 'APIキー')
max_page_num = 1

api_urlauthの部分は はてなブログの管理画面から設定 > 詳細設定 > AtomPub と進み記載されている情報をコピペする。

詳しくは過去記事の「各ユーザごとに修正する部分」を参照

(4)過去記事取得

# --------------------------------------------------
# 記事の一覧を取得
# --------------------------------------------------
entries = []
cnt = 0
while True:
  res = requests.get(api_url, auth=auth)
  root = ET.fromstring(res.text)
  api_url = None

  for child in root:
      if 'rel' in child.attrib and child.attrib['rel'] == 'next':
        api_url = child.attrib['href']

      if child.tag.endswith('entry'):
        is_public = False
        title = None
        link = None
        content = None

        for item in child:
          if item.tag.endswith('control'):
            ctrl = child.find(item.tag)
            for item in ctrl:
              if item.tag.endswith('draft'):
                is_public = ctrl.find(item.tag).text == 'no'
          if item.tag.endswith('title'):
            title = child.find(item.tag).text
          if item.tag.endswith('content'):
            content = child.find(item.tag).text
          if item.tag.endswith('link') and 'rel' in item.attrib and item.attrib['rel'] == 'alternate':
            link = item.attrib['href']

        if is_public and title:
          entry = {
              'title': title,
              'link': link,
              'content': content
          }
          entries.append(entry)
  if not api_url:
    break
  cnt = cnt + 1
  if cnt >= max_page_num:
    break

pd.set_option("display.max_colwidth", 200)
pd.set_option('display.max_rows', max_page_num * 100)
pd.io.json.json_normalize(entries)

実行するとこのような結果が得られる。

f:id:agonosetaro:20200409095512p:plain

1番右のcontent(本文)の部分を解析するということだ。

(5)解析

ワードクラウドは単語ごとに文字を区切ってないとアカンので Janomeの形態素解析を使って本文を分割する。

ざっくり形態素解析を説明すると「意味のある単語ごとに文字を分割する」やっつ

# --------------------------------------------------
# 記事別ワードクラウド出力
# --------------------------------------------------
for entry in entries:
  print(entry)
  soup=BeautifulSoup(entry['content'], "html.parser")
  for script in soup(["script", "style", 'code', 'pre']):
    script.decompose()
  text=soup.get_text()
  text = re.sub('\(function.*}\);$',  '',  text, flags=(re.MULTILINE | re.DOTALL))

  token_filters = [POSKeepFilter(['名詞','動詞']),POSStopFilter(['記号', '助詞', '助動詞']), TokenCountFilter()]
  a = Analyzer(token_filters=token_filters)

  word_list = []
  for k, v in a.analyze(text):
    for i in range(v):
      word_list.append(k)

  keywords = ' '.join(word_list)
  print(keywords)
  # ワードクラウド作成
  word_cloud = WordCloud(  
      colormap='Set2',
      font_path='/usr/share/fonts/truetype/fonts-japanese-gothic.ttf',
      background_color="white",
      max_words=100,
      collocations = False,
      width=400,  
      height=300).generate(keywords)

  # ファイル出力
  word_cloud.to_file(os.path.join(Path().resolve(),   entry['title'] + ".png"))

実行すると画面左側のファイル欄に結果のpngファイルが出力される。

f:id:agonosetaro:20200409095937p:plain

確認してみる

pngファイルをダブルクリックで覗いてみる。

ケイスケホンダ

www.agonose-nikki.com

f:id:agonosetaro:20200409100554p:plain

おお。

「失敗」「熱量」「人間」「地球」などいい感じにキーワード分割されて表示されている。

やっぱGoogleはいいやつなのか?

www.agonose-nikki.com

f:id:agonosetaro:20200409100619p:plain

ドメインパワー!!

は「ドメイン」と「パワー」に分解されちゃってる。
まぁ形態素解析は辞書に登録されている単語で区切っちゃうのでしかたない。

この辺はユーザ辞書というカスタムした辞書を作ることによって精度をあげることができるので次回以降で対応していく。

おさらい

  • ワードクラウドは大量のワードを可視化するのに便利
  • Janomeは連続した文字列を意味のある単語単位で分割するのに使える
    • 形態素解析
  • 精度は上げれる

おわり

精度あげるのもそうだが、自分の癖だったり、文字から感情を読み取ることもできるのだ。

その辺面白そーでしょ?

以上!!

\ いつもスターやコメント、ブックマークありがとうございます! /
スポンサーリンク