TL;DR
エンジニアが平成の次の元号を予想する方法 - Qiitaのアルゴリズムに出来るかぎり忠実に実装してみました。 結果、絞り込まれた元号候補(Gengo candidates)の数は 82,951 件でした。
実行結果
$ yarn
yarn install v0.18.1
$ yarn start
yarn start v0.18.1
$ run-s aggregate perform
yarn run v0.18.1
$ run-s gengo:aggregate
yarn run v0.18.1
$ node lib/02-GengoCandidates/aggregate.js
✨ Done in 0.30s.
✨ Done in 0.89s.
yarn run v0.18.1
$ run-s clean mkdir
yarn run v0.18.1
$ del dist/* tmp/*
✨ Done in 0.42s.
yarn run v0.18.1
$ node -e '[`dist`,`tmp`].forEach(d => { try { fs.mkdirSync(d) } catch(e) {}})'
✨ Done in 0.18s.
$ run-s kanji:perform gengo:perform
yarn run v0.18.1
$ node lib/01-KanjiCandidates/perform.js
# Narrow Kanji candidates
01. Initial Kanji candidates
=> [Kanji candidates count] 1006
02. Select less than 10 strokes Kanji
=> [Kanji candidates count] 620
03. Exclude rejection Kanji list #1(Numeral)
=> [Kanji candidates count] 596
04. Exclude rejection Kanji list #2(Others)
=> [Kanji candidates count] 576
05. Exclude Kokuji
=> [Kanji candidates count] 575
06. Exclude negative terms
=> [Kanji candidates count] 447
✨ Done in 0.22s.
yarn run v0.18.1
$ node lib/02-GengoCandidates/perform.js
# Narrow Gengo candidates
00. Initial Gengo candidates
=> [Gengo candidates count] 199362
01. Exclude past Gengo (and reversed it) in {JP,CN,TW,VN,KP} ...
=> [Gengo candidates count] 199225
02. Exclude emperor name (and reversed it) in JP ...
=> [Gengo candidates count] 199212
03. Exclude common name (family nam/last name) in JP ...
=> [Gengo candidates count] 195337
04. Exclude city name in JP {pref,city,warn} ...
=> [Gengo candidates count] 195251
05. Exclude station name in JP ...
=> [Gengo candidates count] 195073
06. Exclude 2-letters idiom (and reversed it) ...
=> [Gengo candidates count] 192553
07. Exclude first letter On-Yomi starts with MTSH ...
=> [Gengo candidates count] 95233
08. Exclude On-Yomi just two pronunciations ...
=> [Gengo candidates count] 85224
09. Exclude On-Yomi same pronunciations continue ...
=> [Gengo candidates count] 82951
✨ Done in 53.71s.
✨ Done in 56.24s.
✨ Done in 58.17s.
抽出された元号候補はJSON形式でdist/GengoCandidates.json
に保存されます。
また、元号絞り込みの過程で各フェーズを通過した候補と除外された候補はtmp/
以下に保存されます。(0[1-9]-result.json
が元号絞り込みフェーズ0[1-9]
を通過した候補、0[1-9]-reject.json
が同除外された候補)
実装
リポジトリ
noriaki/gengo: Meiji, Taisho, Showa, Heisei, ...next?
元記事のアルゴリズムとの差異
- 漢数字に1文字の大数と小数等を追加
- 除外する漢字リストに
半
(dd時30分の意)や都``道``府``県``市``郡``区``町``村
を追加 - 東アジアの君主のおくり名のうち利用したのは日本のみ(他の国はWikipedia情報が抽出しづらかったので割愛)
- 名字、名前は参照サイトへの負荷とサンプリング観点から、全数ではなく100以上存在するもののみを利用
- 名字 約14,200件
- 名前 約20,300件
- 日本の都道府県、市区町村はデータソースを総務省|電子自治体|全国地方公共団体コード(000442937.xls)に変更し、名称から末尾の
都``道``府``県``市``郡``区``町``村
を除去したものを利用 - 熟語はデータソースを二字熟語に変更
- 音読みはデータソースを漢字を読みから検索(音訓)とし、以下の方針で実装
- 先頭が
M``T``S``H
は、元号候補の先頭漢字の音読みが複数ある場合でも、M``T``S``H
で始まる音読みが一つでも含まれていれば除外(元号候補の音読み候補の中から妥当な音読みを機械的に特定することが困難だったため) - 同じ音が続くパターンも上記
M``T``S``H
と同様に、元号候補に複数の音読みが考えられる場合に一つ以上対象パターンが含まれる元号候補は除外
- 先頭が
- Googleの検索結果とマッチはAPI等へのリクエスト数が膨大になると思われるので割愛
実行環境
$ node --version
v6.9.2
$ npm --version
y3.10.9
$ yarn --version
0.18.1
yarn(pkg)
は必須ではありません。yarn(pkg)
を利用していない場合はyarn start
の代わりにnpm start
を実行します。
ちなみに
元記事で触れられている元号候補「青全」は、先頭の音読みがS
(セ)なので除外されました。