mecab

MeCabでQiita記事タイトルの頻出パターン(例:◯◯で△△を□□する)を分析する

More than 1 year has passed since last update.

TL;DR

  • Qiita記事タイトルの頻出パターン(例:「◯◯で△△を□□する」「◯◯で△△の□□を✗✗する」)を分析してみた
  • 「What」に注目したタイトルと「How」に注目したタイトルに分かれることが判明した

背景

別件でQiitaに記事を投稿しようと思って記事を書いていたら、ふと「Qiitaの記事はどんなタイトルをつけるのが良いんだろう?」と気になってしまったので、記事タイトルの頻出パターンを分析してみることにしました。

実装

コード全文はGistに上げました。

1. 記事タイトルを集めよう

Qiita APIで新着記事を取れるだけ取ってきます。titleだけ取り出してファイルへ保存。

for i in $(seq 1 100); do; curl 'http://qiita.com/api/v2/items?per_page=100&page='${i} | jq '.[].title' | sed -E 's/(^")|("$)//g' >> ./title.txt; done

2. 記事タイトルをパターンに変換しよう(例:◯◯の△△を□□する、など)

記事タイトルをパターンに変換します
(例:「Qiita記事タイトルの頻出パターンを分析する」→「◯◯の△△を□□する」)

方針としては、MeCabで形態素解析を行った後に、名詞を記号に変換するようにしています。
また、文中に同じ名詞が複数回現れた場合は、同じ記号に変換するようにします。
(例:「あなたは友達の友達です」→「◯◯は△△の△△です」)

// ...

class Mozaik {
    constructor() {
        this.mozaikChars = "◯△□✗◎▲●■";
        this.mozaikedWords = [];
    }

    generate(word) {
        let index = this.mozaikedWords.indexOf(word);

        if (index === -1) {
            this.mozaikedWords.push(word);
            index = this.mozaikedWords.length - 1;
        }

        const mozaikChar = this.mozaikChars[index % this.mozaikChars.length];

        return mozaikChar + mozaikChar;
    }
}

// ...

        mecab.parse(title, function (err, result) {
            if (err) {
                return reject(err);
            }

            // タイトルを「◯◯を△△する」形式に変換する
            const mozaik = new Mozaik();

            let prevPos = null;
            let sentence = "";

            result.forEach(([phenotype, pos]) => {
                if (pos == prevPos) {
                    // 名詞が連続したら単一の名詞とみなして何もしない
                } else if (pos == "名詞") {
                    sentence += mozaik.generate(phenotype);
                } else {
                    sentence += phenotype;
                }

                prevPos = pos;
            });

            sentence; // -> 「◯◯の△△を□□する」形式の文

// ...

3. パターンの出現頻度をランキングにしよう

あとは、パターンの出現頻度をカウントしてランキング化するだけです。

分析結果

新着記事タイトル4400件から導出されたパターンがこちら。

件数: パターン (例文)
500: ◯◯ (例: JavaScript中級TIPS)
205: ◯◯の△△ (例: BashonUbuntuonWindowsの設定)
75: ◯◯で△△ (例: StoryboardReferenceで画面遷移)
35: ◯◯で△△を□□する (例: Squidでホワイトリストプロキシを作成する)
27: ◯◯の△△の□□ (例: FastlyサーバーのTTLの選択ロジック)
26: ◯◯で△△の□□ (例: ES6でPromiseのレートリミット実装)
24: ◯◯の△△を□□する (例: Fedora24Serverのrootpartitionを拡張する)
19: ◯◯と△△ (例: OpenCV切り貼りと連結)
18: ◯◯で△△の□□を✗✗する (例: MacOSXでJubatusのjeneratorコマンドをビルドする)
18: ◯◯で△△を使う (例: ASP.NETCoreでDisplayModesを使う)
17: ◯◯に△△を□□する (例: RaspberryPiにDnsmasqをインストールする)
15: ◯◯を△△する (例: C#:フィボナッチ数列を列挙する)
15: 【◯◯】△△ (例: 【PHP】Composer入門)
14: ◯◯△△ (例: Loopdatewithdayusingforeach)
14: ◯◯と△△の□□ (例: &&とANDの違い)
11: ◯◯で△△を□□する✗✗ (例: ShinobiLayer:VMware環境下でLSI(AVAGO)MegaRAID用StorCLIコマンドを導入する方法)
11: ◯◯に△△を□□ (例: RasberryPi3にROS(KineticKame)を導入)
11: ◯◯について (例: srcset属性について)
10: ◯◯ △△ (例: PMP 更新方法)
9: ◯◯で△△を□□ (例: ElasticBeanstalkでnginx_statusを設定)

1位:◯◯

圧倒的1位でした。簡潔なタイトルですが、中身に何が書いてあるのか分からないものが多いです。

  • JavaScript中級TIPS
  • chkrootkit
  • diff オプション

2位:◯◯の△△

名詞が2つに増えるだけでかなり中身が想像しやすくなりました。

  • Bash on Ubuntu on Windowsの設定
  • RTL8710のソフトウェア書き込み
  • メールサーバー暗号化の動作確認

3位:◯◯で△△

◯◯の部分にツール名が入るパターンが多いようです。2位とは違い「How」に注目したタイトル。

  • Solr で統計関数
  • StoryboardReferenceで画面遷移
  • PostgreSQLでフィボナッチ数列

4位:◯◯で△△を□□する

2位と3位を合わせたような感じで、「How」と「What」が分かりやすくなっています。

  • Squidでホワイトリストプロキシを作成する
  • fabricでtexファイルを管理する
  • .ssh/configファイルでSSH接続を管理する

5位:◯◯の△△の□□

2位(◯◯の△△)の「What」に注目したパターンを少し詳細化した感じでしょうか。

  • FastlyサーバーのTTLの選択ロジック
  • Apache の MaxClients の適正値
  • djangoのclass-based views APIのクラス図

まとめ

全体的に、「What」に注目したタイトルと「How」に注目したタイトルに分かれるというのがなんとなく見えてきました。

言われてみると、何か困りごとの解決方法を探している時はWhat系タイトルに注目して探しますし、逆にHow系タイトルは「あ、これ面白そう。覗いてみよう」というモチベーションで記事を開くことが多いですね(個人的な感想)。

そのへんを意識して記事タイトルを付けると幸せになれるのかもしれません。