Ubuntu Weekly Recipe

第600回 【連載600回記念特別企画】第500回から現在までのアクセスランキング

この記事を読むのに必要な時間:およそ 8 分

トップ10の頻出単語をチェック

タグだと登場回数が少ないようなので,初週と累計の双方のトップ10に入った14件の記事本文にある単語の頻度を調べてみましょう。

まずあらかじめ該当する記事のHTMLファイルをダウンロードしておきます。これに関しては各自「ウェブスクレイピング」などでウェブを検索してください。ここでは該当する記事のすべてのページのHTMLファイルがローカルディレクトリにあるものとします。

次にpip3コマンドとHTMLパーサーとしてBeautifulSoup形態素解析器としてjanomeを使うことにします。BeatifulSoupはpython3-bs4パッケージでもインストールできるのですが,janomeはUbuntuのリポジトリになかったのでどちらもpip3でインストールすることにしました。

それぞれ次のようにインストールしてください。

$ sudo apt install python3-pip
$ pip3 install beautifulsoup4 janome

今回は名詞のみをリストアップし,その頻度情報を確認します。よって次のようなPythonコードを適当なファイル名(ここではnoun_freq.pyとします)で保存してください。

#!/usr/bin/env python3

import glob
from bs4 import BeautifulSoup
from janome.tokenizer import Tokenizer

def parser():
    articles = ''
    for n in glob.glob('./*.html'):
        with open(n) as f:
            html = BeautifulSoup(f.read(), 'html.parser')
            articles += html.find("div", class_="readingContent01").get_text()

    t = Tokenizer()

    nouns = {}
    for line in articles.splitlines():
        tokens = t.tokenize(line)
        for token in tokens:
            if token.part_of_speech.find('名詞') != -1:
                if token.surface in nouns:
                    nouns[token.surface] += 1
                else:
                    nouns[token.surface] = 1

    keys = sorted(nouns.items(), key=lambda x:x[1], reverse=True)
    for word, cnt in keys:
        print('"{0}" ({1})'.format(word, cnt))

if __name__ == "__main__":
    parser()

本連載のHTMLファイルでは本文部分が<div class="readingContent01 autopagerize_page_element" itemprop="articleBody"></div>で囲われているようです。よってBeatifulSoupでこの部分だけを取り出したあと,get_text()メソッドで文字列化しています。もう少しまじめにやるなら,この本文部分をさらにHTMLタグごとに除外するかどうかを検討すべきでしょう。

該当する記事のすべてのデータが文字列化されてarticlesに格納されます。次はこれを1行ずつjanomeのTokenizer::tokenize()で解析していきます。token.part_of_speechには品詞のリストが文字列で入っていますので,この中に「名詞」が含まれるものだけを,単語辞書に登場回数とともに格納しています。力技です。

あとは登場回数の順番で辞書をソートして,降順に表示しているだけです。次のように実行すれば頻度情報を取得できます。

$ python3 noun_freq.py > wordrank.txt

ぜんぶで3447単語あるようです。

$ wc -l wordrank.txt
3447 wordrank.txt

上位10単語を表示してみましょう。

$ head wordrank.txt
"." (647)
"-" (540)
"/" (426)
"1" (271)
"Ubuntu" (219)
"2" (194)
":" (189)
"図" (186)
"3" (169)
"こと" (146)

独立した記号類も含まれているので,あまり意味のある結果になっていませんね。⁠図」が多いのは,本連載ではスクリーンショットを「図n:キャプション」のように載せるためです。これについても本格的に調べるのであれば,特定のHTMLタグのテキストを除外したり,単語の長さでフィルタリングするなど,何らかの形でクリーニングすることになるでしょう。

アルファベットで始まる英単語だけ取り出してみると次のようになります。

$ grep '"[a-zA-Z][a-zA-Z0-9]\+"' wordrank.txt | head -n 20 | nl -w 4
   1    "Ubuntu" (219)
   2    "LTS" (72)
   3    "gnome" (61)
   4    "USB" (50)
   5    "PC" (42)
   6    "sudo" (42)
   7    "GNOME" (40)
   8    "microk" (40)
   9    "CPU" (36)
  10    "nginx" (35)
  11    "Jetson" (29)
  12    "Ryzen" (29)
  13    "kB" (29)
  14    "RealSense" (28)
  15    "Linux" (27)
  16    "Nano" (26)
  17    "pts" (25)
  18    "apt" (25)
  19    "Intel" (25)
  20    "microSD" (24)

圧倒的に「Ubuntu」が多いのは当然でしょう。次点が「LTS」であるのも,ランキングに入った記事のカテゴリーを考えると妥当です。⁠gnome」「GNOME」は計測する次点で正規化しておけば第2位になっていた単語です。これはリリース時の新機能・変更点の記事においてGNOMEが紹介されるだけでなく,パッケージ名としても「gnome-FOO」なものが紹介されるために頻度が多くなっているようです。

あとは似たりよったりといったところでしょうか。⁠nginx」はKubernetesの記事でnginxコンテナをレプリカ数3でデプロイしていることが主要因です。⁠pts」はRyzenの記事で使用した「Phoronix Test Suite」の実行結果によるものだと考えられます。

ちなみにリリースパーティの記事が入っているということは「からあげ」も入っているはずです。確認してみましょう。

$ grep -n "からあげ" wordrank.txt

残念ながら1件も見つかりませんでした。どうやらjanomeの辞書だと「からあげ」を名詞としては見てくれないようです。

$ python3 -c 'from janome.tokenizer import Tokenizer;t=Tokenizer();tokens=t.tokenize("からあげ");[(print(k)) for k in tokens]'
から    助詞,格助詞,一般,*,*,*,から,カラ,カラ
あげ    動詞,自立,*,*,一段,連用形,あげる,アゲ,アゲ
$ python3 -c 'from janome.tokenizer import Tokenizer;t=Tokenizer();tokens=t.tokenize("唐揚げ");[(print(k)) for k in tokens]'
唐      名詞,一般,*,*,*,*,唐,トウ,トー
揚げ    名詞,接尾,一般,*,*,*,揚げ,アゲ,アゲ
$ python3 -c 'from janome.tokenizer import Tokenizer;t=Tokenizer();tokens=t.tokenize("唐揚");[(print(k)) for k in tokens]'
唐      名詞,一般,*,*,*,*,唐,トウ,トー
揚      名詞,固有名詞,地域,一般,*,*,揚,アゲ,アゲ
$ python3 -c 'from janome.tokenizer import Tokenizer;t=Tokenizer();tokens=t.tokenize("カラアゲ");[(print(k)) for k in tokens]'
カラアゲ        名詞,固有名詞,組織,*,*,*,カラアゲ,*,*

janomeはユーザー定義辞書にも対応しているので,必要に応じて単語を追加すると良いでしょう。

干支が一周した本連載をこれからもご贔屓に

2020年1月で本連載も12周年を迎えます。2008年が子年なのでとうとう干支を一周しました。日本なら小学校を卒業し,中学生になる年です。つまり本連載もそろそろ自意識が芽生え,思春期特有のアレな行動が強くなる時期でもあります。すでに発現しているのではないかという意見はあるものの,今後そういう兆候が見受けられるようでしたら,大人である読者の皆様におかれましては,暖かく見守っていただけると幸いです。

ちなみに姉妹連載であるUbuntu Weekly Topicsも同じく12周年を迎えます。こちらは実質吉田さん1人で週刊連載を支えている状況です。本連載ともども,励ましのお便りをぜひお寄せいただければと思います。

ここ数年は,一年ごとにUbuntu Weekly Recipeに掲載されたすべての記事のまとめをQiitaに投稿しています。たとえば2018年版はAnnual Report of the Ubuntu Weekly Recipe 2018です。2019年版も今年中に掲載する予定ですので,過去の記事を振り返りたいならば,せひそちらも参考にしてください。

来年以降の本連載もよろしくお願いいたします。それでは皆様,良いお年をお迎えください。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。