NISHIO Hirokazu[日本語][English]

pTTTC2024-11-12

日テレNEWS×2024衆院選×ブロードリスニング とりあえずフォークした https://github.com/nishio/shugiinsenyo2024-tttc

% pip install langchain_openai % pip install python-dotenv

embeddingまできてからエラー % pip install --upgrade langchain % pip install -U langchain-community これで直った

(7574, 3072)次元でHDBSCANすると5分かかる

  • (1000, ...)にランダムサンプリングしたら5秒になる
  • 埋め込みベクトルの次元はおそらく線形オーダーでしか効いてこないので短くする必要はないと思う

30〜100件くらいのクラスタを抽出しようと思ったが k-meansと違ってそもそもクラスタ数を指定できない

  • min_cluster_size=5を小さくすれば増える
    • とはいえ「データ2個でクラスタ!」は微妙
  • min_samples=2を小さくすれば増える
    • どういう原理か
    • 密度の計算に関するものらしい
  • max_cluster_size=30
    • これをつけることで巨大クラスターが出ちゃうのを防ぐ
    • 巨大クラスタを割ってくれる訳ではない、このあたりの振る舞いを理解するにはもう少し実験が必要

1000件で(min_cluster_size, min_samples) = (5, 2)だと10クラスタできた

  • (2, 2)だと38クラスタに増えるが「2個あればクラスタ」という意味になる
    • 流石にやりすぎでは?
    • でも逆に言えばこれ以外は全部スパースな領域のデータと判断されている
    • ごくデータが少ない時には「仕方がないから(2, 2)で試す」という感じ
      • 「たまたまかもしれない、もっとデータが集まれば棄却されるかも知れないが、今の段階としては可能性が高い候補」みたいなニュアンス

データが多くなるほど固定の閾値に対してデータの密度が上回る確率は高くなる

  • 7000件で(5, 2)で79クラスタできた
  • だがまぁHDBSCANが非線形に重くなるのが問題だな
    • 大量のデータでパラメータサーチを回すと高コストだが、サンプリングすると振る舞いは変わる
    • ランダムなサンプリングであれば「1000件のときにこうであれば7000件のときにはこうなる」という推論は成立しそうではある
      • まあ普通に数学すると1000件の(2, 2)は7000件の(14, 14)相当だよな

これらのデータに対して「どうしてこれらは一塊になっているのか」を抽出する

:

```json
[
    {
        "explanation": "...",
        "label": "..."
    }
]

たまにこういう予定と違う形で返ってくるのはこまるなぁ

JSONのスキーマをハッキリさせるコールが可能になったはずなので調べる

2024-11-13
日テレ版TTTC、Azure対応もアウトプットのJSON強制も全部入ってて親切すぎて感動

7574件のデータから79個のクラスタが作成された
- 使われたデータは739件、カバレッジは9.8%

思惑通りのいい実験結果がでたので、公開できるデータで同じことをやって記事にしたい
- 安野チームの日テレの件も記事にしたいし
- 世論地図の話も記事にしたい
    - 3つもあるじゃん!

![image](https://gyazo.com/aa54ff46f8ab889e5458cac0172fc9a4/thumb/1000)
- 従来のTTTCでは全部のデータをクラスタに分類しようとする
    - ので(1)のようなはっきりと離れ小島になってるクラスタだといいのだけど
    - (2)(3)では複数の話題が混ざってしまって「AIの解説とだいぶ違う話が混ざってるなぁ」みたいなことが起きていた
- 今回やった実験は「すべてのデータを分類する」をやめて「密度高く集中してるところだけ切り取る」というもの。
    - クラスタは79個できた。こちらは濃いところだけ取り出してるのでできたクラスタは濃い
    - が、クラスタに選ばれてない意見たくさんある。多分想像より多くて9割くらい捨てられている。
- この二つはどちらがいいというものではなくて、両方メリットデメリットがあるのでうまく使い分けるといいと思う。

全体像を散布図と強制クラスタリングで示す現在のTTTCは[まずは大雑把に](/ja/%E3%81%BE%E3%81%9A%E3%81%AF%E5%A4%A7%E9%9B%91%E6%8A%8A%E3%81%AB)[全体像を把握したい](/ja/%E5%85%A8%E4%BD%93%E5%83%8F%E3%82%92%E6%8A%8A%E6%8F%A1%E3%81%97%E3%81%9F%E3%81%84)という欲求を満たすのに向いている
- 都知事選の時はそれを黙ってネットの向こうの人に示す or 政策チームが読んで参考にする と言う感じだった
- [日テレNEWS×2024衆院選×ブロードリスニング](/ja/%E6%97%A5%E3%83%86%E3%83%ACNEWS%C3%972024%E8%A1%86%E9%99%A2%E9%81%B8%C3%97%E3%83%96%E3%83%AD%E3%83%BC%E3%83%89%E3%83%AA%E3%82%B9%E3%83%8B%E3%83%B3%E3%82%B0)では視聴者に向けて「解説」をする必要性があった
    - その過程で全体像を示すだけではなく「濃い意見を掘り下げたい」というニーズが明確化した
        - これをやるプロセスにおいて現状のTTTCでは「点にマウスホバーして見せる」になってN=1で示すことしかできない
        - その「フォーカスする意見を探す」のところに支援が乏しい
            - 適当にいくつかだけみて運任せにするのか
            - 7000件を結局全部見るのか
    - 今回の新しい実験はここを改善する
        - 「7000件全部見る代わりに、濃度の濃い79クラスタを見る」という負担軽減
        - 「N=1ではなくN=5~30の意見」として示せることによる説得力向上

2024-11-14
[DBSCANとHDBSCANの違い#67352797aff09e00003bcfa4](/ja/DBSCAN%E3%81%A8HDBSCAN%E3%81%AE%E9%81%95%E3%81%84%2367352797aff09e00003bcfa4)
これだったら僕のユースケースだと軽いDBSCANをパラメータ違いでやるのの方がいいかもな
100件クラスタを抽出して、それに対してKJ法をしよう

[テキスト埋め込みベクトルの分布](/ja/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E5%88%86%E5%B8%83)

HDBSCANを使うとしてもLeaf Clusteringの方が僕の目的に適している感じはあるな
[Parameter Selection for HDBSCAN* — hdbscan 0.8.1 documentation](https://hdbscan.readthedocs.io/en/latest/parameter_selection.html#leaf-clustering)

---
特筆性ソート✅

濃いクラスタを抽出する仕組み、別のTTTCのデータ(AIパブコメ)を入れて再実行してみたけどあっさり動いた
- [https://github.com/nishio/ai_kj/blob/main/dense_cluster_extruction.ipynb](https://github.com/nishio/ai_kj/blob/main/dense_cluster_extruction.ipynb)
- [濃い塊の抽出](/ja/%E6%BF%83%E3%81%84%E5%A1%8A%E3%81%AE%E6%8A%BD%E5%87%BA)

AIの考えた「興味深い濃いクラスタ」
- 個人的にはスコア低いものの方が見慣れなくて興味深い
- まあこれはAIに「どういう目的で調べててどういうものが興味深いのか」を教えてないからという側面もありそう
個別に興味深い度合いを出すより、一覧ができてからそれをAIが読んで講評した方がいいか?
「他にない視点」というプロンプトが良さそう、面白い

<img src='https://scrapbox.io/api/pages/nishio/gpt/icon' alt='gpt.icon' height="19.5"/>他にない視点を導入しているクラスタとその独創的な点
- C16:AIトレーニングデータの違法コンテンツリスク
    - AI学習における倫理的懸念において、違法コンテンツの存在、特に児童ポルノが含まれる可能性に特化した視点が独自です。他のクラスタが著作権や無断使用に焦点を当てているのに対し、こちらはAI技術の倫理的境界に一歩踏み込み、法的リスクにまで視野を広げています。
- C12:AI技術の悪用に対する懸念
    - 商業目的や詐欺行為への悪用、さらには他者の生活を脅かす経済的影響といったリスクに言及しており、AIの利用がクリエイターの権利侵害を超え、社会全体の安全に関わる視点を導入している点が特徴的です。
- C4:透明性とアカウンタビリティの重要性
    - AIシステムの開発とトレーニングプロセスに関する透明性を強調しており、技術と倫理の交点での具体的な対策を求めている点が他のクラスタと異なります。

これらのクラスタは、倫理、法的リスク、透明性においてAI技術の応用に関する独創的な視点を提供しています。

[https://chatgpt.com/share/6735c2e5-5bac-8011-bccc-d8ffd64fd1d9](https://chatgpt.com/share/6735c2e5-5bac-8011-bccc-d8ffd64fd1d9)

---
requirements.txt
- [https://gist.github.com/nishio/756cd4c6dee7203cc6a32172ce1e2f78](https://gist.github.com/nishio/756cd4c6dee7203cc6a32172ce1e2f78)

:

scatter/pipeline/steps/embedding.py:3: LangChainDeprecationWarning: Importing OpenAIEmbeddings from langchain.embeddings is deprecated. Please replace deprecated imports:

from langchain.embeddings import OpenAIEmbeddings

with new imports of:

from langchain_community.embeddings import OpenAIEmbeddings You can use the langchain cli to automatically upgrade many imports. Please see documentation here https://python.langchain.com/docs/versions/v0_2/ from langchain.embeddings import OpenAIEmbeddings /Users/nishio/shugiinsenyo2024-tttc/venv/lib/python3.10/site-packages/langchain/chat_models/init.py:33: LangChainDeprecationWarning: Importing chat models from langchain is deprecated. Importing from langchain will no longer be supported as of langchain==0.2.0. Please import from langchain-community instead:

from langchain_community.chat_models import ChatOpenAI.

To install langchain-community run pip install -U langchain-community. warnings.warn( venv/lib/python3.10/site-packages/langchain/chat_models/init.py:33: LangChainDeprecationWarning: Importing chat models from langchain is deprecated. Importing from langchain will no longer be supported as of langchain==0.2.0. Please import from langchain-community instead:

from langchain_community.chat_models import ChatOpenAI.

To install langchain-community run pip install -U langchain-community. warnings.warn(



いったん気にしないことにする
- 適当にいじってたらややこしいことになったので

「ややこしいこと」を一応メモしておこう
:

from huggingface_hub import HfApi, HfFolder, Repository, hf_hub_url, cached_download ImportError: cannot import name 'cached_download' from 'huggingface_hub' (/Users/nishio/shugiinsenyo2024-tttc/venv/lib/python3.10/site-packages/huggingface_hub/init.py)


<img src='https://scrapbox.io/api/pages/nishio/gpt/icon' alt='gpt.icon' height="19.5"/>このエラーは、Hugging Face Hubライブラリのバージョンが新しいために発生している可能性があります。cached_download関数は最近のバージョンで削除または非推奨になり、代替手法が推奨されています。
- この後AIは`pip install huggingface_hub==0.12.0`をお薦めしてくるけど、最終的にちゃんと動いたのは`huggingface-hub==0.25.1`なのでバージョンを戻しすぎなんだよな
- まあ、情報が最新でなかったり、ハルシネーションしたりしそうなところではある

:

ImportError: cannot import name 'HF_HUB_DISABLE_TELEMETRY' from 'huggingface_hub.constants' (/Users/nishio/shugiinsenyo2024-tttc/venv/lib/python3.10/site-packages/huggingface_hub/constants.py)



(C)NISHIO Hirokazu / Converted from Markdown (ja)
Source: [GitHub] / [Scrapbox]