tsnetworkc3.png更新日記 - 日曜プログラマのひとりごと
更新日記インデックス
Subscribe to RSS1.0 | Subscribe to Atom1.0

日記: 更新日記: 駱駝・楽土カフェ 図書館帰りの道草日記 - YouTube | 自然観察マップ  随時更新中 | ポッドキャスト | (9) 保江邦夫(形而上学的素領域理論)研究 - YouTube | ホーム投稿(コミュニティ)  随時更新中  | Util: TurboScribe | iCloud写真 || 脳髄の日記 | 第四の日記 | Facebook | Myspace | コメントはjscripter's X(fka Twitter)にどうぞ

| 先月 | Monthly Index | Timeline | Mobile版 powered by iUI
8/29/2025 (Fri.)

うまくいくという話ではないが、あまりに高速に話が展開するので、日記を書く余裕もない。メモ的に。Hugging FaceのModelも段落の要約に使ったが、うまくいかない。結局、段落の最初のチャプターテキストを表示することに。(14) 図書館帰りの道草日記 139 - YouTubeをベースにずっと検討している。段落-キーワード共起ネットワーク

全体像

全体像

マウスのスクロールやスマホの指で広げるピンチアウト操作で像を拡大できる。


部分像

部分像

横長のタイトル表示がある段落ノードをクリックすれば、ツールチップで段落の全体と段落を構成するYouTubeチャプターへのハイパーリンクのリストを表示できる。その他の円形のノードはキーワードで関連のある段落につながっている。


他にもおもしろいものはあるが、表示に時間が掛かる。上記のサンプルは高速に起動する。

同一テーマのチャットでChatGPTも4人目だが、ログテキストが8000行を越えた。これまでは4000行程度で切り替えることになっていた。今回も一度リミットに達したという表示が出たが、後で再度トライのボタンが出たので、それから再開している。

長くできることに意味があるわけではなく、結局、長くなればその中で記憶喪失が起こるわけだ。前に自分で書いたスクリプトを忘れている。スクリプトに含まれている前提が抜けてくる場合は、記憶喪失だ。簡単なのは、前のスクリプトを提示して、新たな問題を提起することだが、必要要件を言葉で説明することもできる。今回経験したケースでは4.5分ぐらい考えた。完全には復元しないが、使えるものになる。これも自分でスクリプトを弄れるぐらいでないと難しい作業になる。自分でできたとしても、デバッグするのが難しい、面倒な場合はAIに聞くのが早い。方向性が決まるし、新しい知識を引き出せる。

更新: 2025-08-29T15:01:29+09:00
8/26/2025 (Tue.)

疲れたので、少し遊ぼう。そう言いながらも、読書データベースを道草でどう取り扱うかを考えている。Claudeの読書データベースでは、読書間の関係を表現するという部分、肝心な部分は実装されなかった({08/02/2025: [A.I.]Claudeとの対話 - 読書データベースから読書マップへ}←)。存在しないものを表現することはできないから当然のことではある。中味のない依頼は、如何にAIといえども答えようがない。世のなかに事例があれば答えられるだろうが、世の中にも存在しないのだろう。一応の構想は含まれていた。大したものだが、その方向性を追い掛けても、おそらく答えにはならないだろう。意味ネットワークや共起ネットワークが意味のあるものになりにくいように。しかし、もう一度検討してみる価値は残されているかもしれない。

むかし、GraphVizで形態素のネットワークは作ってみたことがある({テキストのグラフ化 (2005/04/03)}←)。それも意味にはつながらなかった。言葉は文や段落で意味を持つのであって、それ未満の単位では意味のある意味を持たない。結局、最後は文や段落まで戻ることになる。それを起点としてグラフはあり得るか。ネットワーク・グラフに文や段落を越えた意味を持たせられるかということ。そういうわけだ。当時、想像できなかったようなことができるようになってきている({08/24/2025: [言語]GPT-5あるいはその代理との道草 - 共起ネットワークで道草日記意味的ビュワーを作る試み}←)。ノードをクリックすれば、チャプターへのハイパーリンクのリストを表示できる。

2025-08-19の日記:
https://youtu.be/uOfGwroa6gg
Zepp20250819181647.gpx
18:42:30
0:01 {はい、これだけは元気よく、今日は一冊、「%1シンギュラリティは」、どうですか、「%2より近く」 (タイトル)、「%人類がAIと融合するとき」 (副タイトル)、
0:23 %#レイ・カーツワイル (著者)、%高橋則明 (訳者)訳。「%THE SINGULARITY IS NEARER」 (原タイトル) 「%When we merge with AI」 (原副タイトル)、翻訳通りです。%NHK出版 (出版社)です。
0:59 %2024年 (出版年)の11月ですね。英文も%2024年 (原著年)だね。}{#シンギュラリティ という言葉を使って、「%シンギュラリティは近い」 (タイトル)というのが%2005年 (出版年)に出版されているんですね。イントロに書かれている。
2:01 20年近く前にシンギュラリティという言葉を使って。}
2:24 {「いつの日かナノテクノロジーによってクラウド上のバーチャルの神経細胞、ニューロン層とバーチャルのニューロン層と人間の脳が接続され、脳が直接的に拡張されるまでに至るだろう。
2:44 こうして人間はAIと融合して、人間が本来持つ力の数百万倍の計算能力まで有するようになる。これによって人間の知能と意識は想像もつかないほど大きく拡張される。これがシンギュラリティによって起こることだ。」
3:01 そういうことですね。}
3:04 {それが実際に#2024年 になったら、今の生成LLM、Large Language Model、人工知能を見ているとそれに近いようなことが起き始めていると、
3:28 言えなくはないですね。直接的に脳と結びついているわけではないけど、言葉で結びついていますね。}
3:41 {言葉を入れると、最近は話しかけると言葉で応答してくれるみたいな感じで。
3:49 今朝、#ChatGPT を使っているとマイクにアクセスしていいかというメッセージが出てきました。一応使っているときはいいよということでOKを出しました。
4:12 でも、しゃべって何かやるというのは、なかなか(やりにくい)、やっている人も結構いますけどね。}
4:26 {ChatGPT はだんだんサービスとして、無料サービスでもかなり良くなってきていますね。
4:53 そうですね、かなり良くなってきています。
5:02 一つのチャットをずっと続けられるんですよ。#GPT-5 、一つのチャットで14,000行を超えているので、テキストでですね、超えてきているので。}
5:25 {GPT-5を使うのは制限があるんですけど、リミットが解除されるんですね。
5:37 長くても何時間、何十時間、一日以内ぐらいでリミットが解除されるので、また使い始められるんですけど、それぐらいがちょうどいいんですよね。
5:49 こちらが疲れちゃっているから、使えない方が休めるんですね。使えると使っちゃうから、余計疲れてしまう。
6:01 人間はそのスピードには追いつけないので、自分のペースで、マイペースで使うのがコツですね。
6:13 だから、あれを仕事で本格的に使ったらですね、これは人間が疲弊してしまいますよ、おそらく。もう分かりませんけど。
6:27 だから、ある程度制限して使わないと、そのスピードはね、すごい速さだから。}
6:35 {いやもう、今日はね、いろいろ考えさせることができるんですね。今日は2分ぐらい考えさせることができましたね。
7:01 それはね、やはりどんどん自分が思うことを伝えるっていうか、納得いかないことをどんどん伝えるっていうのはものすごく重要で、
7:15 そうするとね、どんどんどんどん向こうもね、いろいろ調べて一生懸命考えるんですね。
7:29 そんな感じがしてますね。だから別に隠してるわけじゃなくて、その時点で考えて、いろいろなところから必要なものを引き出してきて、回答を出してくる。
7:51 そういう感じがしてますね。
7:58 ところが、とにかくどんどんどんどん新しい要素が出てくるっていうか、知らないことがどんどん出てくるんです。
8:17 本当にそれはすごい。世界にないことは出てこないわけですけどね。
8:27 だからそれはね、適当に妥協して使ってると、そこで止まってしまうんですね。妥協しちゃダメなんですよ。
8:38 自分が考えてることを伝えて、それが実現できるように考えてもらうと。
8:48 そういうことによってどんどんどんどん情報がですね、新しい情報を元にいろいろなものが出てきます。}
8:59 {今私はプログラミングを、スクリプトを書いてるんで、コーディングをやってるんで。
9:08 この道草関係でね、%道草日記 を%自然観察マップ っていうので一つアプリケーションができたんですけど。
9:20 これもちゃんと紹介しないといけないんですけど。
9:25 一応リンクは貼ってるんで、このチャンネルの説明欄に最後にリンクがありますんで、そこから見ていただくと。
9:40 これはスマホでもちゃんと使えるようになってるんで、非常に面白いですね。
9:49 使い方は今後、もうちょっと説明する機会を持ちたいと思っています。}
10:04 {それで、その関係で、これは家から持ってきたんですけど、一冊だけ重いから、こういう関係のほう、軽いやつを一冊持ってきました。
10:18 %#オライリージャパン (出版社)、「%機械学習のための特徴量エンジニアリング (タイトル)」- 「%その原理とPythonによる実践 (副タイトル)」。
10:28 AI関係はね、#Python で書かれてる場合が多いんで、私はPythonじゃなくて#Perl で書きたいんだけど、
10:37 Perlとか#Raku でね、本当言うとやりたいんだけど、基本的にはPerlも使って書いてやってます。
10:51 だんだんやってることが#機械学習 的なものに近くなってきたんで、道草もですね、機械学習する材料になり得るというふうに思っています。}
11:12 {要は道草で何が起こってるのかっていうのをね、どういうふうに表現するのかって、動画を見ればすぐわかるじゃないってことにはなるんですけども、
11:27 動画を見るだけではね、どれを見ていいかわかりませんよね。
11:32 動画全体を見てどんなことがわかるのかっていうのも、動画全体をすべて見るわけにはいかないし、
11:41 自然観察マップの中でマップを使えばいろいろ検索してみることはできるんですけども、
11:48 それでいちいちすべて検索したりね、してみるというわけにもなかなかすべて結局見るってことになるわけじゃないので、
11:59 道草することによって何がわかるのか、どんなことがわかるのかっていうことをまとめるためにAIを使うみたいな感じですね。
12:15 そういうふうな使い方ができないかなっていうふうにも思ってやってます。}
12:27 {そういうことで今日のところは、また今日のところはこれもAI関係で、AIカフェみたいな形でですね、
12:42 %一人読書会 の中で%AIカフェ をやろうというふうにも思っています。
12:48 以上です。}
12:51 {あ、そうか、時間を言っておかないといけない。
12:54 ただいま%18時55分24秒 (動画開始時刻推算用)です。
12:59 はい、一旦終了します。}

今は、YouTubeの字幕チャプターを{}で括ることによって段落化し、段落にある定型的な情報、書籍データに書籍タグを設定して抽出するような仕組みを検討中だ。拡張ハッシュタグでは英文タイトルのように半角空白を含むものは抽出できない。

更新: 2025-08-27T12:22:57+09:00
8/24/2025 (Sun.)

GPT-5の天下も終わったらしいが、Overview Leaderboard | LMArenaによれば、「Claude Opus 4.1 thinking-16k (20250805)」、Claude Opus 4.1 - Anthropic(2025年8月6日)なのか、DeepSeekの新AIがGPT-5を凌駕 AI Revolution チャンネル登録者数 45万人 146,421 回視聴 2025/08/21(deepseek-ai/DeepSeek-V3.1 - Hugging Face)なのか、さて何がどうなるのか。GPT-5は僻みっぽいし、皮肉っぽい。それで人気がないんだろう。しかし代理はなかなかよし。

私: ありがとうございます。非常におもしろいものができたのではと思います。キーワード-カテゴリ辞書を拡張して、拡張ハッシュタグを追加し、動画も少しずつ追加して、いろいろと試してみたいと思います。ありがとうございました。また相談に乗ってください。今日のところはお休みなさい。

ChatGPT: どういたしまして!こちらこそ、一緒に整理しながら進められてとても面白かったです。

キーワード‐カテゴリ辞書を育てていけば、道草日記ならではの「意味的ビューワ」がますます鮮明になっていきそうですね。

また動画が増えてきたら、新しい固有名詞の検出やクラスタの調整なども一緒に工夫できると思います。

では今日はゆっくりお休みください。

またいつでもご相談くださいね。おやすみなさい!

(同一テーマのチャットで四人目のChatGPT、今回はメッセージの制限に突然到達したので、最初から根本的な概念と現状を整理して説明することになった。説明することで、自分の考えてきたこと、考えていることが明確になっていく。合理性・論理性がないと生成AI(LLM)も受け止めきれない。DeepSeek-R1も同じだった。)

道草日記意味的ビュワー(共起ネットワークの一つ)像の一部

道草日記意味的ビュワー(共起ネットワークの一つ)像の一部

道草日記意味的ビュワー(共起ネットワークの一つ)。(License - pyvis 0.1.3.1 documentation)

Introduction - pyvis 0.1.3.1 documentationを使っているが、Vis Network Examples(vis.js - Network documentation.)の上に構築されているので、WEBで動くようだ。そのメリットは大きい。


道草日記意味的ビュワー(共起ネットワークの一つ)像の全体

道草日記意味的ビュワー(共起ネットワークの一つ)像の全体

中央部分のネットワークは長い間揺れている。起動するたびに異なる視覚像が得られるように思う。それぞれの群落の意味を確認して、言葉の切り分けをどう制御するか考える必要があるだろう。まずは固有名詞をきちんと切り出す必要がある。


ChatGPTとの対話の中で、様々なケースを試しながら、考え方を練り、データ形式を整えてきた。ChatGPTと役割分担を明確にし、Perlスクリプトを整備した。道草日記の言わば意味的な地図をどう作るのかを考えてきたわけだ。意味のあるデータを作ればそれを表現できるだろうと思えるところに到達したと思う。{追記(2025-08-28): 拡張ハッシュタグ(キーワード-カテゴリ)を増やして試してみたが、汎用辞書による形態素解析と分離できていないことが問題。キーワード-カテゴリを除いた部分だけ汎用辞書で処理することにしたいところだね。}

現段階のPythonスクリプトは次のようなものだ。

import pandas as pd
import MeCab, ipadic
import re
from collections import defaultdict, Counter
import networkx as nx
from pyvis.network import Network
import community  # python-louvain
import random

# --- データ読み込み ---
df = pd.read_csv("139all_chap_with_paragraph.txt", sep="\t", header=None,
                 names=["episode","video","time","url","text"])

# --- MeCab準備 ---
tagger = MeCab.Tagger(ipadic.MECAB_ARGS)

# --- 拡張ハッシュタグ抽出 ---
hashtag_pattern = re.compile(r'(?:第[0-9一二三四五六七八九十]+)?#([\w一-龠ぁ-んァ-ンー]+) \(([^)]+)\)')
paragraph_hashtags = {}
custom_keywords = set()
keyword_to_category = {}

for i, row in df.iterrows():
    hashtags = []
    for m in hashtag_pattern.finditer(row["text"]):
        keyword = m.group(1)
        category_full = m.group(2)
        category = category_full.split("|")[1] if "|" in category_full else category_full
        instance_prefix = row["text"][m.start():m.end()].split("#")[0]
        instance_name = f"{instance_prefix}{keyword}" if instance_prefix else keyword
        hashtags.append(instance_name)
        custom_keywords.add(keyword)
        keyword_to_category[instance_name] = category
    paragraph_hashtags[i] = hashtags

# --- 名詞抽出 ---
paragraph_nouns = {}
for i, row in df.iterrows():
    node = tagger.parseToNode(row["text"])
    nouns = []
    while node:
        if node.feature.split(",")[0] == "名詞":
            nouns.append(node.surface)
        node = node.next
    for kw in custom_keywords:
        if kw in row["text"] and kw not in nouns:
            nouns.append(kw)
    paragraph_nouns[i] = {"nouns": nouns, "url": row["url"], "time": row["time"], "text": row["text"]}

# --- ノードと共起エッジ作成 ---
noun_paragraphs = defaultdict(list)
edges = defaultdict(int)
for pid, data in paragraph_nouns.items():
    hashtags = paragraph_hashtags.get(pid, [])
    nouns = list(set(data["nouns"] + hashtags))
    for n in nouns:
        noun_paragraphs[n].append((data["url"], data["time"], data["text"]))
    for i in range(len(nouns)):
        for j in range(i+1, len(nouns)):
            edges[(nouns[i], nouns[j])] += 1

# --- ネットワーク作成 ---
G = nx.Graph()
for (n1, n2), w in edges.items():
    G.add_edge(n1, n2, weight=w)

# --- クラスタリング ---
partition = community.best_partition(G, weight='weight')
cluster_labels = {}
for cid in set(partition.values()):
    cluster_nodes = [n for n, c in partition.items() if c == cid]
    counts = Counter({n: len(noun_paragraphs[n]) for n in cluster_nodes})
    top3 = [w for w, _ in counts.most_common(3)]
    cluster_labels[cid] = " / ".join(top3)

# --- カテゴリごとの色割り当て ---
unique_categories = list(set(keyword_to_category.values()))
category_colors = {}
for cat in unique_categories:
    # ランダムに明るめの色を割り当て
    color = "#%06x" % random.randint(0x555555, 0xDDDDDD)
    category_colors[cat] = color

# --- PyVisネットワーク ---
net = Network(height="800px", width="100%", notebook=False, directed=False)

for noun, plist in noun_paragraphs.items():
    tooltip_html = "<div style='max-height:200px;overflow-y:auto;'>"
    tooltip_html += "<br>".join([f"<a href='{url}' target='_blank'>{time}|{text}</a>" for url, time, text in plist])
    tooltip_html += "</div>"

    category = keyword_to_category.get(noun, "")
    if noun in custom_keywords:  # ハッシュタグ固有名詞
        color = category_colors.get(category, "green")
        size = 20
        shape = "dot"
    else:  # 補助名詞
        color = "lightgray"
        size = 10
        shape = "diamond"

    net.add_node(noun, title=tooltip_html, value=len(plist), color=color, shape=shape, group=category)

# クラスタラベルノード追加
for cid, label in cluster_labels.items():
    cluster_nodes = [n for n, c in partition.items() if c == cid]
    net.add_node(f"cluster_{cid}", label=label, color="white", shape="box", value=0)
    for n in cluster_nodes:
        net.add_edge(f"cluster_{cid}", n, value=0.5)

# 共起エッジ追加
for (n1, n2), w in edges.items():
    net.add_edge(n1, n2, value=w)

# --- HTML出力 ---
net.show("cooccurrence_network_colored.html", notebook=False)

今のところ、段落開始記号({)、段落終了記号(})は,チャプターテキストに存在しているだけで、使用されていない。Louvain法の概要と適用事例及び実装例について | Deus Ex Machinaについても調べてみる必要がある。

更新: 2025-08-27T22:49:53+09:00
8/18/2025 (Mon.)

【批評家・宇野常寛】“ラーメン”で世界と関わり、“瞑想”で自分を肯定する/「何者でなくていい」/現代は自己実現として“父”が実現できない【1on1】 TBS CROSS DIG with Bloomberg チャンネル登録者数 27万人 7,184 回視聴 2025/08/16を見た。

「道草」で世界と関わり、「プログラミング」で自分を肯定するという感じだけど。趣味のプログラミングは瞑想みたいなもの。プログラムが動くと単純にうれしい。何者でもないね。AIが作ってくれたものをデバッグしてエラーを取り除くのが趣味になってきた。AIに任すのは良いが、なぜ動くのか理解できていないのはまずいのではないか。実際、デバッグするだけに終わらない。次第にいろいろなものが見えてくる。AIとの対話はプログラミング能力の向上をもたらすだけでなく、世界認知の拡大をもたらす。Pythonのコードが次第に読めるようになってきただけでなく、関連知識も見えてくる。関係スキーマから関係ネットワーク、共起ネットワーク、IPA辞書、UniDic、SentencePieceによる道草モデルの生成と利用。

しゃべり字幕は不完全な言葉。これを整形して、口語文にするスクリプトって書けるだろうか。自分で書き直すのが正解か!?実際、下書きはTurboScribeが作ってくれるが、字幕の言葉を確定しているのは自分自身だし、言い間違いや誤りに気付くのは自分自身だろう。追記部分をどう取り扱うのかという問題もある。

opendir(CHAPS, ".");
@chap_files = grep(/^.+_chap\.txt$/, readdir(CHAPS));
for $chap_file (@chap_files){
	if(open IN, $chap_file){
		while(<IN>){
			if(/^\d+:\d+ (.+)$/){
				$chap_text = $1;
				$chap_text =~ s/\#([^ ]+) \([^)]+\)/$1/g;
				$chap_text =~ s/^「(.+)」$/$1/;
				$chap_text =~ s/\(([^)]+)\)/、$1、/g;
				$chap_text =~ s/{([^}]+)}/$1/g;
				$chap_text =~ s/ +//g;
				print $chap_text, "\n";
			}
		}
		close IN;
	}
}
closedir(CHAPS);

これは、動画単位の改行で区切られたチャプターテキストを一つのファイルにまとめるPerlスクリプト。経過時間や拡張ハッシュタグなどを取り除いて、しゃべりだけのクリーンなテキストにする。どのようなルールで不完全な言葉を文にまとめるか。不完全なテキスト行をSentencePieceでモデル化すると区切りが不自然なものになるような気がする。

更新: 2025-08-19T10:43:29+09:00
8/17/2025 (Sun.)

SentencePieceの話が出てくる前に、最近考えたことをプロンプトに入れて、字幕データからの文脈ブロックの抽出アルゴリズムを提案してもらった。

自然観察動画の字幕・チャプターからの分析ですね。そもそも、課題は二つあります。一つは動植物の行動や状態をしゃべり字幕からどう捉えるか、方法論を確立したいということ、もう一つは、ショート動画の切り出しを自動化すること。後者は原理的に難しい。前者を実現できれば、しゃべり字幕の塊、文節構造を捉えることができ、後者の動画の意味のある範囲の推定に役立つ可能性がある。しゃべりの方法論を含めて、考慮する必要があるかもしれない。

しゃべりでstart-endをマーキングすればいいはずだが、道草の出来事は予測不能だ。まず、字幕を入れて全体を把握したうえで、映像を見ながら切り出し範囲を決めていくべきなのだろう。今は、最初から順に成り行きで決めている。記憶の細道を辿りながら、記憶を少しづつ再生しながら、順に決めている。何がどう起こったか、何を考えたかなど、明確に記憶しているわけではない。動画がなければ、記憶の彼方に消えてしまうだろう。ショート動画のタイトルは追体験の記憶なのだ。しゃべりとは違う、記憶の演技でもある。

({08/14/2025: [A.I.]お盆のGPT-5あるいはその代理との道草 - 関係ネットワーク・共起ネットワークのグラフ化}←)

次のPythonスクリプトはエラーで動かなかったが、二か所、僕が修正して動くようにしたもの。「mecab = MeCab.Tagger(-Ochasen)」の「-Ochasen」を削除。なぜか、ChatGPTは-Ochasenを使いたがる。ChaSenはEUCコードでWindowsでインストールするにはCygwinを使うらしい。引数を空にしておけば、UniDicが使われる。もう一つは、.srt形式の字幕ファイルの時刻秒数は"ss,sss"のカンマ区切り表示になっているので。"ss.sss"のようにピリオド小数点数値表示にする必要がある。

import re
import MeCab
from datetime import timedelta

# ====== SRT 読み込み ======
def parse_srt(file_path):
    with open(file_path, "r", encoding="utf-8") as f:
        content = f.read()

    pattern = r"(\d+)\s+(\d{2}:\d{2}:\d{2},\d{3}) --> (\d{2}:\d{2}:\d{2},\d{3})\s+(.*?)\s+(?=\d+\s+\d{2}|\Z)"
    matches = re.findall(pattern, content, re.DOTALL)

    subtitles = []
    for m in matches:
        index, start, end, text = m
        start_time = srt_time_to_seconds(start)
        end_time = srt_time_to_seconds(end)
        subtitles.append({
            "start": start_time,
            "end": end_time,
            "text": text.replace("\n", " ")
        })
    return subtitles

def srt_time_to_seconds(t):
    h, m, s = t.split(":")
    s = s.replace(",", ".")
    return int(h)*3600 + int(m)*60 + float(s)

# ====== MeCab によるキーワード抽出 ======
mecab = MeCab.Tagger()

def extract_keywords(text):
    node = mecab.parseToNode(text)
    targets, actions, states = [], [], []
    while node:
        word = node.surface
        features = node.feature.split(",")
        pos = features[0]
        base = features[6] if len(features) > 6 else word

        if pos == "名詞":
            targets.append(base)
        elif pos == "動詞":
            actions.append(base)
        elif pos in ["形容詞", "副詞"]:
            states.append(base)

        node = node.next
    return {
        "target": targets[0] if targets else None,
        "actions": actions,
        "states": states
    }

# ====== ブロック分割 ======
def segment_blocks(subtitles, gap_threshold=10):
    blocks = []
    current_block = []
    last_time = None
    last_target = None

    for sub in subtitles:
        kw = extract_keywords(sub["text"])
        target = kw["target"]

        # 1. 時間ギャップ
        if last_time and (sub["start"] - last_time > gap_threshold):
            if current_block:
                blocks.append(current_block)
                current_block = []

        # 2. 対象の変化
        if last_target and target and target != last_target:
            if current_block:
                blocks.append(current_block)
                current_block = []

        # 追加
        sub["keywords"] = kw
        current_block.append(sub)

        last_time = sub["end"]
        if target:
            last_target = target

    if current_block:
        blocks.append(current_block)

    return blocks

# ====== 実行サンプル ======
if __name__ == "__main__":
    srt_file = "図書館帰りの道草日記 139 道草前編.srt"  # あなたの字幕ファイルに置き換え
    subs = parse_srt(srt_file)
    blocks = segment_blocks(subs)

    for i, block in enumerate(blocks, 1):
        print(f"=== Block {i} ===")
        for sub in block:
            print(f"[{sub['start']:.1f}-{sub['end']:.1f}] {sub['text']} | {sub['keywords']}")
        print()

その出力。

=== Block 1 ===
[0.7-1.4] (TurboScribe.aiによって文字起こしされました。) 行きます。 | {'target': 'ai', 'actions': ['ヨル', 'オコス', 'スル', 'イク'], 'states': []}

=== Block 2 ===
[20.6-26.9] 凄い、凄い夏ですね。 | {'target': 'ナツ', 'actions': [], 'states': ['スゴイ', 'スゴイ']}

=== Block 3 ===
[27.8-31.7] 入道雲も出ています。 | {'target': 'ニュウドウ', 'actions': ['デル', 'イル'], 'states': []}

=== Block 4 ===
[50.1-51.1] 凄いですね。 | {'target': None, 'actions': [], 'states': ['スゴイ']}

=== Block 5 ===
[157.4-159.5] ヒロデンもなしですね。 | {'target': 'ヒロデン', 'actions': [], 'states': []}

=== Block 6 ===
[160.0-163.0] 残念ながら、行きはないです。 | {'target': 'イキ', 'actions': [], 'states': ['ナイ']}

=== Block 7 ===
[168.5-173.6] 時刻、ただいま16時47分31秒です。 | {'target': 'ジコク', 'actions': [], 'states': []}

=== Block 8 ===
[176.7-178.8] 渡りましょう。皆実線渡ります。 | {'target': 'ミナ', 'actions': ['ワタル', 'ワタル'], 'states': []}

=== Block 9 ===
[255.3-278.0] さて、・・・・・・だいぶですね、濁ってきてるんですかね。 | {'target': None, 'actions': ['ニゴル', 'クル'], 'states': []}

=== Block 10 ===
[278.8-285.0] 緑色の藻類が出てるかもしれないですね。 | {'target': 'ミドリイロ', 'actions': ['デル', 'シレル'], 'states': []}

=== Block 11 ===
[286.1-288.1] 透明度はある程度あるので。 | {'target': 'ド', 'actions': ['アル'], 'states': []}

=== Block 12 ===
[291.2-292.7] 魚が見えてもおかしくない。 | {'target': 'サカナ', 'actions': ['ミエル'], 'states': ['オカシイ', 'ナイ']}
[292.7-294.1] あっ、魚がいるわ。 | {'target': 'サカナ', 'actions': ['イル'], 'states': []}
[296.5-297.3] ちっちゃいのが。 | {'target': None, 'actions': [], 'states': []}

=== Block 13 ===
[322.6-323.9] ちょっと見えにくいので。 | {'target': None, 'actions': ['ミエル'], 'states': ['チョット']}

=== Block 14 ===
[328.2-329.8] 傘をつけないと難しい。 | {'target': 'カサ', 'actions': ['ツケル'], 'states': ['ムズカシイ']}
[330.7-331.7] 傘をつけます。 | {'target': 'カサ', 'actions': ['ツケル'], 'states': []}
[333.4-337.4] 傘をつけても大して役には立たないような気もしますけど。 | {'target': 'カサ', 'actions': ['ツケル', 'タツ', 'スル'], 'states': ['タイシテ']}
[340.2-343.3] あー、いる。 | {'target': None, 'actions': ['イル'], 'states': []}

=== Block 15 ===
[343.6-344.2] チヌがいる。 | {'target': 'チヌ', 'actions': ['イル'], 'states': []}

=== Block 16 ===
[365.9-366.1] あれ? | {'target': None, 'actions': [], 'states': []}

=== Block 17 ===
[374.4-376.1] 今すぐはできないですね。 | {'target': 'イマ', 'actions': ['デキル'], 'states': ['スグ']}

=== Block 18 ===
[377.7-382.8] つける治具が取れてるみたいです。 | {'target': 'ジグ', 'actions': ['ツケル', 'トレル'], 'states': []}

=== Block 19 ===
[392.3-400.0] 第一ベンチでゆっくりやりましょう。 | {'target': 'イチ', 'actions': ['ヤル'], 'states': ['ユックリ']}

=== Block 20 ===
[409.9-412.6] ボートが来た。手漕ぎボートが。 | {'target': 'ボート', 'actions': ['クル'], 'states': []}

=== Block 21 ===
[414.4-417.4] いつもの人だろうね。前も一度撮りました。 | {'target': 'ヒト', 'actions': ['トル'], 'states': []}
[419.3-420.3] ここへ来るのかな? | {'target': None, 'actions': ['クル'], 'states': []}

=== Block 22 ===
[420.8-432.4] 前はここに第一船着き場にボートを上げましたけどね。 | {'target': 'マエ', 'actions': ['アゲル'], 'states': ['ダイイチ']}

=== Block 23 ===
[435.8-437.1] でもあれいつ頃だったかな。 | {'target': 'イツゴロ', 'actions': [], 'states': []}

=== Block 24 ===
[438.2-443.0] あー、今日はだいぶ水面が上がってますね。 | {'target': 'キョウ', 'actions': ['アガル'], 'states': ['ダイブ']}

=== Block 25 ===
[449.4-451.4] 石畳が濡れてます。 | {'target': 'イシダタミ', 'actions': ['ヌレル'], 'states': []}
[453.5-454.3] 引いてるのかな? | {'target': None, 'actions': ['ヒク'], 'states': []}
[455.7-458.3] 引いてるのかどうかちょっと見てみましょう。 | {'target': None, 'actions': ['ヒク', 'ミル', 'ミル'], 'states': ['ドウ', 'チョット']}

=== Block 26 ===
[464.4-468.6] 引いてる感じですね。ちょっと濡れてますもんね。 | {'target': 'カンジ', 'actions': ['ヒク', 'ヌレル'], 'states': ['チョット']}
[469.5-472.1] わからないな。どうだろう。 | {'target': None, 'actions': ['ワカル'], 'states': ['ドウ']}
[478.2-483.4] これ魚がいたかもしれないね。さっときてしまったけど。 | {'target': None, 'actions': ['イル', 'シレル', 'クル', 'シマウ'], 'states': ['サッ']}

=== Block 27 ===
[489.6-492.2] ちょっと第一ベンチに行って。 | {'target': 'イチ', 'actions': ['イク'], 'states': ['チョット']}

=== Block 28 ===
[497.6-499.8] もう平野橋を通って行っちゃったですね。 | {'target': 'ヒラノ', 'actions': ['トオル', 'イク'], 'states': ['モウ']}

=== Block 29 ===
[501.2-506.1] 手漕ぎボートのお父さんかお兄さんか。 | {'target': 'テコギ', 'actions': [], 'states': []}

=== Block 30 ===
[522.8-525.8] 危ない危ない。ここら辺で望遠をやってると。 | {'target': 'ヘン', 'actions': ['ヤル'], 'states': ['アブナイ', 'アブナイ']}

=== Block 31 ===
[526.4-531.9] 自分がふらふらして落ちちゃうかもしれないですね。 | {'target': 'ジブン', 'actions': ['スル', 'オチル', 'シレル'], 'states': ['フラフラ']}

=== Block 32 ===
[536.0-539.8] 第一ベンチ。ちょっと暑いだろうな。 | {'target': 'イチ', 'actions': [], 'states': ['チョット', 'アツイ']}

=== Block 33 ===
[542.0-545.0] 今日は日が照ってますからね。 | {'target': 'キョウ', 'actions': ['テル'], 'states': []}
[548.5-549.6] ちょっと座って。 | {'target': None, 'actions': ['スワル'], 'states': ['チョット']}

=== Block 34 ===
[560.2-561.2] ちょっとね。 | {'target': None, 'actions': [], 'states': ['チョット']}
[569.1-571.1] おそらくないだろうな。 | {'target': None, 'actions': [], 'states': ['オソラク', 'ナイ']}

=== Block 35 ===
[581.3-584.9] 入れてきたからね。入れるとき気づいてないってこと。 | {'target': 'トキ', 'actions': ['イレル', 'クル', 'イレル', 'キヅク'], 'states': []}

=== Block 36 ===
[604.2-605.2] ないですね。 | {'target': None, 'actions': [], 'states': []}
[610.3-611.0] 残念。 | {'target': None, 'actions': [], 'states': []}

=== Block 37 ===
[614.0-621.5] これつかないのか。しょうがないね。 | {'target': 'シヨウ', 'actions': ['ツク'], 'states': ['ナイ']}

=== Block 38 ===
[626.9-631.3] そんなこと言っても仕方がないので、諦めましょう。 | {'target': 'コト', 'actions': ['イウ', 'アキラメル'], 'states': ['ナイ']}

=== Block 39 ===
[636.3-639.6] それじゃあ行きましょうか。第一ベンチから。 | {'target': 'イチ', 'actions': ['イク'], 'states': []}

=== Block 40 ===
[663.3-663.8] 行きましょう。 | {'target': None, 'actions': ['イク'], 'states': []}

=== Block 41 ===
[678.9-686.8] また今日ちょっと魚の状態が変わってきたかもしれない。 | {'target': 'キョウ', 'actions': ['カワル', 'クル', 'シレル'], 'states': ['チョット']}

=== Block 42 ===
[727.4-730.0] スズメが飛んでました。 | {'target': 'スズメ', 'actions': ['トブ'], 'states': []}

=== Block 43 ===
[734.3-736.7] ちょっと水面が下がってきた。引いてるんですね。 | {'target': 'スイメン', 'actions': ['サガル', 'クル', 'ヒク'], 'states': ['チョット']}

=== Block 44 ===
[764.0-765.0] 今日はそうか。 | {'target': 'キョウ', 'actions': [], 'states': ['ソウ']}

=== Block 45 ===
[766.5-770.7] ちょっとあの近辺の状況を押さえるのを忘れてましたね。 | {'target': 'キンペン', 'actions': ['オサエル', 'ワスレル'], 'states': ['チョット']}

=== Block 46 ===
[772.0-773.4] 第二ヤマモモですね。 | {'target': 'ニ', 'actions': [], 'states': []}

=== Block 47 ===
[786.8-788.1] これはクスノキですね。 | {'target': 'クスノキ', 'actions': [], 'states': []}

=== Block 48 ===
[793.4-798.1] 百日紅。サルスベリが咲き始めました。 | {'target': 'サルスベリ', 'actions': ['サク', 'ハジメル'], 'states': []}

=== Block 49 ===
[799.0-800.0] 本格的に。 | {'target': 'ホンカク', 'actions': [], 'states': []}
[802.5-803.2] これはまあ。 | {'target': None, 'actions': [], 'states': ['マア']}

=== Block 50 ===
[805.6-807.1] 137(138)回か。 | {'target': '137', 'actions': [], 'states': []}

=== Block 51 ===
[809.4-813.6] 道草日記の、今回は138(139)回のはずなんで。 | {'target': 'ミチクサ', 'actions': [], 'states': []}

=== Block 52 ===
[815.6-819.9] (13)7(8)回でも既に紹介したものですね。 | {'target': '13', 'actions': ['スル'], 'states': ['スデニ']}
[824.1-828.7] さあちょっと。暑さにちょっとくたびれてるかもしれない。 | {'target': None, 'actions': ['クタビレル', 'シレル'], 'states': ['チョット', 'アツイ', 'チョット']}

=== Block 53 ===
[830.7-832.6] ヨシノツツジですね。 | {'target': 'ヨシノツツジ', 'actions': [], 'states': []}

=== Block 54 ===
[845.6-850.8] セイヨウキズタが勢いを増してきました。だんだん上がってきてる。 | {'target': 'セイヨウ', 'actions': ['マス', 'クル', 'アガル', 'クル'], 'states': ['ダンダン']}

=== Block 55 ===
[860.6-862.0] これはタブノキなんで。 | {'target': 'タブノキ', 'actions': [], 'states': []}
[863.3-865.2] ここのタブノキは上がちょっと枯れてる。 | {'target': 'タブノキ', 'actions': ['カレル'], 'states': ['チョット']}

=== Block 56 ===
[872.6-874.5] これはクスノキでしょうね。 | {'target': 'クスノキ', 'actions': [], 'states': []}

=== Block 57 ===
[897.5-900.3] あー。スズメがいましたね。 | {'target': 'スズメ', 'actions': ['イル'], 'states': []}
[900.8-902.9] スズメが飛んで。あそこハクセキレイだ。 | {'target': 'スズメ', 'actions': ['トブ'], 'states': []}
[912.8-914.1] ちょっと見えないですね。 | {'target': None, 'actions': ['ミエル'], 'states': ['チョット']}

=== Block 58 ===
[920.5-921.2] 上へ上がった。 | {'target': 'ウエ', 'actions': ['アガル'], 'states': []}

=== Block 59 ===
[966.1-968.6] 平野橋下では小さな魚がね。 | {'target': 'ヘイヤ', 'actions': [], 'states': []}

=== Block 60 ===
[969.3-971.5] ちょっと泳いでましたね。チヌもいましたけど。 | {'target': 'チヌ', 'actions': ['オヨグ', 'イル'], 'states': ['チョット']}
[972.9-974.4] 大きなチヌも見えました。 | {'target': 'チヌ', 'actions': ['ミエル'], 'states': []}
[976.2-977.3] ?がってましたね。 | {'target': None, 'actions': [], 'states': []}
[977.3-985.1] 見えませんね。 | {'target': None, 'actions': ['ミエル'], 'states': []}

=== Block 61 ===
[993.6-996.1] 石畳からは完全に水が引いてます。 | {'target': 'イシダタミ', 'actions': ['ヒク'], 'states': []}

=== Block 62 ===
[998.0-1003.6] だいたいどの船着き場も高さは(同じ)やはり土木技術がすごい。 | {'target': 'ダイタイ', 'actions': [], 'states': ['タカイ', 'ヤハリ', 'スゴイ']}

=== Block 63 ===
[1020.8-1028.2] これ最近ショートで上げた虫と一緒のような気がしますね。 | {'target': 'サイキン', 'actions': ['アゲル', 'スル'], 'states': []}
[1036.2-1037.9] 何ですかね、これね。 | {'target': None, 'actions': [], 'states': []}

=== Block 64 ===
[1038.4-1040.7] 何か目が大きいんですよ。 | {'target': 'メ', 'actions': [], 'states': ['オオキイ']}
[1041.9-1043.5] ちょっとよくわかんないですね。 | {'target': None, 'actions': ['ワカル'], 'states': ['チョット', 'ヨク']}
[1047.3-1048.0] 逃げちゃいました。 | {'target': None, 'actions': ['ニゲル'], 'states': []}

=== Block 65 ===
[1049.1-1050.2] 蜂の一種。 | {'target': 'ハチ', 'actions': [], 'states': []}

=== Block 66 ===
[1051.8-1054.6] 一種とはちょっと蜂ではないような。 | {'target': 'イッシュ', 'actions': [], 'states': ['チョット', 'ナイ']}

=== Block 67 ===
[1056.9-1058.6] アブかな。アブの類かな。 | {'target': 'アブ', 'actions': [], 'states': []}

=== Block 68 ===
[1086.0-1087.2] またいましたね。 | {'target': None, 'actions': ['イル'], 'states': ['マタ']}

=== Block 69 ===
[1090.2-1092.0] あれちょっと気になるな。 | {'target': 'キ', 'actions': ['ナル'], 'states': ['チョット']}

=== Block 70 ===
[1092.5-1094.4] アブで調べてみようか。 | {'target': 'アブ', 'actions': ['シラベル', 'ミル'], 'states': []}

=== Block 71 ===
[1099.0-1103.6] あのショート動画をGeminiに渡して | {'target': 'ショート', 'actions': ['ワタス'], 'states': []}

=== Block 72 ===
[1104.7-1107.8] 映ってる昆虫は何かって聞いたらハエトリグモだって。 | {'target': 'コンチュウ', 'actions': ['ウツル', 'キク'], 'states': []}

=== Block 73 ===
[1109.2-1112.1] ハエトリグモはないよね。 | {'target': 'ハエトリ', 'actions': [], 'states': ['ナイ']}

=== Block 74 ===
[1126.1-1127.6] 人工知能も当てになりません。 | {'target': 'ジンコウ', 'actions': ['ナル'], 'states': []}

=== Block 75 ===
[1150.4-1159.0] ちょっと諸君、ちゃんと綺麗に映ってくれないと。 | {'target': 'ショクン', 'actions': ['ウツル', 'クレル'], 'states': ['チョット', 'チャント']}
[1166.0-1168.5] こっちでよく見えないんだからさ。 | {'target': None, 'actions': ['ミエル'], 'states': ['ヨク']}

=== Block 76 ===
[1170.2-1171.0] ダメだね。 | {'target': 'ダメ', 'actions': [], 'states': []}

=== Block 77 ===
[1172.7-1174.9] 画面がよく見えない状態なんだよ。 | {'target': 'ガメン', 'actions': ['ミエル'], 'states': ['ヨク']}
[1176.9-1179.2] それがなくても撮れにくいのに。 | {'target': None, 'actions': ['トル'], 'states': ['ナイ']}
[1185.1-1186.7] 隠れちゃってるんだろうね。 | {'target': None, 'actions': ['カクレル'], 'states': []}

=== Block 78 ===
[1192.3-1194.8] 二手に分かれて逃げていったね。 | {'target': 'ニ', 'actions': ['ワカレル', 'ニゲル', 'イク'], 'states': []}

=== Block 79 ===
[1204.2-1205.7] 第2ベンチに行っちゃいそうだね。 | {'target': '2', 'actions': ['イク'], 'states': []}

=== Block 80 ===
[1237.6-1239.8] 第4ですね。第4船着き場。 | {'target': '4', 'actions': [], 'states': []}

=== Block 81 ===
[1244.7-1248.9] もう1段目が姿を現してきてますね。 | {'target': '1', 'actions': ['アラワス', 'クル'], 'states': ['モウ']}

=== Block 82 ===
[1248.9-1249.8] 引きが早いですね。 | {'target': 'ヒキ', 'actions': [], 'states': ['ハヤイ']}

=== Block 83 ===
[1289.0-1295.2] 1,2,3,4,5,6段目ぐらいまで見えてますね。 | {'target': 'イチニ', 'actions': ['ミエル'], 'states': []}

=== Block 84 ===
[1295.4-1296.9] 6段目でも見えなくなってる。 | {'target': '6', 'actions': ['ミエル', 'ナル'], 'states': []}

=== Block 85 ===
[1298.9-1300.6] 結構透明度ありますね。 | {'target': 'ド', 'actions': ['アル'], 'states': ['ケッコウ']}

=== Block 86 ===
[1302.8-1305.1] だいたい1段が20センチなんですね。 | {'target': 'ダイタイ', 'actions': [], 'states': []}

=== Block 87 ===
[1325.5-1331.0] 第2ベンチで一人読書会にしましょうか。 | {'target': '2', 'actions': ['スル'], 'states': []}

=== Block 88 ===
[1332.0-1333.3] 日陰がいいんだけど。 | {'target': 'ヒカゲ', 'actions': [], 'states': ['ヨイ']}

=== Block 89 ===
[1345.6-1347.6] ここでやろうか。 | {'target': None, 'actions': ['ヤル'], 'states': []}

=== Block 90 ===
[1357.8-1361.5] それでは一旦中断します。 | {'target': 'チュウダン', 'actions': ['スル'], 'states': ['イッタン']}

もう少し考える必要はあるが、まあ、これを見て思うのは、ユーザー辞書は必須であること、そして、最終的な問題は自分自身の機械的自動化は難しいということ。自分でチャチャっと仕分けすれば済むことかもしれない。YouTubeショート動画の配信作業は文脈ブロック化そのものでもある。それを自動化したいのだけど、タイトルを自動で付けれるだろうか?課題はいくらでもある。ユーザー辞書を自動で作りたいわけだし、それを考えていて、sentencepieceにぶつかったわけだ。

ユーザー辞書の元になるはずの道草キーワード-カテゴリ辞書は現段階では次のようなものだ。これは手作業で辞書を作るのと同じだ。当初から、YouTube説明欄のチャプターテキストへの新規拡張ハッシュタグの追加からの抽出によってキーワード-カテゴリ辞書の拡大を計る計画だ。本来は自然観察マップ作成用の辞書だ。

拡張ハッシュタグ化用辞書
============
ナンキンハゼ tree|樹木
クスノキ tree|樹木
ヤマモモ tree|樹木
キョウチクトウ tree|樹木
タブノキ tree|樹木
サルスベリ tree|樹木
サクラ tree|樹木
ハナミズキ tree|樹木
ツバキ tree|樹木
オリーブ tree|樹木
ケヤキ tree|樹木
トウカエデ tree|樹木
セイヨウキンシバイ Shrub|低木
クチナシ Shrub|低木
シャリンバイ Shrub|低木
トベラ Shrub|低木
アジサイ Shrub|低木
ヨシノツツジ Shrub|低木
シナノツツジ Shrub|低木
セイヨウキヅタ plant|植物
キレハノブドウ plant|植物
サンシキスミレ plant|植物
チガヤ plant|植物
エイ fish|魚
チヌ fish|魚
スズキ fish|魚
小魚 fish|魚
フナムシ 甲殻類
ハチ 昆虫
トンボ 昆虫
チョウ 昆虫
アブ 昆虫
アオサギ bird|鳥
コサギ bird|鳥
スズメ bird|鳥
ツバメ bird|鳥
カラス bird|鳥
ハクセキレイ bird|鳥
カモメ bird|鳥
鵜 bird|鳥
トビ bird|鳥
ハト bird|鳥
小鳥 bird|鳥
水鳥 bird|鳥
草刈り その他
キノコ 菌類
マッシュルーム 菌類
ヘビ 爬虫類
何|謎|同定|どう|どこ 調査

非ハッシュタグ化用辞書
===========
干潟 地形
岸壁 地形
土手 地形
京橋川 地形
東岸 地形
西岸 地形
(第[1-8一-八])?船着き場 人工物
(第[1-4一-四])?ベンチ 人工物
(御幸橋|皆実線)?ヒロデン 人工物
(国道)?(2|二)号線 人工物
船着き場 人工物
石段 人工物
石畳 人工物
ベンチ 人工物
皆実線 人工物
平野橋 人工物
御幸橋 人工物
雁木 人工物
潮位 現象
水位 現象
水面 位置
水温 現象
透明度 現象
干満 現象
満ち引き 現象
川面 川
更新: 2025-08-17T22:34:37+09:00

「十分メンテナンスされていないUniDicなどを使わないで、すなわち(構成的・意味的にも)不十分なユーザー辞書をわざわざ作らずに共起ネットワークを作る方法はないでしょうか。共起ネットワークを作るために最小限の情報があればいいはずですね。」のようなプロンプトを書いた。

Mecab のコスト推定自動機能を使って UniDic のユーザ辞書をビルドする(2023/11/17に公開)やPython fugashiとUniDicのユーザー辞書で形態素解析 | トライフィールズ(2025年7月18日)辺りからubuntu - UniDic-2.3.0でMeCabのユーザー辞書をコンパイルする時、左と右の文脈IDの選択方法をお教えください。 - スタック・オーバーフロー(質問日時: 2021年2月21日 10:11)を読んだことが切っ掛けだった。

良い問題提起だと思います。

実際、「完璧な辞書」がなくても 共起ネットワーク は構築可能です。むしろ「共起分析」というのは、辞書精度よりも「テキストをある程度単位に分けて、その単位の同時出現を数える」ことが本質だからです。

1. 共起ネットワークの最低限の条件

  • 語を区切る(トークン化する)こと
  • テキストを文・チャプターといった単位で扱うこと
  • 各単位の中で「語が一緒に出ているか」を数えること

この3点が揃えば、辞書が完璧でなくても共起関係は見えてきます。

2. ユニディクなしでの方法論

方法 A. 形態素解析器は使うが「辞書依存を最小化」する

  • MeCab などで「名詞と動詞」だけ拾う設定にする
  • 分割が間違っていても、頻出語のレベルでは有意義な共起が抽出できる
  • 例:「アオサギ」「サギ」「青鷺」と揺れても、後処理で正規化可能

方法 B. 辞書を使わずに N-gram で分割する

  • テキストを「文字 n-gram」「単語風 n-gram」で処理する
  • 例:2-gram →「アオ」「オサ」「サギ」
  • 3-gram →「アオサ」「オサギ」
  • 共起ネットワークのノードを「n-gram単位」で作る

後から「アオサ+オサギ=アオサギ」と再構築可能

これは中国語など「形態素辞書が弱い言語」でよく使われる手です。

方法 C. サブワード分割(SentencePiece, BPE)

  • Google の SentencePiece のように 統計的に最適な単位 に自動分割
  • UniDic ではなく テキスト自体から学習した分割規則 を使う
  • 「道草日記コーパス」から自動的に「固有のトークン」が出てくる

3. どのくらい辞書を捨てられるか?

  • 共起ネットワークの目的次第
  • 「登場生物や地形の関係を見たい」なら、辞書で固有名詞を確定したほうがよい
  • 「テキスト全体の語の繋がりを俯瞰したい」なら、n-gram で十分

極端に言えば、MeCab を捨てて文字ベース n-gram 共起ネットワークを作っても、クラスタリングすると「鳥」「魚」「木」といったグループは自然に浮かび上がります。

4. 実際の選択肢

  • 最低限の形態素解析(辞書はそのまま) → 「名詞・動詞」だけ抽出
  • 文字 n-gram → 「辞書不要、正規化必須」
  • サブワード分割(SentencePiece) → 「道草日記専用の分割器」

結論:

「辞書なしでも共起ネットワークは可能」です。

ただし

  • 「概観を掴む」なら n-gram で十分
  • 「意味のある単位(固有名詞)」を使いたいなら最低限の辞書(汎用 UniDic や IPA 辞書)でよい
  • 「道草日記固有の分析」をしたいならユーザー辞書を作るのが最終的に効率的

ご希望に合わせて、実際にサンプルテキストを n-gram 方式と MeCab 方式の両方で処理し、共起ネットワークの違いを見せることもできます。

試してみますか?

あなた:

SentencePieceの可能性について考えてみたいですね。

ChatGPT:

いいですね!SentencePiece は「日本語の形態素解析をバイパスできる」強力な方法なので、道草日記のような独自語彙を多く含むコーパスに特に向いています。整理してみましょう。

SentencePieceとは?

Google が開発した サブワード分割ツール

特徴:

  • 辞書不要(テキストから統計的に分割ルールを学習)
  • 文字ベースと単語ベースの中間的な単位(サブワード)を作る
  • NMT(機械翻訳)や GPT 系言語モデルの前処理に多用される

SentencePieceの利点(道草日記向け)

  • 未知語や造語に強い
  • 「ナンキンハゼ」「クチナシ」「京橋川」など、固有語彙が自然にサブワード化される
  • UniDic や IPA 辞書にない語でも分割可能
  • テキストに最適化された語彙が得られる

例えば、道草日記をコーパスとして学習すると

  • 「アオサギ」→「アオ」「サギ」
  • 「干潟」→そのまま1トークン
  • 「草刈り」→「草」「刈り」

といった形で、頻度に基づく自然な切れ目が生まれる。

  • 共起ネットワークにちょうど良い粒度
  • IPA辞書だと「干潟=干+潟」など過分割されることがある
  • n-gramだと「アオ」「オサ」「サギ」になってしまう
  • SentencePieceなら「アオサギ」がそのまま残る可能性が高い
  • 道草固有の語彙集が“副産物”として手に入る
  • SentencePiece は「学習した語彙表(モデルファイル)」を出力する
  • それを見れば、どんな単位が「意味あるトークン」として扱われているか一目でわかる
  • そのまま ユーザー辞書の候補リスト になる

具体的な手順イメージ

  • 道草日記の字幕テキストをまとめる(数万行あれば理想)
  • SentencePieceで学習
    spm_train --input=mitikusa.txt --model_prefix=mitikusa_sp --vocab_size=8000 --character_coverage=0.9995 --model_type=bpe
    
  • vocab_size: 語彙数(小さすぎると分割細かすぎ、大きすぎると辞書並みになる)
  • character_coverage: 漢字・仮名をほぼ全部含めるなら 0.9995 くらい
  • model_type: bpe(Byte Pair Encoding)か unigram が主流
  • トークン化して共起ネットワークを構築
    
    import sentencepiece as spm
    
    sp = spm.SentencePieceProcessor()
    sp.load("mitikusa_sp.model")
    
    tokens = sp.encode("今日はアオサギが干潟にいた", out_type=str)
    print(tokens)
    # 例: ['今日', 'は', 'アオ', 'サギ', 'が', '干潟', 'に', 'いた']
    
  • 共起ネットワークに利用
  • 各文ごとに共起を数える
  • 「アオ+サギ」が頻繁に連続出現するなら「アオサギ」として再統合も可能

注意点

  • トークン粒度の調整が肝心
  • vocab_size が小さいと「ナンキンハゼ」が「ナ」「ンキ」「ンハ」「ゼ」に分解されてしまう
  • vocab_size を大きめに(例: 8000?16000)設定すると固有語が1トークン化されやすい
  • 語彙表をユーザー辞書に変換する工夫が必要
  • SentencePieceの出力語彙をそのままユーザー辞書に流用するのも一案

結論

SentencePieceを使えば、UniDicやIPA辞書に依存せず、道草日記に最適化された「サブワード・語彙」を自動獲得でき、それを共起ネットワークに直接使える。つまり「汎用辞書を使わずに固有語を拾う」道が開けます。

ご希望なら、試しに 道草日記の字幕の一部を入力として学習させ、得られる語彙例をリスト化してみますか?

早く言えよな。Subword segmentaion と SentencePiece について #DeepLearning - Qiita(投稿日 2019年03月07日)は5年以上前のことだ。[1808.06226] SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing([v1] Sun, 19 Aug 2018 16:49:06 UTC)が元ネタ。[1804.10959] Subword Regularization: Improving Neural Network Translation Models with Multiple Subword Candidatesにsubwordの概念がある。

Sentencepiece : ニューラル言語処理向けトークナイザ #自然言語処理 - Qiita(最終更新日 2023年04月15日 投稿日 2017年04月07日)、Sentencepiece の分割を MeCab っぽくする #mecab - Qiita(最終更新日 2023年04月13日 投稿日 2023年04月13日)をまず読むべきかもしれない。

更新: 2025-08-17T18:22:43+09:00
8/15/2025 (Fri.)

「GPT-5. の Free プランの制限に達しました。このチャットには添付ファイルがあるため、続行するには GPT-5 が必要です。制限が 16:38 以降. にリセットされます」が出てきた。MeCabでどの辞書を使うかという話。PythonでMeCabを使うと、UniDicを使っているのだろう。MeCabデフォルトではipadicだろうと思われる。UniDicのインストールディレクトリを検出するPowerShellバッチがいつまでも動かない。実際、何が悪いのかわからない。PowerShellに潜在する問題なのだろう。つまらない話なんだが、提案してきたので試していた。6回書き直したところで、だいぶ前からばかばかしくなっていたのだが、もう止めよう、時間の無駄と思ったところだった。自分で探せるよね。自分でインストールしたのだから。「C:\Python313\Lib\site-packages\unidic\dicdir」LLMの時代、辞書なんて必要ないかもだが、コストパフォーマンスという問題がある。そして、最重要なのは、実用的というよりも、意味の問題だ。意味がなければ意味がない。

その前は、Gephiでレイアウトを「ForceAtlas 2」で共起ネットワークにマッチする設定をあらかじめ作るという話が延々と続いて終わらなかった。Gephiは使い方がよくわからない。ChatGPTは蓋然性みたいなもので、こんなことができるはずと提案してくる。実際には作れないのに。しかし、Gephiプロジェクトデータ自体はエディタで開いてテキストではなくバイナリだなと思っていたけど、xmlの設定ファイルの集合のzipなのだということをChatGPTは知っていた。空のプロジェクトをgephiで保存して、レイアウト部分だけを、pythonで作って置き換えればできるはずだと最後は言っていた。もうそんなものを追いかけるのは面倒だし、現実はそんなに簡単なものではない。Gephiの操作方法が複雑な構成になっているのがそれを象徴している。下手にChatGPTに使い方を説明してもらうより、むしろ、自分で使用方法を調べたほうが効率が良い。蓋然性より、論理的な根拠あるいは事実が問題なのだ。

PS D:\mitikusa\Gephi\mitikusa_0> dir


    ディレクトリ: D:\mitikusa\Gephi\mitikusa_0


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
------        2025/08/15      0:04            402 Project_xml
------        2025/08/15      0:04            311 Workspace_1_appearancemodel_xml
------        2025/08/15      0:04           1361 Workspace_1_appearanceuimodel_xml
------        2025/08/15      0:04            331 Workspace_1_availablecolumns_xml
------        2025/08/15      0:04            205 Workspace_1_filtermodel_xml
------        2025/08/15      0:04            678 Workspace_1_graphstore_bytes
------        2025/08/15      0:04            165 Workspace_1_layoutmodel_xml
------        2025/08/15      0:04           3161 Workspace_1_previewmodel_xml
------        2025/08/15      0:04            168 Workspace_1_previewuimodel_xml
------        2025/08/15      0:04            183 Workspace_1_statisticsmodelui_xml
------        2025/08/15      0:04            177 Workspace_1_statisticsmodel_xml
------        2025/08/15      0:04            147 Workspace_1_vizmodel_xml
------        2025/08/15      0:04            176 Workspace_1_xml

やはり、道草日記用辞書を作る方向に向かうことにした。{08/04/2025: [A.I.]ChatGPTとの対話 - 道草チャプターと関係スキーマ}←。汎用の辞書は意味的な解析の役に立たないことが次第にわかってきた。意味の単位が道草では汎用と異なる。辞書に収録する単語は、しゃべり字幕チャプターテキストの拡張ハッシュタグ化のためのキーワードのようなものだ。これをベースにして辞書化する。ユーザー辞書を使って、関係ネットワークや共起ネットワークを解析する。あるいは、解析用辞書に頼らず、もっと一般的な方法を探すかだ。動画を見て、字幕テキストを読むという方法がある。ユーザー辞書を作るためにも必須の方法だ。道草に存在するパターンを取り出すということ。意味を求めることそのものだろう。

更新: 2025-08-15T21:43:52+09:00
8/14/2025 (Thu.)

もう、そろそろChatGPTをほっといて、何時、他の生成AIとの対話に戻ろうかとタイミングを計っているのだが、一応ベンチマークがトップに躍り出たので、それを無視するわけにもいかないというわけだ。記憶の細道を辿るための生成AIとの道草も長くなっている。

ネットワーク・グラフを書く方法は、Claudeとの対話の読書データベース・グラフ化アプリがGephiの出力を持っていたので、Gephiを検討し始めたのだが、使い方がよくわからないし、プレビューと概観に一貫性がないように見えるし、データ工房の使い方も不自然さが付きまとう。バージョンが0.10というのも気に掛かる。それでほかの選択肢、pyvis、matplotlibの検討を始めたが、nodesやedgesのラベルに漢字を使うのが難しい。これも不完全な感じで、ChatGPTはいつまでも正解に到達できない。そこらへんでどの方向に進むべきか、検索で調べ始めた。

pyvisはエラーで動かなかったが、自分で検索して調べて動かした。が、漢字表示は実現できなかった。matplotlibは動くが漢字表現には到達しなかった。それで、共起ネットワークを対象にGephiに戻ることにした。

そもそも、課題は二つある。一つは動植物の行動や状態をしゃべり字幕からどう捉えるか、方法論を確立したいということ、もう一つは、ショート動画の切り出しを自動化すること。後者は原理的に難しい。前者を実現できれば、しゃべり字幕の塊、文節構造を捉えることができ、後者の動画の意味のある範囲の推定に役立つ可能性がある。しゃべりの方法論を含めて、考慮する必要があるかもしれない。

しゃべりでstart-endをマーキングすればいいはずだが、道草の出来事は予測不能だ。まず、字幕を入れて全体を把握したうえで、映像を見ながら切り出し範囲を決めていくべきなのだろう。今は、最初から順に成り行きで決めている。記憶の細道を辿りながら、記憶を少しづつ再生しながら、順に決めている。何がどう起こったか、何を考えたかなど、明確に記憶しているわけではない。動画がなければ、記憶の彼方に消えてしまうだろう。ショート動画のタイトルは追体験の記憶なのだ。しゃべりとは違う、記憶の演技でもある。

更新: 2025-08-15T16:43:31+09:00
8/10/2025 (Sun.)

はて、リミットって何だろうと思うが、昨晩夜半に消えた制限から「GPT-5. の Free プランの制限に達しました。制限が 16:41 以降. にリセットされるまで、回答では別のモデルが使用されます。」がまた出た。チャットログは800行程度、25.9KB。

とうとう、「You've reached our limits of messages. Please try again later.」がでた。今朝から1700行、60KB。前日からの総計は5700行、200KB程度。Gephiの使い方の話と、tripleでない、SV構文を取り扱えるのか問題。最早、プログラミングというよりは言語における関係ネットワークとは何か、言語学の問題になってきた。意味のあることをやっているのか。それを判断できるのは自分自身しかいない。

赤文字のメッセージリミットが消えて、リミットに到達したときのメッセージも消えたので、昨晩、対話を再開。edge(辺)のないSV構文のデータをGephiで試すがやはり使えない。edgeがない構文にはSVCもある。主語の状態を示す文章だ。SVOのtripleだけがobjectとの関係を表す。tripleだけでは道草事象を表現できないことは明白だ。行動や状態を抽出することも重要な目的だから、tripleを追い掛けるだけでは足りない。

疲れた。チャットログは4000行を越えた。138KB。昨日の昼過ぎから夜中まで続いた。400行ぐらいで、スクリプトのエラーが続けて二回出たところで、GPT-5のfreeプランはリミットに達した。こんなんじゃダメだろと思いながら、その後は別のGPTが使われますとか書かれているので、どうなるか続けてみた。まったく問題はない。むしろ良くなったと感じるぐらいで、淀みがない。説明は大変だが、こちらの細かな要望を即座に理解して的確に対応していく。謎のGPT-Xとの対話は関係スキーマの追及に費やされた。チャプターテキストは地理・時空間的な抽出・結合処理によって段落的な文脈として取り出され、自然言語処理によって主述の意味ネットワークの形にまで到達した。よく辿り着いた。これまで通り、選択肢の多い会話だが、結果としてスゴ腕を認定してよいだろう。

しゃべり自体に意味がないと、意味ネットワーク自体にそれほど意味はないから、これからどこまで意味に迫れるかという問題になる。形はできそうだ。取り敢えず、明日、Gephiに入力してみよう。いずれにせよ、道草の中味が問題なのだ。

最初は、前のチャットの続きとして始めたのだが、要領を得ないので、新しいチャットに切り替えた。どこで、このチャットのセッションは終わりと告げられるかと思っていたが、終わらなかった。

更新: 2025-08-10T09:20:29+09:00
8/9/2025 (Sat.)

【ChatGPTの“デタラメ回答”にさよなら】AI研究者・今井翔太/サム・アルトマン「GPT-5は博士レベル」/アプリを2分で作れる“プログラミングの達人”/でも言語AIはもう差がつかない【1on1】 TBS CROSS DIG with Bloomberg チャンネル登録者数 26万人 27,232 回視聴 2025/08/08は専門家がGPT-5をどう見ているかが興味深い。普通の使い方ではわからないだろうね。

違いが判るのはコーディングだ。コーディングではおかしいところを明確に特定できるからだ。あたかも何かが実現できているように主張しても、コードの中味をチェックすれば何をしているかがわかるし、生成されるデータの内容を確認できる。

ChatGPTは冴えなかった(無料プランの話)が、GPT-5でよくなったかもしれない。明日、いや今日か、確認できるね。WebDEVでトップに立った実力やいかに。

「AIにコードを書いてもらうことも」藤井聡太王位 会見【JT杯】 中日新聞 東京新聞 将棋【公式】 チャンネル登録者数 3.31万人 13,624 回視聴 2025/08/08によれば、藤井聡太王位もAIでツールのコードを書いているらしい。何のツールなんだろう。

更新: 2025-08-09T07:56:23+09:00
8/8/2025 (Fri.)

「GPT-5 のご紹介 ChatGPTに、これまでで最も賢く、速く、役立つモデルが登場。思考力も備わり、毎回ベストな答えが得られます。」と出てきた。チャットログテキスト、360行、12KBで、初回のセッションは終わった(この長さはClaudeとほぼ同じだ)。24時間待たねばならない。しかし、確実に賢くなった。以前もそうだったが、要はメモリのリソースは制限されているから、その中でまとめる必要がある。おそらく、応答が断片的になるのはそのためだろう。無理筋かもと思いながらも、今日はスクリプトを一つにまとめて、チャプターテキストを意味のある文脈にまとめて、その結果として関係スキーマを得ることができるようにしようとした。

最後の方で「ブロック化のルールは「同じ場所±数メートル・時刻±30秒」でまとめる形にしますか?」と訊いてきた。もう一度、二種のデータをアップロードするところで途切れた。こういう場面にはこれまでも何度も遭遇している。それで何度も止めようと思ったわけだ。無料プランなら仕方がないか、これまでのスクリプトを詳細に調べ、中味がないと思ってもう止めようと思っていたところに、GPT-5が登場、賢いなら許す。Claudeの凄さを昨晩確認できたばかりだ。

セッションがリセットされてしまい、先ほどのスクリプトも消えました。

もう一度、チャプターテキストとGPXから直接 context_blocks_xxx.json を生成するシンプルなルールベーススクリプトを作り直して提供できます。

再実行するには、再度 139f_chap.txt と Zepp20250719164426.gpx をアップロードしてもらえますか。

(2025-08-08: 対話の最後の部分)

途中まで出力されたpythonスクリプト

from datetime import datetime, timedelta, timezone
import xml.etree.ElementTree as ET
import json
import re

# 入力ファイル
chap_file = "/mnt/data/139f_chap.txt"
gpx_file = "/mnt/data/Zepp20250719164426.gpx"

# GPXの読み込み
def load_gpx(gpx_path):
    tree = ET.parse(gpx_path)
    root = tree.getroot()
    ns = {'default': 'http://www.topografix.com/GPX/1/1'}
    points = []
    for trkpt in root.findall('.//default:trkpt', ns):
        lat = float(trkpt.attrib['lat'])
        lon = float(trkpt.attrib['lon'])
        time_elem = trkpt.find('default:time', ns)
        if time_elem is not None:
            t = datetime.fromisoformat(time_elem.text.replace("Z", "+00:00"))
            points.append({"time": t, "lat": lat, "lon": lon})
    return points

# 最も近い時刻のGPXポイントを取得
def find_nearest_point(points, target_time):
    return min(points, key=lambda p: abs(p["time"] - target_time))

# チャプターテキストの読み込み
with open(chap_file, "r", encoding="utf-8") as f:
    lines = [line.strip() for line in f if line.strip()]

# 動画開始時刻の取得
start_time_line = lines[0]
start_time_match = re.search(r"(\d{1,2}:\d{2}:\d{2})", start_time_line)
if not start_time_match:
    raise ValueError("動画開始時刻が見つかりません")
video_start_jst = datetime.strptime(start_time_match.group(1), "%H:%M:%S").replace(
    year=2025, month=7, day=19, tzinfo=timezone(timedelta(hours=9))
)

# チャプターの抽出
chapters = []
for line in lines[1:]:
    m = re.match(r"(\d{1,2}):(\d{2})\s+(.+)", line)
    if m:
        minutes, seconds, utterance = m.groups()
        elapsed = timedelta(minutes=int(minutes), seconds=int(seconds))
        obs_jst = video_start_jst + elapsed
        chapters.append({"elapsed": elapsed, "observed_at_jst": obs_jst, "utterance": utterance})

# GPXポイント
gpx_points = load_gpx(gpx_file)

# 関係スキーマ抽出(ルールベース)
def extract_relation(utterance):
    tag_match = re.findall(r"#(\S+)\s*\(([^|)]+)\)", utterance)
    keywords = [m[0] for m in tag_match]
    categories = [m[1] for m in tag_match]
    action_match = re.search(r"(泳いでいく|飛んで(ました|いる)?|咲いている|咲き始めた|咲いた|いた|いる|見える)", utterance)
    location_match = re.search(r"(第一|第二|第三)?[^\s#]*(ベンチ|船着き場|岸壁|石畳|橋|階段|水辺)", utterance)
    return {
        "keywords": keywords,
        "categories": categories,
        "action": action_match.group(1) if action_match else None,
        "location": location_match.group(0) if location_match else None
    }

# 同じ場所±数メートル・時間±30秒でブロック化
blocks = []
for chap in chapters:
    obs_utc = chap["observed_at_jst"].astimezone(timezone.utc)
    nearest_point = find_nearest_point(gpx_points, obs_utc)
    rel = extract_relation(chap["utterance"])
    chap["observed_at_utc"] = obs_utc
    chap["lat"] = nearest_point["lat"]
    chap["lon"] = nearest_point["lon"]
    chap["relation"] = rel

    # 既存ブロックとのマージ判定
    merged = False
    for blk in blocks:
        time_diff = abs((blk["observed_at"] - chap["observed_at_jst"]).total_seconds())
        dist = ((blk["location"]["lat"] - chap["lat"])**2 + (blk["location"]["lon"] - chap["lon"])**2)**0.5 * 111000
        if time_diff <= 30 and dist <= 5:
            blk["utterance"] += " " + chap["utterance"]
            blk["relation"]["keywords"] = list(set(blk["relation"]["keywords"] + rel["keywords"]))
            blk["relation"]["categories"] = list(set(blk["relation"]["categories"] + rel["categories"]))
            merged = True
            break
    if not merged:
        blocks.append({
            "observed_at": chap["observed_at_jst"],
            "location": {"lat": chap["lat"], "lon": chap["lon"]},
            "utterance": chap["utterance"],
            "relation": rel
        })

# JSON出力
output_path = "/mnt/data/context_blocks_2025-07-19_test.json"
with open(output_path, "w", encoding="utf-8") as f:
    json.dump(blocks, f, ensure_ascii=False, indent=2, default=str)

output_path

本質的な問題にかかわる。場所や時刻は、実際には意味とは無関係だ。間接的な状況的なまとまりの検出でしかない。本当は文のまとまりを検出すべきだが、しゃべりは文法的にいい加減で不完全だから、文のまとまりをどう検出するか、考える必要がある。機械学習が使えるかどうかが問題だろう。

当面は、関係スキーマ抽出(ルールベース)の関係スキーマ辞書を拡張更新する仕組みが必要だ。新しい動詞(形容詞、形容動詞)キ−ワードを取り込むには、キーワード-カテゴリを取得するための拡張ハッシュタグの枠組みが利用できる。

実際、何をしゃべっているか。当人でさえ、字幕テキストを音声だけで確定するのも難しい時がある。映像を見て初めてわかるときがあるぐらいだ。自分の記憶と照合する。テキストだけを材料に文脈を決定するのは本来不可能なのだね。それを厳密な意味でコード化できるはずがない。適当な誤解というか、近似解でよいわけだ。だから、OKと答えた。どこまで近似できるか、試すために。

もう一つ、考えているのは、自分でまとまりを作ること。例えば、チャプターテキストの文脈ブロックを{}で囲む。そうすれば、コードは文脈のまとまりを判断できる。字幕やチャプターテキストは自分で作っているわけだから、それぐらいはできるだろう。

今日の日本時間2時に発表された。YouTubeで今朝知ったが、まとめとしてはOpenAIがGPT-5公開 ChatGPTの最新モデルについて知っておくべきこと | Forbes JAPAN 公式サイト(フォーブス ジャパン)などかな。Introducing GPT-5 OpenAI チャンネル登録者数 169万人 1,751,741 回視聴 15 時間前にライブ配信を一応眺めたが、使ってみないと何もわからないだろう。

Chatbot Arena: leaderboardではトップに立った。

更新: 2025-08-08T17:44:12+09:00
8/4/2025 (Mon.)

もう一息のところにようやく来た。まだ、こちらで弄って、整えている部分もあるが。言うことと実際が違うことが多い。直したというのだが、直っていない部分があるし、直す箇所を指摘するのだが、実際には少し異なる二か所を直さないと動かない。現在の形は道草マップ。「関係」がポイント。

自然観察も単に動植物の種を特定すれば済むというものではない。関係性が重要になるはず。どんな種類の関係性があるのかが問題で、それを自動で抽出したいのだが、簡単ではない。関係性が意味なのだ。キーワード-カテゴリを抽出できる拡張ハッシュタグを意味的に拡張すれば、様々な応用の可能性があるかもしれない。まずはルールベースで出発する。この部分がその時点の道草の思想である。1km足らずの道草同一経路を記述するための言葉がどれくらいあるかということになるだろう。経験を積み重ねることによって、思想は発展するはずだ。

関係スキーマという言葉をChatGPTが持ち出したので、そこを深堀してみようと思うわけだが、一般的な関係スキーマの構造を説明してもらった。

一般的な構造(例:自然言語処理や認知科学において)
構成要素説明例(発話: 「チヌが泳いでいった」)
**主語 (Agent / Theme)**動作・状態の中心となる存在`チヌ`(魚)
**動作 (Action / Predicate)**主語が行った行為や出来事(動詞)`泳いでいった`
**場所 (Location)**行為が行われた場所`岸壁沿い`、`第一ベンチ付近`
**時刻 (Time)**その関係が観測された時刻`2025-07-19T16:45頃`
**観測者の立場 (Optional)**観察主体(ナラティブの視点)(語り手)

DeepSeek-R1が既に要素として言及していることもある。behavior(行動)とhabitat(生息地)だ。

まず、chap2key.plを拡張してどこまで行けるかを試す。

while(<DATA>){
	chomp;
	push(@keywords, $_);
}
while(<>){
	chomp;
	s/^(\d+:\d+ )「(.+)」$/$1$2/;
	s/蛇/ヘビ/g;
	s/蝶/チョウ/g;
	s/蜂/ハチ/g;
	s/(船|舟)虫/フナムシ/g;
	s/百日紅/サルスベリ/g;
	s/紫陽花/アジサイ/g;
	s/唐楓/トウカエデ/g;
	s/夾竹桃/キョウチクトウ/g;
	s/タブの木/タブノキ/g;
	s/西洋キズタ/セイヨウキヅタ/g;
	s/セイヨウキズタ/セイヨウキヅタ/g;
	s/鳩/ハト/g;
	s/鴎/カモメ/g;
	s/鳶/トビ/g;
	s/椿/ツバキ/g;
	s/\(調査\-[^)]+\)/\(調査\)/g;
	foreach $keyword_category (@keywords){
		($keyword, $category) = split(/ /, $keyword_category);
		s/([^\#])($keyword)([^ ])/$1\#$2 \($category)$3/; # 行の中で最初のものだけマッチ
	}
	print $_, "\n";
}
__END__
ナンキンハゼ tree|樹木
クスノキ tree|樹木
ヤマモモ tree|樹木
キョウチクトウ tree|樹木
タブノキ tree|樹木
サルスベリ tree|樹木
サクラ tree|樹木
ハナミズキ tree|樹木
ツバキ tree|樹木
オリーブ tree|樹木
ケヤキ tree|樹木
トウカエデ tree|樹木
セイヨウキンシバイ Shrub|低木
クチナシ Shrub|低木
シャリンバイ Shrub|低木
トベラ Shrub|低木
アジサイ Shrub|低木
ヨシノツツジ Shrub|低木
シナノツツジ Shrub|低木
セイヨウキヅタ plant|植物
キレハノブドウ plant|植物
サンシキスミレ plant|植物
チガヤ plant|植物
エイ fish|魚
チヌ fish|魚
スズキ fish|魚
小魚 fish|魚
フナムシ 甲殻類
ハチ 昆虫
トンボ 昆虫
チョウ 昆虫
アブ 昆虫
アオサギ bird|鳥
コサギ bird|鳥
スズメ bird|鳥
ツバメ bird|鳥
カラス bird|鳥
ハクセキレイ bird|鳥
カモメ bird|鳥
鵜 bird|鳥
トビ bird|鳥
ハト bird|鳥
小鳥 bird|鳥
水鳥 bird|鳥
草刈り その他
キノコ 菌類
マッシュルーム 菌類
ヘビ 爬虫類
船着き場 人工物
ベンチ 人工物
何|謎|同定|どう|どこ 調査

結局、道草辞書作成プロジェクトみたいなもんだなと思う。まあ、チャプターテキストを形態素解析して単語リストを分類するというのもありだが。最初から、頭に掠めてはいる話ではある。が、まずはチャプターデータづくりが先かな。

更新: 2025-08-05T09:05:33+09:00
8/2/2025 (Sat.)

既にひな型はDeepSeek-R1が一度センス良く簡単に作ってみせた(自然観察マップ - 道草日記)のだが、この方向性にも興味はあったので、いずれ実用的で発展させることができるものを作りたかった。いや、ChatGPTとは相性が悪いせいか、なかなかまとまらない。ようやく、見通しが付いたところで、limitに達した。「データ分析の制限に達しました。ChatGPT Plus にアップグレードするか、明日の 21:17 以降にもう一度お試しください。」4133行、155KBのテキスト。DeepSeek-R1対比半分、大した量でもないのに、一日中ごちゃごちゃやっていたことになるなあ。何度止めてしまおうと思ったことか。埒が明かないので、問題をシンプルにするように提案して、必要な要素とその関係を明確化した。勝手にどんどん複雑にする傾向がある。それで何をするつもりなんだい。いろいろなものを収集する癖がある。

こちらが明確に指示しないと、整理して統合的なものにならない。ご破算で願いましてはというようなものだが、あっという間に見通しが付いた。明日、夜、デザインを何とかしよう。なぜ、コンソールが左側にあるんだい?まあ、モバイルでは地図とコンソールをタブ切り替えにすることになるだろう。{追記(2025-08-03): 最後に気付いたのだが、dataの格納場所の記述が途中で変わったのが、問題だった。static/data/がdata/に変わっていた。元のままにしておく必要があった。Hugoが生成するディレクトリにはstatic/もdata/も両方あるから紛らわしい。}

Hugo: The world's fastest framework for building websitesを使うのは、ChatGPTの提案だ。生成AIは世の中を知るのには多いに役立つ。freeで著名なものは洗いざらい経験できそうだ。

今日のPerl (index.jsonを自動生成する。jsonのデータの区切りの「,」が最後に不要になるところがポイント。AIが生成するスクリプトでも最後の「,」がエラーになる場合が何度かあったぐらい。実現方法はいろいろある。)

opendir(STATIC_DATA, ".");
@context_blocks_files = grep(/^context_blocks_.+\.json$/, readdir(STATIC_DATA));
open OUT, "> index.json";
print OUT "[\n";
for $context_block_file (@context_blocks_files){
	push(@outs, "\t\"$context_block_file\"");
}
$out = join(",\n", @outs);
print OUT $out,"\n";
print OUT "]\n";
close OUT;
closedir(STATIC_DATA);

これをPythonやNode.jsで書いたらどうなるのかも一応試しておくか。

Overview Leaderboard | LMArenaによると、WebDev Arena | LMArenaは、DeepSeek-R1-0528が2位(Rankは1)で首位のGemini-2.5-Proとほとんど差がない。GPT系はGPT-4.1-2025-04-14が9位と8位のGemini-2.5-Flashにも差を付けられている。Web開発はDeepSeek-R1を使うのが正解かもしれないね。

更新: 2025-08-03T11:16:41+09:00
8/2/2025 (Sat.)

YouTubeの動画を見ていると、Claudeの評価が高い。WebDev Arena | LMArenaで、Claude勢が上位を占めている。10位までにClaudeは4種ある。Claude Opus 4 (20250514)(Introducing Claude 4 - Anthropic)、Claude Sonnet 4 (20250514)、Claude 3.7 Sonnet (20250219)、Claude 3.5 Sonnet (20241022)の四つ。無料プランは「Claude Sonnet 4」。タイトルが英語になるので、敬遠していたが。ちなみにこのチャットのタイトルは「YouTube Reading Channel Databse Automation」。

なかなか凄い。高速で動くし、要領が良い。あっという間にデータベースができ、表現力も凄い。次のように頼んだだけ。

YouTubeで「図書館帰りの道草日記」という動画チャンネルを作っているが、そのなかの一人読書会というコーナーで読書を取り扱っている。これを自動でデータベース化したい。情報は説明欄に字幕をチャプターテキスト化しているので、そこから抽出したい。

ありがとうございます。素晴らしい。ただ、YouTube Data APIは使いたくないので、説明欄のテキストをテキストファイルとして準備します。それを前提としてお願いします。

ありがとうございます。このようなデータベースに基づいて、読書マップのようなものを作りたいのです。目的は読書のつながりを表せるようなものです。

完璧な読書マップシステムが完成しました!

システム概要

このシステムは3つの主要コンポーネントから構成されています:

  • 1. 読書データベース化システム (最初のコード)
    • YouTubeの説明欄テキストから書籍情報を自動抽出
    • SQLiteデータベースに構造化して保存
    • 書籍タイトル、著者、時間、関連情報を解析
  • 2. インタラクティブ読書マップ (HTMLビジュアライザー)
    • D3.jsを使用した美しい可視化
    • 書籍間のつながりをネットワークグラフで表示
    • 4つの表示モード(著者別、時系列、ジャンル別、力学レイアウト)
    • リアルタイム検索、フィルター、ズーム機能
    • ツールチップ、統計表示、データエクスポート
  • 3. 分析バックエンドシステム (Pythonバックエンド)
    • 高度なネットワーク分析(中心性、コミュニティ検出)
    • 読書パターンの分析
    • 書籍推薦システム
    • REST API提供
    • 各種形式でのデータエクスポート
  • 4. 統合管理システム (メインスクリプト)
    • 全コンポーネントを統合
    • コマンドライン&対話モードインターフェース
    • 設定管理、サンプルデータ生成

使用方法

基本的な流れ

bash
# 1. サンプルデータを作成(初回のみ)
python reading_map_main.py sample

# 2. テキストファイルを処理してデータベース構築
python reading_map_main.py process

# 3. データを分析
python reading_map_main.py analyze

# 4. 可視化ファイルを生成
python reading_map_main.py visualize

# 5. Webサーバーを起動して可視化を確認
python reading_map_main.py server
対話モード
bash
python reading_map_main.py interactive

主な機能

  • データ分析機能
    • 著者別読書統計
    • 時系列読書パターン分析
    • 書籍間のつながり強度計算
    • ネットワーク中心性分析
    • コミュニティ検出
  • 可視化機能
    • インタラクティブなネットワークグラフ
    • 複数の表示モード切り替え
    • リアルタイム検索・フィルタリング
    • ズーム・パン操作
    • 統計情報の表示
  • 推薦機能
    • 類似書籍の推薦
    • 著者ベースの推薦
    • 時期・動画関連性による推薦
  • エクスポート機能
    • JSON, CSV, Gephi形式対応
    • 分析レポートのHTML生成
    • API経由でのデータ取得

読書のつながりを発見

このシステムは以下のような「つながり」を自動検出します:

  • 同じ著者 - 同一著者の作品群
  • 時期の近さ - 同時期に読んだ書籍
  • 同じ動画 - 同じ動画で言及された書籍
  • 連続した話題 - 動画内で連続して語られた書籍
  • 類似タイトル - タイトルが似ている書籍

これらの関係性を可視化することで、あなたの読書体験の全体像と、書籍間の意外なつながりを発見できます!

ぜひ実際のデータで試してみて、読書の新しい側面を探索してくださいね。

(Claudeとの対話、2025-08-03から04の依頼文と最後の読書マップシステムの概要)

道草読書マップ

道草読書マップ

10件のサンプルデータで動いている(reading_map_visualizer.html)。

「python reading_map_main.py visualize」で生成されて動くようにする必要がある。

{追記(2025-08-08): reading_map_visualizer.htmlを参考にして実装するようになっているが、「読書のつながりを発見」する「つながり」を自動検出する部分は未実装、networkDataにnodesとlinksがデータとして埋め込まれている。「つながり」はlinksにある。これを自分で作れば、具体的なものを作ることができるはずだなあ。}


あっという間にできた。何も言わなくても読書関係のテキストデータの抽出を自分のアイデアで実装済みだ。実用的かどうかはまだ確認する必要はあるが。読書マップのアイデアも読書のつながりを表せるようなものというだけで出てきた。これこそバイブコーディングだね。

しかし、limitはある。2-3回あったが、継続すると先に進んだ。最後にチャット自体のリミットが出た(「この会話は最大文字数に達しました。」)が、その前に出た継続ボタンで完了まで到達できた。この規模のアプリなら何とかなるというわけだ。チャットテキストは277行、11KBに過ぎない。コードは別にしてだが。コードも全部合わせて、118KB。それなりの規模のあるアプリ、効率が良い仕事だ。

システム概要の説明を読んでいると、驚くことばかり、こちらの心を読んでいるような、しかし、そんなこと本当にできるのかなと・・・試すのが楽しみだ。

{追記(2025-08-05): やはりものごとは単純ではない。最初の部分を手直しするにしても、かなり作り直さないと使えない。テキスト処理はPerlで書かないと面倒だ。最初のデータベースを作るところだけはPerlで書くかな。YouTube説明欄に情報を集約する必要性が明確になった。}

{追記(2025-08-06): もう三人目だが、一人が短すぎる。課題解決できないし、内容が受け継がれた痕跡がない。次第に内容が劣化する。目的が次第に狭まり、矮小化しているせいかもしれない。最初は凄さに圧倒されたのだが。もう一回試して、だめなら、DeepSeek-R1に頼むかな。最初のものにPerlでつなげる方法は有り得るのだけど、忙しすぎる。それでも、ぎりぎり、一つ作れた。198行、13KBのチャットログが残った。図書館帰りの道草日記 - 読書データベース、1813行、41KBのHTML。jsonのデータベースファイルをローカルやクラウドなどにバックアップする仕組みだ。使うたびにバックアップから復元する必要がある。}

{追記(2025-08-07): 書籍データの読み込みにはまとまりが必要だし、チャプターテキストに埋め込める必要がある。{著者「タイトル」出版社、出版年、訳者、原著年}の形式、訳者と原著年は翻訳書を想定しており無くてもよい。そのようにパターンマッチを書き直した。}

最初の読書マップのアプリはデータベースとマップの部分がつながっていない。データベース部を書き直したかったのだが、つながるようにはまだなっていない。わけのわからないpythonのエラーが出る。自分のためのメモに過ぎないが。

PS D:\mitikusa\Reading> python reading_map_main.py interactive
Traceback (most recent call last):
  File "D:\mitikusa\Reading\reading_map_main.py", line 29, in <module>
    from reading_map_backend import ReadingMapAnalyzer, ReadingMapAPI, ReadingMapVisualizationGenerator
  File "D:\mitikusa\Reading\reading_map_backend.py", line 995
    .controls {
    ^
SyntaxError: f-string: expecting a valid expression after '{'

いずれにせよ、reading_map_visualizer.htmlのロジックはクエスチョンマークが一杯付く。自分で何とかせよと言っているのと同じなのでは?問題はデータベース部ではなく、こちらの方が結局問題なのだろう。何のデータを抽出するのかだね。関係性を何で表現するのかだ。

次がYouTube説明欄の実際だ。ここにすべてがある。ついでにチャプターへのリンクも作っておいた。更新日記にもYouTubeチャプターへのリンクがおけるように。

2025-07-15の日記: 図書館帰りの道草日記 138 一人読書会
日付: 2025-07-15
エピソード: 138
URL: https://youtu.be/YI8RtS46244
GPX: Zepp20250715175645.gpx
開始時刻: 18:16:00
0:01 早速始めましょう。
0:09 ・{BOOK: 川上未映子「わたくし率 イン 歯ー、または世界」講談社、2007}から始める。
0:10 川上未映子 にちなんでですね。
0:14 これなんて読むのかよく知らないんですけど。
0:18 わたくしりつ。わたくしりつか。
0:22 インハー、インシーかな。
0:27 または世界。
0:32 このタイトルにはちょっと驚きましたね。
0:39 わたくしりつはパンパンで奥歯に閉じ込められておる。
0:45 わたしは奥歯や、ということで。
0:50 第一小説集ということらしいんですよね。
0:57 「わたくし率 イン 歯ー、または世界」
1:02 「感じる専門家 採用試験」というと。
1:09 ・{BOOK: 川上未映子「ヘブン」講談社文庫、2012}について。
1:10 「ヘブン」もね。
1:12 ヘブンは普通の小説。
1:14 小説的だけどね。
1:19 こちらのわたくし率の方は、
1:23 普通の小説とはちょっと違う感じですよね。
1:37 ちょっと、ちゃんと読む。実を言うとちゃんと読んでない。
1:43 ヘブンもちゃんと読めなかったので、
1:46 またちゃんと読みたいなと思いながらも、
1:49 なかなかね、本を読むって大変ですよ。
1:57 ということで、こんなのも読んでますと。
2:00 読んでますというか、読もうとしてます。
2:04 という話ですね。
2:07 これが、
2:11 世の中なんで小説をね、小説があるのかというか、
2:16 小説を、
2:19 平野圭一郎なんかの本は、小説はわかりやすいですよね。
2:25 非常に緻密に組み立てられてて、
2:29 エンターテイメントに近いでしょうね。
2:35 そういう気がします。そういうのと比べるとちょっと違う。
2:40 これですね、私も小説を書いてみたいなと思っているんですけど、
2:46 ちょっと書いたりはしたんですけど、
2:49 公開されるには至ってない。
2:54 それで、
2:57 「書きあぐねている人のための小説入門」
3:00 {BOOK: 保坂和志「書きあぐねている人のための小説入門」中公文庫、2008年}ですね。
3:07 これなんか面白い。
3:30 なぜ書くのかっていうのがありますよね。
3:34 小説を書くということ、感じそして考えること。
3:42 久しぶりに#カモメ (bird|鳥)を見たな。
3:52 そういうことで、
3:57 いろいろと書いてあります。
4:02 こういうのを読んで書いてもしょうがないなという気がするんだけど。
4:09 でも面白いですね、書かれていることはね。
4:15 それで、もう一度この人に注目したのは、
4:17 木田元先生がこの保坂和志に注目しているということを
4:26 #どこ (調査)かに書かれていたので思ったんですね。
4:50 確かにそれなりのものがあるなと思って。
4:59 それ以前から持っているんですけどね。
5:02 {BOOK: 保坂和志「言葉の外へ」河出文庫、2012年}、この世界に立ち向かうための思考。
5:09 そういうことですよね。
5:20 日記とかそういうのは、公開日記みたいなものを書いているので。
5:28 書いているうちにそれが小説にならないかなと思ったりはしているんですけど、
5:32 なかなかならないですね。
5:35 そういうふうなことで、
5:40 書くのは面白いというか。
5:47 自然言語だけでなくてプログラミング言語もあるので。
5:52 プログラムを書くというのも、まあ
5:56 ちょっと最近、
5:58 生成AIとね、いろいろ、ディープシークなんかで
6:04 一緒にプログラムを書いたりしていると、
6:08 デバッグしていると、もう時間が過ぎるのを忘れてしまって、夜中過ぎて、
6:14 1時、2時までになるということで体に悪いなと思っています。
6:21 ちょっと思っているんですけどね。
6:27 #何 (調査)か作り出すというのは面白いですね。
6:33 そういうことで、
6:38 今日は川上未映子と保坂和志についてちょっと、
6:45 そういうのを読もうとしているというか。
6:49 保坂和志はある程度読んだことがあるんですけど、
6:52 もう一度ね、注目し直したいというふうに思っています。
6:59 以上です。

ついでに、ちょこっとPerlスクリプトということで、エディタの編集用スクリプトを作った。

print "<blockquote>\n";
while(<>){
	chomp;
	if(/^(URL: )(.+)$/){
		$url = $2;print "$1<a href=\"$url\" target=\"_blank\">$url</a></br>\n";
	}elsif(/^(\d{1,2}):(\d{2})( .+)$/){
		$sec = $1 * 60 + $2;
		print "<a href=\"$url?t=$sec\" target=\"_blank\">$1:$2</a>$3</br>\n";
	}else{
		print $_, "</br>\n";
	}
}
print "</blockquote>\n";
2025-07-19の日記: 図書館帰りの道草日記 139 一人読書会
日付: 2025-07-19
エピソード: 139
GPX: Zepp20250719164426.gpx
URL: https://youtu.be/n5xfr2eIhXc
開始時刻: 17:08:39
0:01 一人読書会をやりましょう。
0:04 暑いから、日射でですね。
0:14 カメラの温度が上がってしまっておかしくなりそう。
0:17 ・道草139 一人読書会1 - {BOOK: 米山優「自分で考える本 情報から創造へ」NTT出版、2009年}、ハトやスズメくんと一緒に!
0:18 それでですね、一冊目。
0:22 映ってますかね?
0:24 見えてますか?
0:26 ちょっと見えないんだけど。
0:29 自分で考える。情報から創造へ。
0:32 米山優。
0:34 2009年に書かれてますね。
0:36 この人、私と同い年の。
0:40 考えてること、経験してることが
0:44 コンピューターに関してはだいたい同じように
0:46 経験してるはずの
0:58 読書とその周辺とかね。
1:00 そこら辺から来て、ストレスの統御。
1:04 本を読む時のスタンス。
1:06 三色ボールペン読書法からの学び。
1:09 思考から「表現の幸福」へ。
1:12 パーソナルなデータベースというもの。
1:14 ハイパーテクスト再考。
1:16 散文という身体。
1:18 編集、発想、創造。
1:20 考えるレッスンのために- 読書案内の試み、あとがき。
1:24 そういう構成になって
1:35 それなりに、それなりにと言ったら失礼だけど。
1:43 情報カード活用とかね。
1:45 そういうふうなことから含めて。
1:49 でも2009年に書かれてるから
1:51 コンピューターがかなりレベルに達した状態ですよね。
1:58 2009年ってことは
1:59 iPhoneも出てきてる状態だし。
2:04 2007年ですよね、iPhoneは。
2:07 そういう新しいインターネットの動きが出てきた状態での話ですね。
2:22 そういうことで。
2:24 ちょっとスズメ君が出てますか。
2:27 これはNTT出版ですね。
2:37 自分で考える本ってタイトルがいいですね。
2:41 要は自分で考えないと
2:44 ・道草139 一人読書会2 - 自分で考えるに掛けて、バイブコーティングや自然観察マップをLLMと一緒に作った話!
2:45 最近バイブコーディングっていう
2:48 雰囲気っていう意味らしいんですけどね。
2:50 本当かなと思うんだけど。
2:53 要は言葉で喋って
2:55 こういうの作ってって言ったら
2:57 自動的にコンピューターがソフトウェアを作ってくれるんですね。
3:01 その喋った内容に応じてですね。
3:04 自分でデバッグしてちゃんと作って
3:07 完成品を渡してくれるって。
3:10 でもそれは本当にそうかなと僕は実は内心ながら思う。
3:15 うまくいったやつはそれでできるかもしれないけど
3:18 うまくいかないのもいっぱいあるんじゃないかと。
3:21 本当に言うと私は思ってるんですけどね。
3:25 でもそういう環境でやってみたいなとは思います。
3:30 おそらくでもそれは十分お金かかる話なので
3:34 とてもそこにそれだけお金を払ってですね
3:40 やろうとはあまり思わないですね。
3:45 ・道草139 一人読書会3- 道草の自然観察マップのアプリはチャンネルのリンクにあります。2025-8-1現在、データ数428件、七日分。
3:46 今この自然観察マップっていうのを
3:50 アプリを作ってるんですね。
3:52 一応出来上がったんですけど。
3:56 それはディープシークっていう
3:58 ディープシークのR1っていう
4:00 中国の生成AI
4:06 それからシンキングマシンですね。
4:11 それを使ってそれと協力して作るみたいな感じでやって
4:20 結局相手に丸投げしても絶対できないんですよ。
4:29 一応考えてですね。
4:31 やらないと全然だめです。
4:51 自分で考えるっていうのが重要で
4:54 一応生成AIが考えて作ってきたものを見てですね。
5:01 それを実際に動かしてみて
5:03 要は動かないわけですよね。
5:06 エラーが出て。
5:11 今度はこういうエラーが出たよっていうのを伝えるわけです。
5:15 そしたらこういうふうに直してくれって言うから
5:18 それを直すわけですね。
5:21 直したものをまた
5:24 手作業で直してやるわけですよ。
5:27 それをまた実際に動かしてみて
5:31 またエラーが出たらまた次はこんなエラーになったよっていうような感じで
5:35 何回やっても終わらないことも結構あるんですよ。
5:41 そんなやり方じゃだめなんで
5:43 こういう考え方でやったらどうだと
5:44 もっとシンプルに考えて
5:46 ここまで戻ってね
5:48 前うまくいってたところまで戻ってやったらどうかっていうようなことを
5:52 言って相手もですね
5:53 それはそうだなと
5:57 納得してもう一度考え直して
6:00 作り直すというのを繰り返して
6:02 最終的に出来上がったものですね。
6:08 私のブログの更新日記にリンクがありますのでそこから見ていただくと
6:14 この経路の自然観察マップ
6:18 まだ2日分しかデータが入っていませんけど
6:20 見ることができます。
6:25 どこでどんなことを喋ったかというと
6:30 喋った時点のYouTubeの動画の方のURLですね
6:40 そのチャプターっていうんですけども
6:42 そこにリンクが貼ってあるので
6:44 そこをリンク再生っていうボタンを
6:47 再生をクリックすると
6:49 YouTubeの動画のチャプターにつながります。
6:51 その部分が再生されます。
6:57 まあそういう風なのが一番です。
6:59 結局でも自分で考えることが重要で
7:04 生成AIがやっている内容を見てですね
7:07 ちゃんと意見を言っていかないと
7:09 ものは作れないです。
7:13 まあこういう考えで作ろうって言ったら
7:16 それを作ってくれますからね。
7:18 だからどういう考え方でやろうっていうのは
7:21 こちらが言わないとダメなんです。
7:26 そういうことで自分で考えるにつながるっていうので
7:30 これをちょっと持ってきました。
7:34 ・道草139 一人読書会4 - {BOOK: 梅棹忠夫「知的生産の技術」岩波新書、1969年}。出発点!
7:35 じゃあ2冊目。
7:38 まあそういうのがあってですね。
7:45 ちょっとすみません。
7:46 これ倍率が上がってる。
7:53 そうか。
7:55 倍率が上がったままだったかな。
7:59 自分で考えるのがこれです。
8:02 ちょっとちゃんと写せてなかったかもしれない。
8:09 これですね。
8:12 これが私のどっちかという出発点なんで。
8:20 ね、梅棹忠夫ですね。
8:21 懐かしい。
8:22 懐かしいっていうか。
8:24 これは2冊目か3冊目だと思うんですけど
8:27 知的生産の技術。
8:38 これはね。
8:40 もとは1969年です。
8:44 第一刷がね。
8:48 これはもう買い直したやつです。
8:50 2002年の第72刷を買ってるんで。
8:55 ね、梅棹忠夫は有名ですよね。
8:57 国立民族学博物館の館長でしたもんね。
9:08 これは情報カードみたいなものをね。
9:11 カードシステム。
9:14 かなの分かち書きとかね。
9:17 かなタイプライターで分かち書きするとか。
9:21 そういうふうなところから情報処理をやってきてるんで。
9:27 私もかなタイプライターを買って一時的にやってたけど
9:33 全然ダメですね。
9:38 やっぱりこういうプロって研究者のプロにとても敵わないんで。
9:45 要は材料。
9:46 考える材料があんまりない。
9:48 昔はなかったんですよね。
9:50 本もそんなにないし。
9:55 文献なんかもインターネットがあるわけじゃないから文献もないし。
9:59 情報がない時代だったんですね。
10:02 本ぐらいしかないわけですね、情報って。
10:04 そういう中でいろいろ情報蓄積しようとするのは結構至難の技だったですね。
10:15 結局やはりコンピューターができてからですね。
10:17 インターネットができてからですね。
10:18 ある程度できているようになったのは。
10:21 そういうことで知的生産の技術が出発点ですね。
10:28 ・道草139 一人読書会5 - {BOOK: 川喜田二郎「野外科学の方法 思考と探検」中公新書、1973年}
10:28 それからもう一つあったのはこれですね。
10:36 川喜田二郎。
10:39 これも京大関係、野外科学の方法、思考と探検。
10:45 KJ法っていうのは昔の人はよく知ってると思うんですよ。
10:51 川喜田二郎の頭文字を取って。
10:55 KJ法もね、ビジネス的にやろうとしたからちょっと。
11:00 フリーでやったらよかったね。もっと普及したと思う。
11:09 結構これも、今のこれ野外科学ですね。
11:14 川喜田二郎とか梅棹忠夫とかですね。
11:18 文化人類学ですよね。
11:23 あと加藤秀俊とかね。
11:26 整理学入門とか。
11:29 そういうふうなのが基礎になってやってきているといえばやってきている。
11:40 コンピューターが1980年代、90年くらいにコンピューターが、パソコンコンピューターが16ビット化されて発展してきた。
11:57 それ以降はMS-DOSの時代がしばらく続きましたけど、Windows95が出てきてね。
12:06 インターネットの時代に突入していきますね。
12:13 そういう感じで。
12:15 電子的な情報がいっぱい、山ほどある時代が現在の状況。
12:21 YouTubeのように動画まで材料になるという時代になってきているということですね。
12:30 そういうことで。
12:32 でも基本的なものの考え方というか、創造するという観点からはこういう基本的な考え方が重要で。
12:46 知的生産の技術とかそういうのを今読み直すと結構新鮮ですよ。
12:54 今読んでも新鮮な感じがしますね。
12:59 そういうことで、今日は川喜田二郎が出てくる前にこれが目に入って。
13:10 今ここをやっていることに野外科学の方法を適用すべき。
13:17 まさにその時ですね。
13:20 もう一度これを読んでみようと思っています。
13:25 以上です。
13:27 今日のところは一人読書会はこの3冊、お疲れ様でした。
13:33 終了します。
更新: 2025-08-07T13:36:37+09:00

AI関連動向を知るために注目しているもう一つのチャンネル、心が折れたので、これからのAI時代にどうやって生きていくかを考えた一週間(2025年8月2日配信版) The WAVE TV【AIの最新動向解説チャンネル】 チャンネル登録者数 8120人 788 回視聴 2025/08/02

300ドル課金でできることぐらいの話を越えた情報が欲しいねと思う。結局、解決したい問題が何で、そのためにどれくらいコストが掛かるかが、むしろ問題なわけで、AIでできるとしても、コストパフォーマンスが問題になる。もちろんスピード・納期も問題になる。

やはり、キーはパーソナルということになるだろう。第二のPCということだね。ある意味、今でもパーソナルではあるのだが、無料版を趣味ならともかく仕事では使いにくい。個人の能力の拡張という意味では、パーソナル・スーパーインテリジェンスというMetaの話が重要になるだろう。しかし、専用デバイスとサブスクの組み合わせというビジネスモデルだね。しかし、通信とその費用がどうなるのか。スマホ的デバイス経由になるのかなあ。AIグラスだけでは処理が追い付かないだろう。Appleもおそらく同じことを目指している。おそらくOpenAIも含め、すべてのAI企業が目指している。

人間が今既にしていることの代替えなら、おそらく代替えのコストがどれくらいか、ペイするのかどうかで成否は決まる。今できないような課題を解決して、それに価値があれば成功するはずだ。そんなことってあるだろうか?

最近の記事は熱量が足りない。何かAIにまとめさせただけみたいな気がする。

AIメガネで図書館帰りの道草日記を収録する時代が来るかどうか?

更新: 2025-08-02T12:57:44+09:00
8/1/2025 (Fri.)

【人間はもうコードを書かなくていいのか?】AI時代のプログラミングを根本から変える「Software 3.0」の神プレゼンを解説します【エンジニアの働き方】 中島聡のLife is Beautiful チャンネル登録者数 3.98万人 25,796 回視聴 2025/06/28を見ていると、プロのAIによる開発の状況がわかっておもしろい。例があまり意味がないし、便利そうにもみえない。無料版はバイブコーディングに近いのかもしれない。もちろん、小規模なものしか作れないだろうけど。

DHHはAIに尋ねるが、コードのコピペはしないらしい。Rubyで自己脳がRails的に組織化されているから、むしろ他の思考様式は邪魔になるのだろう。IDEも使わない。自分の脳で自分のコードに変換して使うのだろう。{07/28/2025: [A.I.]DHH(David Heinemeier Hansson), Ruby on Rails}←。まあ、僕もPythonのコードならこんなもんかと思って、大丈夫かなと思いながらも、意図通り動けば受け入れるが、Perlだと引っ掛かってしまうだろうなと思う。

今日は【久しぶりにワクワク】Teslaの大勝負!サムスンと2.4兆円超の大型契約を解説【メタトレンドで読む】 中島聡のLife is Beautiful チャンネル登録者数 3.98万人 24,991 回視聴 2025/07/31を見た。この動きは注目だろうね。テスラがサムスンと165億ドルの大型契約 次世代AI6チップをテキサス工場で製造 - EVcafe powered by webCG、うーむ、サムスンがテスラ向けに半導体製造へ、2.4兆円相当−受託生産追い風 - Bloomberg、やはり、「AI」6なんだ。2nmプロセスか。

更新: 2025-08-02T12:41:00+09:00
| 先月 | Monthly Index | Timeline | Mobile版 powered by iUI
2001年版 | INDEX | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2002年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2003年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2004年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2005年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2006年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2007年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2008年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2009年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2010年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2011年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2012年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2013年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2014年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2015年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2016年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2017年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2018年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2019年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2020年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2021年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2022年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2023年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2024年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2025年版 | INDEX | 1 | 2 | 3 | 4 | 5 | 6 | 7

(C)jscripter