◆ これまでのブログ本文から使ってる技術・ツール名などを取り出したい
  ◆ 用語集の名前部分の一覧みたいになるのが理想
◆ ノイズ多すぎだった

相変わらずだらだらと転職活動中です
その中でアピールポイントとして使ったことのある技術を書くところがありました
OS とか DB とかミドルウェアとか言語とかフレームワークとかその辺です
趣味レベルでもいいそうです

挙げろと言われても難しいものですよね
何を対象にすればいいの?ってなります
言語レベルまでならともかくフレームワークを含むくらいならフォーマッターとか静的解析とかテストツールとかのライブラリも入れるのでしょうか
開発環境について記載するところでもあるようですし WSL とか Docker とか CI とかそういうのも含まれるのでしょうか
JavaScript でいえば npm や yarn や pnpm などパッケージマネージャーや Vite や Webpack のようなビルドツールは必要なのでしょうか
VScode や Git みたいなものも必要なのでしょうか
さすがに Git レベルを一々書いてたら と思いましたが 中には zip でコピーしてバージョン管理みたいな会社もあって そこから転職しようとしてる人もいるでしょうし 使ってるなら書いておくべきなのかもしれません

求人内に書かれてるレベルの単語は入れておく基準になるかな と思いましたが結構バラバラなんですよね
使う技術の一致具合を見たいのなら経験あれば全部書くべきなのかもですが 書き始めるとキリがないです
package.json の dependencies のコピペレベルになったらそんなの見せられても困りますし

厳選するにしても そもそも何があるっけ?状態です
なんでもいいから使ってる技術教えて と言われても逆にパッと出てきませんよね
使ったことがあるものを全部を書いてるわけじゃないですが ブログに書いてる内容で 8 割以上はカバーされてそうな気がします
なのでブログ本文からそれっぽい候補リストを作って それを参考に選ぼうかなと思います

抽出

どうせ抽出するなら ちゃんと触れたことがないレベルのものでも名前っぽいのは取り出してリストにしたいと思います
目標は用語集の名前の部分が並ぶ感じです

見返してみると そういえばこれ後で使おうと思ったものの忘れてた とかあるかもしれませんし(かなりあるはず)
名前から それが使用されている記事への URL も持たせれば索引として使えて便利かもしれません

なんて考えてましたが 最終的にはあんまりうまく行かなかったです

ノイズ

まずは抽出方法ですが 最初はタグで考えました
タグであれば元々名前などを登録してるのでいい感じになります
しかしタグをそこまで丁寧につけてるわけでもないです
使っていても記事のメインじゃないならつけないことも多いです
やっぱり本文を見て取り出したいです

基本 本文は日本語なのでアルファベットを取り出せば 名前系が取り出せそうです
と思いましたがノイズが多すぎでした

まず本文データは HTML です
タグを除去しないと余計な物が多すぎます
HTML としてパースしてテキストを取り出しました

それでもコードブロックがあります
ソースコード中には不要なアルファベットが多いです
HTML からテキストを取り出す前に不要なタグを除外する必要がありました
これである程度は減りましたが それでもコード内の変数を通常の文章で使ったりするので結構な数のノイズがあります

記号やスペースを無視できれば数は減りますが .NET Framework とか C# みたいな名前があります
これらを含めないといけないので 記号やスペースも抽出するテキストに含めることにします
そうすると 「1 + 1」 や 「foo.bar」 みたいのも含まれるのですよね
「echo foo」 や 「yarn install」 みたいなコマンド系も増えてきます
単語なら個別に除外していくこともできますが 無限のようにある組み合わせが入ると流石にやってられないです
「foo/bar」 「foo-bar」 「foo, bar」 など似たようなものでも多くのパターンがあります

どうにか除外するパターンを増やしたいです
特定の文字を含むものや 正規表現で一致するものは一気に除外したいですが これもけっこう難しいです
例えば 「*.js」 のパターンはファイル名ということで捨ててしまうと Node.js や React.js も捨てられます
末尾に数字が付いてるのは page1 や form2 みたいな区別のための数字や Chrome99 みたいなバージョンが多いです
しかし SHA1 とか PM2 みたいなケースもあります
v1 や v2 なら完全にバージョンかと思ったら V8 というものがありました
一般単語は辞書からデータを持ってきて まるごと除外すればいいかなと思ったものの Go や Fish など一般単語そのままのツール名が存在します
数字から始まるのは無いだろうと思ったら 7z というものがありました
いい感じにできる方法が見つかりません

出現回数

途中までは地道に除外パターンやワードを増やしてましたが 1500 を越えたあたりでさすがに諦めました
誤った除外による漏れを減らして かつ残ってるのはできるだけ必要なものだけにしたかったのですが 無理です
方針を変えてある程度それっぽいものにすることにします

プログラムの式が抽出されるなどパターンがありすぎるノイズは基本 1 回限りで同じものが何度も出ることは稀です
出現回数を数えて多い順にすれば上の方はだいたいいい感じになるでしょ ということでやってみました

それっぽくはあるのですが 1 つの記事の中で何度も出てくる文字列が必要以上に上位に来てしまう問題がありました
これの対処で 1 記事内で何度出てきても 1 記事は 1 回までとして集計しました
こっちのほうがそれっぽさがあります

両方の回数を使って (記事あたり 1 回のみの出現回数 * 10 + 合計出現回数) とかスコアを出したり 記事内の出現率で重み付けをするなども考えられますが 調整とか大変すぎるのでやめました

あとは大文字小文字など混ざっていると出現回数にも影響するので正規化しました
最初は記号も消していたのですが 記号を消すとノイズが混ざってしまって数が増えたので大文字小文字を揃えるだけにしました

なんか昔 統計とかデータ分析とかしていた頃を思い出します

データ

データは こことサブブログのデータで合計で約 15MB でした
記事数だと 3000 くらいあるので 実際にページを開いてデータを取得するのは色々問題もあるのでエクスポートしたデータを使いました
MT 形式のファイルなので 本文以外のデータも含まれて 本文は HTML 形式になっています
MT 形式の付加情報や HTML やソースコードを含むとは言っても 文字列だけで 15MB は結構な量だと思います

このデータから本文を取り出して HTML としてパースしてから script や style タグなどを除外します
ブラウザがロードしないように img や video も一応削除します
あとはテキストを取り出し 上に書いたような方法で除外したり集計したりします

結果

除外した上で 1 万件以上抽出できました
上位を表示するとこんな感じでした

block が出現した記事数で count が合計出現数です

index block count norm text
1 984 2399 javascript JavaScript、Javascript、javascript
2 578 1178 chrome Chrome、chrome
3 472 1225 html HTML、html
4 344 764 node.js Node.js、node.js
5 331 742 windows Windows、windows
6 326 672 css CSS、css
7 246 686 php PHP、php
8 241 442 firefox Firefox、firefox
9 184 398 devtools devtools、DEVTOOLS、DevTools、Devtools
10 170 307 c# C#、c#
11 169 404 python Python、python
12 158 387 ie IE
13 154 350 json json、JSON
14 145 306 linux Linux、linux
15 142 416 react React、react
16 139 280 c C、c
17 129 216 google Google、google
18 118 245 npm npm
19 117 220 fetch fetch、FETCH
20 108 169 github github、Github
21 101 178 fedora fedora、Fedora
22 93 200 webcomponents WebComponents、webcomponents
23 90 256 lit-html lit-html
24 80 256 jquery jQuery
25 79 175 http http、HTTP
26 77 167 vscode VSCode、vscode
27 69 129 edge Edge
28 68 175 webpack webpack、Webpack
29 65 217 wsl WSL、wsl
30 65 159 package.json package.json
31 65 98 es6 ES6、es6
32 64 162 wpf WPF、wpf
33 61 144 node_modules node_modules
34 60 172 hyperhtml hyperHTML、hyperhtml
35 55 97 visualstudio VisualStudio
36 53 80 node Node、node
37 52 166 https https、HTTPS
38 52 98 d D、d
39 51 138 electron electron、Electron
40 50 87 gist gist、Gist
41 49 111 sql SQL、sql
42 48 89 .net .NET、.net
43 48 89 ie11 IE11
44 47 220 typescript TypeScript、Typescript、typescript
45 47 146 spa SPA
46 47 87 xml XML、xml
47 47 83 dnf dnf
48 47 70 c++ C++、c++
49 46 149 powershell PowerShell、powershell
50 46 123 babel Babel、babel
51 45 67 windows 10 windows 10、Windows 10
52 44 98 v8 V8、v8
53 43 62 windows10 Windows10、windows10
54 42 118 docker Docker、docker
55 42 98 xaml XAML、xaml
56 42 62 es2015 ES2015
57 41 67 bat bat
58 41 63 chromium Chromium、chromium
59 40 107 jsx JSX、jsx
60 40 86 zip zip、ZIP、Zip
61 39 127 koa koa、Koa
62 39 68 apache apache、Apache
63 38 107 parcel parcel、Parcel
64 38 87 ubuntu Ubuntu、ubuntu
65 38 79 rust Rust、rust
66 38 76 lit-element lit-element
67 37 91 utf-8 UTF-8、utf-8
68 37 53 es5 ES5、es5
69 35 62 unicode Unicode、unicode
70 34 102 hapi hapi、Hapi
71 34 91 vue vue、Vue
72 34 68 git git、Git
73 34 53 es modules es modules、Es Modules、ES Modules、ES modules
74 32 108 evernote Evernote、evernote
75 32 62 ruby ruby、Ruby
76 32 60 elm Elm、elm
77 32 57 framework Framework、framework
78 32 34 stackoverflow stackoverflow、StackOverflow、Stackoverflow
79 31 51 centos centos、CentOS
80 31 49 twitter Twitter、twitter
81 30 57 esmodules EsModules、ESModules
82 30 54 js JS、js、Js
83 30 51 .net framework .NET Framework、.Net Framework
84 30 45 android Android、android
85 29 78 java Java
86 29 47 customelements CustomElements、customElements
87 27 92 yarn yarn
88 27 60 postgresql postgresql、PostgreSQL
89 27 55 bash bash
90 26 79 express Express、express
91 26 34 microsoft Microsoft、MicroSoft、microsoft
92 25 65 safari Safari
93 25 45 customelement CustomElement
94 25 44 r R、r
95 25 33 mac Mac、mac
96 24 58 markdown markdown、Markdown
97 24 44 base64 base64
98 23 48 virtualbox VirtualBox
99 23 30 whatwg whatwg、WHATWG、WhatWG
100 22 73 ssh ssh

別ページでもう少し多めに表示しています

使ったコードはここにあります
除外リストが長すぎるので外部ページにしてます

最初に単純な方法で抽出したときに比べたらかなりそれっぽさはあると思います
ただ c や d って適当につけた変数名の a, b, c, d というのが含まれていて 言語としての C や D 以外のものが多分に混ざってます
あとは 下の方に Java や Mac がありますが これらは話題に出てくることはあっても実際使うことはないです

また 出現回数が 1 回だけのものを見てみました
数は想像よりはるかに多く 7000 件以上は 1 回限りの出現でした
さらに 9000 件弱は 1 記事限りでした
そのうちの多くは表記ゆれやタイプミスでした
一応投稿前に数回見直してるので 誤字はそこまで多くないと思ってたのにとても多かったです

見ていると 1 回ってことはないと思うというのが結構な数ありました
適当に 1000 件くらい見て意外と思ったのをいくつか上げるとこんな感じです
「,」 を含むものはなかったので 「,」 区切りにして並べてます
CSV と違って行に意味はないです

eyedropper, pixelated, sodium, e-tag, zstandard, scikit-learn, dart3, raku,
msixbundle, apache2, turbopack, yml, stencil, qwik, document-fragment, pytest,
rhel8, jq, vanilla-extract, id_rsa, putty, vercel, tomcat, bun, duckduckgo,
apachectl, zcat, hmac, pkcs, phar, django, msinfo32, bower, pypy, gecko, tsc
7z, zig, phantomjs, pdflatex, lualatex, importmaps, bcdedit, symfony, azure,

1 記事だけだと

content-visibility, simplexmlelement, pandoc, testcafe, cypress, xdebug,
dayjs, docx, rimraf, boom, zlib

最終的に 当初期待してたものにはならなかったですが とりあえずそれっぽいものは得られたので良しとします
ただ出現頻度で優先度が決まるので知名度関係なくジャンルも関係なく並んでいて どういう技術を使ってるかの参考にはあまり使えないですね