見出し画像

AI中納言を作るーClaudeによるSQLコーパス操作ー

恒例の、松浦先生主催「言語学な人々 Advent Calendar 2024」の16日めです。

今年は「AI中納言」を作ることに挑戦しました。最近話題になったのですが、AIの御三家のClaudeから、様様なツールにアクセスするミドルウェアサーバーのプロトコル(MCP)というのが公開され、中にSQLアクセス(ローカルのsqlite3データベースなど対応)を可能にするものがありました。その仕組みで、日本語コーパスにアクセスしたらおもしろいのではないかと考え、Macで試作したものです。中納言」というのは、国立国語研究所のコーパス操作クラウドアプリの名称ですが、ちょっとお借りしました。今回のツールを実際にどこかで論文等で公刊することがあれば、名称は変更します。なお、マシンはM1で16GBメモリで、現時点では、ごく普通のパワーのMacだと思います。今回の実験では問題なく高速動作します。

AI中納言の実際

では、さっそく、MacのClaudeデスクトップアプリで動かしてみましょう。今回は、テストとして、『源氏物語』だけを対象とします。(ローカルの対象データは、1形態素1行で、50万行ほどあります(国語研短単位)。SQLのカラムのスキーマは、「語彙素」「語彙素読み」など、おおよそ国語研の日本語歴史コーパス構造を流用してあります。)
 以下、YKは、私のプロンプト、AIは、AIの回答です。

(YK)では、いよいよ作業を始めて見ます。ワクワクしますね。まず、源氏物語54帖の各帖の単語数を数えて一覧してください。
(AI)はい、源氏物語54帖の単語数を集計します。ただし、vol_titleでグループ化する際に、文節の区切り文字やスペースなども1単語としてカウントされる可能性があるため、実質的な「単語」のカウントのために品詞(pos)も考慮しましょう。

以下が源氏物語54帖の単語数一覧です:

1. 最も長い巻:
- 若菜上: 28,164語
- 若菜下: 27,882語
- 早蕨: 26,046語

2. 最も短い巻:
- 篝火: 928語
- 花散里: 1,003語
- 関屋: 1,286語

3. 巻の長さの傾向:
- 平均:約9,700語
- 長編(2万語以上): 若菜上下、椎本、早蕨
- 短編(2千語未下): 篝火、花散里、関屋、花宴

4. 注目点:
- 物語の中心部(若菜上下)が最も長く、詳細な描写がされています
- 短い巻は多くが橋渡し的な役割を果たす巻です
- 物語の終盤(浮舟、蜻蛉など)も比較的長めの巻が続きます

なお、上記の「単語数」は補助記号や空白を除外した数値です。特定の巻についてより詳しい分析(例:品詞の内訳など)が必要でしょうか?

どうでしょう。単純に巻ごとの短単位形態素数一覧表を出してくるだけかと思ったら、意外にいろいろと配慮しています。一番驚いたのは、指示しなくても(ゼロショットで)句読点やスペースなどを除外する処理をpos(品詞)カラムを併用して勝手にやってくれたことです。これは非常にありがたい。そして、一覧表ではなく、まとめて、「注目点」などをあげてくれたことです。最後に、今後の課題まであげてくれています。このように、初心者にもやさしいインターフェースになることは、AI操作の非常に有利な点と言えるでしょう。
 実際に裏でAIが発行したSQLクエリーは次のようになっています。

{
  `query`: `SELECT 
    vol_title,
    COUNT(*) as total_tokens,
    SUM(CASE WHEN pos NOT IN (' ''補助記号''', ' ''空白''') THEN 1 ELSE 0 END) as word_count
FROM corpus 
WHERE text_title = ' ''源氏物語'''
GROUP BY vol_title
ORDER BY MIN(id);`
}

AIとのやりとりの続き・品詞分析

では、先の操作に戻って続けてみましょう。

(YK)桐壺の巻の品詞の割合を調べて、よかったらグラフにかけますか?
(AI)はい、桐壺巻の品詞の分布を集計し、視覚化します。まず品詞の集計をしてみましょう。この結果を見やすくグラフ化しましょう。上位10品詞をピックアップして円グラフにします:

グラフを描く部分は、実際はReactの仕組みを使ってくれています。そのコードも自由に見て、コピーもできます。このように、操作の結果を直ちに可視化してくれる点も、AI操作の便利な点であると言えます。

続きを見てみます。このように勝手に分析をしてくれるのもメリットです。

(AI)桐壺巻の品詞分布から以下のような特徴が見えてきます:

1. 名詞と動詞が中心
- 名詞(普通名詞-一般)が12.74%で最多
- 動詞(一般+非自立可能)で合計約20%

2. 助詞・助動詞の高い使用率
- 格助詞、係助詞、接続助詞などの助詞類で合計約22%
- 助動詞が10.64%で3位

3. 修飾語の割合
- 形容詞(一般)が3.94%
- 副詞が3.48%

4. 特徴的な点
- 補助記号(読点)の使用が多い(9.14%)
- 固有名詞(人名、地名)の使用は比較的少ない
- 感動詞の使用は非常に少ない(0.02%)

この分布は物語の導入部としての桐壺巻の特徴をよく表しています。説明的な文体が多く、会話よりも叙述が中心となっていることがわかります。

特定の品詞やその使用例についてより詳しく分析してみましょうか?

とりあえず、AI任せで調べさせてみましょう。

(YK)あなたが気になった部分でいいので、調べてレポートしてください。
(AI)はい。桐壺巻の中で特に興味深いのは、物語の導入部としての叙述に使われる形容詞と副詞の使用です。これらが物語の雰囲気をどのように作り出しているのか調べてみましょう。

分析レポート:桐壺巻における感情と情景の描写技法

1. 形容詞の使用傾向
最頻出の形容詞から、物語の基調となる感情の流れが見えてきます:

a) 身分や格式に関する表現
- かしこき(賢し):12回
- やむごとなき:5回
→ 宮廷世界の格式の高さを強調

b) 感情を表す表現
- 悲しき:9回
- 心苦しう:6回
- わりなく:5回
→ 桐壺更衣の悲劇的な運命を暗示

c) 評価を表す表現
- いみじう:6回
- はかなき:5回
→ 状況や心情の深さを表現

2. 副詞の特徴的な使用

a) 程度の強調
- いと:69回(圧倒的な使用頻度)
- いとど:6回
→ 感情や状況の程度の強さを際立たせる

b) 状況説明
- え(~ない):22回
- かく:11回
- なほ:10回
→ 物語の展開を滑らかに進める機能

3. 注目すべき表現パターン

特に興味深いのは、「いと」の使用頻度の高さです。具体的な使用例を見てみましょう:

申し訳ありません。より具体的な文脈を見てみましょう:

申し訳ありません。クエリの制限に触れてしまいました。まとめると:

結論:桐壺巻の文体的特徴

1. 感情の濃淡を丁寧に描き分ける技法
- 「いと」による繊細な感情の強調
- 「かしこし」「やむごとなし」による身分の表現
- 「悲し」「心苦し」による感情の直接的表現

2. 重層的な物語展開の基礎作り
- 「なほ」「また」による展開の積み重ね
- 「げに」「おのづから」による自然な因果の表現

3. 独特の美的表現
- 「はかなし」「限りなし」による情景や感情の余韻
- 「いみじ」による感動の表現

これらの表現技法は、後の物語展開の基調となり、源氏物語全体の文体的特徴を形作る重要な要素となっています。特に、強意の副詞「いと」の多用は、繊細な感情描写を特徴とする源氏物語の文体の核心を示していると言えるでしょう。

より詳しい分析を行うなら、これらの表現が具体的にどのような場面で使われているのか、個別の用例を見ていくのも興味深いと思います。特に関心のある表現はありますでしょうか?

途中、ちょっとクエリを失敗してやり直しているのはご愛敬ですが分析はなかなかです。実際に、発行されているSQLクエリー文を見ることもできますが、到底、自分では思いつかないものばかりです。ただ、エラーもありうるかもしれないので、論文化にあたっては、ちゃんと計算しなおす必要はあるでしょう。

次のように、前後の文脈を取り出すこともできます。形態素の連続を使っているのですが、実は形態素ごとの行データを対象に、SQLクエリーでこれをやるには一工夫が要りますが、なんなくこなしています。

(AI)これらの用例から、「いと」の使用文脈を詳しく分析してみましょう:最初の例(桐壺巻冒頭近く):

「御時に...女御、更衣あまたさぶらひたまひける中に、いとやむごとなき際にはあらぬが、すぐれて時めきたまふありけり」

桐壺更衣の身分と立場を説明する場面
「いとやむごとなき」で高貴さの程度を強調しつつ、「にはあらぬが」で限定
物語の中心的な矛盾(身分と寵愛の関係)を示唆

(後略)

いわゆる「成立論」に関しての問答

上のスレッドに続く、ちょっと先の部分ですが、この話題に源氏物語「成立論」も振ってみた結果が次のようになっています。「成立論」についての知識もあるのはさすが。すぐにそれを受けて研究アイデアまで出してきます。

(YK)ちょっと全体に目を通してみましょう。源氏物語には、成立論があって、いわゆる紫の上系と、玉鬘系とに系列がわかれるという話があるのはご存じですよね?
(AI)はい、源氏物語の成立論として、本文の文体や内容の違いから、大きく分けて「紫の上系」と「玉鬘系」の物語群があるという説を承知しています。
これについて、データベースを使って文体的な特徴を分析できるかもしれません。例えば:

各巻での品詞の使用傾向の違い
特徴的な副詞(「いと」など)の使用頻度の変化
形容詞の種類や使用パターンの違い

分析してみましょうか?
まず、玉鬘系の物語とされる巻(玉鬘・真木柱・若菜上下など)と、紫の上系の物語(若紫・賢木・須磨・明石など)での「いと」の使用頻度を比較してみることができます。あるいは、別の切り口での分析もできます。
どのような観点から分析を進めていきましょうか?

(YK)ではまず「いと」で試してみてください。
(AI)はい、各巻における「いと」の使用頻度を調べ、巻ごとの比較を行ってみましょう。単純な出現回数だけでなく、巻の長さによる影響を考慮するため、巻の総語数に対する割合も計算します。はい。いくつかの文体的特徴を比較してみましょう。以下の観点から分析を試みます:

1. まず、特徴的な副詞の使用:
- 「いと」以外の程度副詞(「げに」「なほ」など)
分析結果をまとめると:
1. 副詞の使用率(1000語あたりの出現数):
紫の上系:
- 若紫:げに(1.0), なほ(0.9), いと(9.6)
- 賢木:げに(0.5), なほ(1.5), いと(7.4)
- 須磨:げに(1.0), なほ(1.1), いと(6.6)
- 明石:げに(1.0), なほ(1.2), いと(6.0)

玉鬘系:
- 玉鬘:げに(0.8), なほ(1.3), いと(8.4)
- 真木柱:げに(0.5), なほ(1.4), いと(8.2)
- 若菜上:げに(1.1), なほ(1.9), いと(7.4)
- 若菜下:げに(1.1), なほ(1.9), いと(9.1)

2. 形容詞の使用率(総語数に対する割合%):

紫の上系:
- 若紫:4.49%(一般:4.0%, 非自立:0.49%)
- 賢木:4.81%(一般:4.37%, 非自立:0.44%)
- 須磨:4.31%(一般:3.74%, 非自立:0.57%)
- 明石:4.37%(一般:3.80%, 非自立:0.57%)

玉鬘系:
- 玉鬘:4.00%(一般:3.54%, 非自立:0.46%)
- 真木柱:4.64%(一般:3.98%, 非自立:0.66%)
- 若菜上:4.00%(一般:3.58%, 非自立:0.42%)
- 若菜下:4.70%(一般:4.17%, 非自立:0.53%)

特徴的な傾向:

1. 副詞の使用:
- 「なほ」の使用は玉鬘系でやや多い(特に若菜上下)
- 「げに」は両系統で大きな差はない
- 「いと」は若菜下で特に高頻度

2. 形容詞の使用:
- 紫の上系の方が全般的に形容詞の使用率がやや高い
- 非自立形容詞の比率は両系統で大きな差はない

3. 文体的特徴:
- 玉鬘系は「なほ」の使用が多く、展開の連続性を重視
- 紫の上系は形容詞による描写が豊か

他の観点(例:助動詞の使用傾向や会話文の割合など)からも分析を進めましょうか?

位相分析

これとは別に、位相での分析もやってみます。AIは、元データの位相フィールドを読み取って動作しています。

(YK)ちょっと他の観点にしましょう。物語中の、和歌や会話の部分がどこかは、データから読み取れますか?

(AI)では、各巻での会話と和歌の割合を集計してみましょう:
興味深い結果が得られました。特徴的な点をまとめると:

1. 会話の多い巻(40%以上):
- 夢浮橋(53.36%)
- 帚木(60.87%)
- 常夏(47.62%)
- 宿木(40.18%)

2. 和歌の多い巻(4%以上):
- 幻(7.59%)
- 須磨(6.80%)
- 花散里(5.75%)
- 藤裏葉(5.43%)
- 総角(5.30%)
- 花宴(5.10%)

3. 特徴的なパターン:
- 帚木巻は特異的に会話が多い(60.87%)
- 若菜上下は長編でありながら、会話の割合が比較的高い(約33%)
- 幻・須磨など、心情描写の重要な巻で和歌が多い
- 雲隠・夢浮橋は和歌が極端に少ない(それぞれ0.47%、0.35%)

4. 物語の展開による特徴:
- 初期の巻は和歌の割合が比較的高い
- 中期(玉鬘系)は会話の割合が増える傾向
- 最終部(浮舟・夢浮橋)は会話主体の展開

より詳しく分析する方向性として:
1. 会話の話者の分布
2. 和歌の内容や種類(贈答歌かどうかなど)
3. 会話と和歌の関係性

などが考えられますが、どの方向で掘り下げていきましょうか?

いったんのまとめ

AI中納言のご感想はどうでしょうか。私は、一日中でも対話できそうです。AIと対話しながらコーパスを使うという体験はまったく初めてでしたが、作る前に私のイメージしていたものとはまったく違いました。最初は、ただ人間が思いつくような単純なSQLクエリーを自然言語で書いてくれるということだけを期待していたのですが、実際には、超絶SQLクエリーを繰り出すコーパス解析コンシェルジェみたいな感じで、可視化しながら、AIからどんどんとアイデアやアドバイスを出してくるので、非常に解析がはかどります。ビジネスにおけるいわゆるBI(Business Intelligence)ツールの高性能AI版というような感じでしょうか。Claude Sonnetの基本の能力の高さが効いています。何か厳密に調べるのは、Python等で直接にデータを触れば良いわけですが、発想を得ることや、調査のとっかかりには極めて有益なツールとなると感じました。今回は源氏物語だけですが、歴史コーパス全部を入れることで、通時的な観察についてAIと協業できるので、非常なメリットになります。ぜひ、通時コーパス全部で試してみたいです。今後の国語研のコーパスの改修方法や、個人的には、大型の国語辞典の編集作業のための発見ツールにできるのではないかと考えています。

長くなるので、ClaudeにおけるMCPの使い方自体やSQLサーバーの構築方法はここでは書きませんでしたが、Anthropicのサイトや、いつもながらの仕事の早いnpaka氏の記事などが参考になると思います。何かご質問があれば、Xでの私のアカウントにリプライしてください。

LangChainなどの既存ミドルウェアを使ってもローカルのLLMで同じようなことは実現できますが、Claudeから使うMCPは、Claude自体が頭がよく、また、何しろ手軽なので、ぜひお試し下さい。この方法のMCPだけでは結果をファイル保存できない(保存したい場合は、SQLクエリーを保存しておいて、別途サーバーに直接アクセスする必要がある)など、制限もあるので、本格的活用にはさらにもう一段の開発が必要となります。

(以上)



いいなと思ったら応援しよう!

yhkondo
読んでいただきありがとうございます。ツイートなどしていただけるとうれしいです。