/

YAML front matterを持つマークダウンファイルに、ファイル内の文章を形態素解析しtagsを追加する

YAML
YAML front matterにタグを追加

YAML front matterを持つマークダウンのファイルに、ファイル内の文章を形態素解析しtagsを追加するツールを作りました。

対象

  • A. Markdownでブログを書いている(hexoなど)
  • B. AのファイルでMarkdownYAML front matterでtagsを管理している

よくわからないと思うので下記のようなファイルでブログを書いている感じです。

---で囲まれた部分がYAML front matterで二個目の---以降がブログ本文になっています。

  • 例 test.md
---
title: 三鷹市について
tags:
  - 武者小路実篤
  - 森鴎外
---

武者小路実篤、三木露風、山本有三、太宰治など、多くの文豪が暮らした「文士の街」として知られる。観光名所として、三鷹市山本有三記念館、太宰治文学サロンなどの文化施設のほか、禅林寺には太宰治および森鷗外、龍源寺には近藤勇の墓が存在する。

※このサンプル文章は、クリエイティブ・コモンズ 表示-継承 4.0 国際 パブリック・ライセンスのもとで公表されたウィキペディアの項目「三鷹市」を素材として二次利用しています。

上記はtagsに武者小路実篤森鴎外が入っていますが、三木露風太宰治は入っていません。

ファイルを直接いじり、tags に三木露風太宰治を追記すればいいのですが、三木露風太宰治以外にも多数の追加したいtagsがあったらどうでしょうか?

結構めんどくさいです。

それを自動化(ある程度)してくれるのがこのツールです。

マークダウンを使用してブログを書き、かつYAML front matterを使用していて、さらにtagsを自動で追加したいという方々(私)に向けたツールです。

準備

まずLinuxマシンを用意してdockerをインストールしてください。

Windows10/11上のWSLとDocker Desktopでも動くと思いますが、テストしていません。

また、MacのDocker Desktopでも大丈夫だとは思います。


$ cd <適当なディレクトリ>
$ git clone https://github.com/syagawa/get-tags-insert-to-yaml-front-matter.git
$ cd get-tags-insert-to-yaml-front-matter
$ git reset --hard d482db0045decc102073a95f64666bebd057de0d

# ディレクトリを作りサンプルをコピー
$ mkdir csv
$ mkdir excludes
$ mkdir targets
$ cp ./samples/dict.csv ./csv/
$ cp ./samples/list.exclude.txt ./excludes/
$ cp ./samples/test.md ./targets/

# options.mjsを作成
$ cp ./sctipts/options.default.mjs ./scripts/options.mjs

# コンテナのビルド
$ docker compose -f docker-compose.yml build

実行

下記コマンドでコンテナを立ち上げ、形態素解析を行い、results/にtagsを追加したtest.mdを書き出すまでを行います。

$ ./build-and-go.sh

何が行われるかを解説します。

  1. docker compose upを行いコンテナを2個(辞書のビルド用、Node.jsの実行用)起動します
  2. ./csv/dict.csvの内容をチェックし、以前実行した時とdict.csvが変わっていた場合、次の3を行います
  3. 辞書のビルド用コンテナで辞書をビルドします、ビルドされた辞書は./dictに書き出されます。 ビルドにはkuromoji.js(https://github.com/takuyaa/kuromoji.js.git)を使います。
  4. Node.jsの実行用コンテナで./scripts/run.mjsを実行します
  5. ./targetsディレクトリ内にあるファイルを取得し、テキストデータにします。
  6. テキストデータから3.で作った辞書を使って形態素解析を行います。 形態素解析はkuromojin(https://github.com/azu/kuromojin.git)で行います。
  7. ./excludes/***.exclude.txtファイル内にある単語を除去
  8. 一文字の単語を除去します (options.mjsのexcludeOneCharacterがtrue)
  9. 名詞以外の単語を除去します (options.mjsのexcludeNonNounsがtrue)
  10. 固有名詞以外の単語を除去します (options.mjsのexcludeNonProperNounsがtrueの場合)
  11. 2文字以下の地域名ではない単語を除去します (options.mjsのexcludeTwoCharactarsOrLessAndNonAreaがtrueの場合)
  12. 固有名詞でかつ姓のみまたは名のみ単語を除去します (options.mjsのexcludeOnlyLastNameOrOnlyFirstNameがtrueの場合)
  13. YAML front matterにtagsを追加する場合14.を実行します (options.mjsのinsertTagsToYamlFrontMatterがtrue)
  14. テキストデータから現状追加されているtagsを取得します
  15. ./csv/dict.csvに14.で取得したtagsを固有名詞として追加 (options.mjsのaddCurrentTagsToDictがtrue)
  16. 14.で取得したtagsと12.まで処理した単語リストを比較し、tagsに含まれているものは除去します
  17. 16.で出来上がったリストを対象のファイルのYAML front matterのtags部分に追加し、./results/に新しいファイルとして書き出す
  18. 13.がtrueではない場合は 12.まで処理した単語リストを ファイル名.words.json という名前で./results/に書き出します

なお、tagsというキーを使っていますが、例えば some_tags や some_words みたいなキーを使っているようであれば./scripts/options.mjstargetName値を"some_tags"や"some_words"に変更してください。

実行後

./resultsに書き出されたtest.mdが下記です。

---
title: 三鷹市について
tags:
  - 武者小路実篤
  - 森鴎外
  - 太宰治   // 追加
  - 三木露風 // 追加
  - 山本有三 // 追加
---

武者小路実篤、三木露風、山本有三、太宰治など、多くの文豪が暮らした「文士の街」として知られる。観光名所として、三鷹市山本有三記念館、太宰治文学サロンなどの文化施設のほか、禅林寺には太宰治および森鷗外、龍源寺には近藤勇の墓が存在する。

太宰治、三木露風、山本有三が追加されています。(実際にはもっとタグが追加されます。)

なお、./targets/ディレクトリには複数のファイルを追加可能です。

このツールの特徴

Node.jeはホスト上で動きません、徹底してdocker内でNode.jsが動きます。 なので、ホスト上にNode.jsをインストールしておく必要はありません。

今後

形態素解析はほぼ知らない分野なので、そもそもNode.jsでツールを作ったのが正解だったのかがわかりません。

ただ、Node.jsでの形態素解析というか、JavaScriptで形態素解析ができるとブラウザで実行できるのでちょっと面白いことができるのではないかなと思ってます。