テキストからツールや言語やライブラリ等の名前を取り出したい
◆ これまでのブログ本文から使ってる技術・ツール名などを取り出したい
◆ 用語集の名前部分の一覧みたいになるのが理想
◆ ノイズ多すぎだった
◆ 用語集の名前部分の一覧みたいになるのが理想
◆ ノイズ多すぎだった
相変わらずだらだらと転職活動中です
その中でアピールポイントとして使ったことのある技術を書くところがありました
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 というものがありました
いい感じにできる方法が見つかりません
誤った除外による漏れを減らして かつ残ってるのはできるだけ必要なものだけにしたかったのですが 無理です
方針を変えてある程度それっぽいものにすることにします
プログラムの式が抽出されるなどパターンがありすぎるノイズは基本 1 回限りで同じものが何度も出ることは稀です
出現回数を数えて多い順にすれば上の方はだいたいいい感じになるでしょ ということでやってみました
それっぽくはあるのですが 1 つの記事の中で何度も出てくる文字列が必要以上に上位に来てしまう問題がありました
これの対処で 1 記事内で何度出てきても 1 記事は 1 回までとして集計しました
こっちのほうがそれっぽさがあります
両方の回数を使って (記事あたり 1 回のみの出現回数 * 10 + 合計出現回数) とかスコアを出したり 記事内の出現率で重み付けをするなども考えられますが 調整とか大変すぎるのでやめました
あとは大文字小文字など混ざっていると出現回数にも影響するので正規化しました
最初は記号も消していたのですが 記号を消すとノイズが混ざってしまって数が増えたので大文字小文字を揃えるだけにしました
なんか昔 統計とかデータ分析とかしていた頃を思い出します
記事数だと 3000 くらいあるので 実際にページを開いてデータを取得するのは色々問題もあるのでエクスポートしたデータを使いました
MT 形式のファイルなので 本文以外のデータも含まれて 本文は HTML 形式になっています
MT 形式の付加情報や HTML やソースコードを含むとは言っても 文字列だけで 15MB は結構な量だと思います
このデータから本文を取り出して HTML としてパースしてから script や style タグなどを除外します
ブラウザがロードしないように img や video も一応削除します
あとはテキストを取り出し 上に書いたような方法で除外したり集計したりします
上位を表示するとこんな感じでした
block が出現した記事数で count が合計出現数です
別ページでもう少し多めに表示しています
使ったコードはここにあります
除外リストが長すぎるので外部ページにしてます
最初に単純な方法で抽出したときに比べたらかなりそれっぽさはあると思います
ただ c や d って適当につけた変数名の a, b, c, d というのが含まれていて 言語としての C や D 以外のものが多分に混ざってます
あとは 下の方に Java や Mac がありますが これらは話題に出てくることはあっても実際使うことはないです
また 出現回数が 1 回だけのものを見てみました
数は想像よりはるかに多く 7000 件以上は 1 回限りの出現でした
さらに 9000 件弱は 1 記事限りでした
そのうちの多くは表記ゆれやタイプミスでした
一応投稿前に数回見直してるので 誤字はそこまで多くないと思ってたのにとても多かったです
見ていると 1 回ってことはないと思うというのが結構な数ありました
適当に 1000 件くらい見て意外と思ったのをいくつか上げるとこんな感じです
「,」 を含むものはなかったので 「,」 区切りにして並べてます
CSV と違って行に意味はないです
1 記事だけだと
最終的に 当初期待してたものにはならなかったですが とりあえずそれっぽいものは得られたので良しとします
ただ出現頻度で優先度が決まるので知名度関係なくジャンルも関係なく並んでいて どういう技術を使ってるかの参考にはあまり使えないですね
その中でアピールポイントとして使ったことのある技術を書くところがありました
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 | |
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 | |
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
最終的に 当初期待してたものにはならなかったですが とりあえずそれっぽいものは得られたので良しとします
ただ出現頻度で優先度が決まるので知名度関係なくジャンルも関係なく並んでいて どういう技術を使ってるかの参考にはあまり使えないですね