経緯
こちらの続きです。
- ChatGPTログを加工して、Obsidianの拡張機能のSmart Connectionでノート同士の関連を自動で出してもらったものの、無料の学習済みモデル?でベクトル検索するのは、あまり実用的ではなさそうだった
- 無料版のベクトル検索は進化待ち状態なので、全文検索で関連度出す
結果
- Obsidianのグラフにたくさん関連ついた
- アンパンマンのノートに関連リンクを自動付与した結果です
- タイトルだけみると微妙な結果に見えますが、結構精度高いです。最後に詳しく書きます
やること
- Obsidianのノートをelasticsearchに投入する用のjsonに変換する
- elasticsearchにたくさんmore_like_thisクエリを送る
- more_like_thisクエリの結果をつけてObsidianノートにもどす
環境
- Windows 11
- Obsidian
- Docker Desktop
- python 3.11
Obsidianのノートをelasticsearchに投入する用のjsonに変換する
- 自前ツールつかいます。Obsidianの非公認プラグインです
-
{valutディレクトリ}.obsidian\plugins\obsidian-md2json ここにmain.jsとmanifest.jsonを配置します
-
Obsidianを再起動します
-
次のコマンドを実行すると、valutにある全てのマークダウンを対象に処理しますので気を付けてください
-
CTL + P でコマンドパレットを開き、Markdown to JSON : Convert all files to JSON を実行します
-
出力が終わるのを待ちます 終わったら右上のほうにConvertedと出ます
- json-output に変換したファイルがでてきます
- CTL + P でコマンドパレットを開き、Markdown to JSON : Create Elasticsearch bulk file を実行します
- bulk-json-output に変換したファイルがでてきます
elasticsearchをdockerで立ち上げる
- Docker desktop を立ち上げ、elasticsearchと検索して一番上にでてくるイメージを取得します
- Imageからelasticsearchを起動します。起動オプションでコンテナの9200とホスト9200のポートマッピングが必須です
- ContainerのLogsから起動確認します
bin/elasticsearch-reset-password -u elastic -i
- ContainerのExecからパスワード設定します。パスワードはelasticにします
curl -u elastic:elastic -k -X GET "https://localhost:9200"
- ホストのコマンドラインからこのコマンドが成功するか確認します
for %f in (*.json) do curl -u elastic:elastic -k -X POST "https://localhost:9200/_bulk" -H "Content-Type: application/x-ndjson" --data-binary @%f
- bulk-json-outputでコマンドプロンプトを立ち上げこのコマンドを実行します
elasticsearchにたくさんmore_like_thisクエリを送る
- 自前ツールつかいます
pip install requests
- 依存ライブラリインストールです
python elasticsearch_relate_calc.py
- elasitcsearchにmore_like_thisクエリを送り、結果をrelated_linkとしてelasitcsearchに保存するスクリプトです
python es_to_markdown.py
-
elasitcsearchのデータからObsidian用マークダウンを作ります。実行場所にobsidian_notesというディレクトリを作成、配下にファイル出力します。related_linkがObsidianのリンクになります
-
つくったファイルをObsidianのvaultに配置します
-
完
感想
- アンパンマンで"幼児"というキーワードをつかっているので、子供に関するノートがヒットしているようです
- 他のノートで"幼児"というキーワードを直接使用しているわけではないのですが、特にチューニングしなくてもシノニムにちゃんと反応しました
- ディズニーは"子供"というキーワードつかってたのでたぶんそのせい
- スターウォーズはアナキンが少年のころみたいな解説があったのでたぶんそのせい
- 山本太郎はタイトルと関係なく幼稚園の話題で子供というキーワードつかってたのでたぶんそのせい
- アンパンマンのノートでタイトルと関係ない離婚について話しているので、それ系記事がリンクになっているようです
- 関係ないけどアナキンでぐぐるとダースベイダーがでてきてひどい。シノニムになっているのかな