プラトンの著作を教師つき学習で分類する

計量文献学という分野をご存じでしょうか?文献学というと文系という感じがしますが、計量文献学では文献の特徴を数値化し、統計学的手法を用いて文献の分析をします。

文学作品の分析に数学を持ち込むというと、なんだか胡散臭く感じるかもしれません。文学作品の美しさを一体どうやって数学で表現すればよいのか…。たしかに、これはちょっと難しそうです。しかし、天才的な作家といえども人間ですから、彼らの書いたものには特有の癖が出るはずです。そういう癖を統計的に調べることはできそうですし、それによって、客観的データに基づいた作家・作品の分析・比較が可能になったりします。

例えば、シェークスピア=ベーコン説という仮説があります。たかが町人のシェークスピアがあれほど教養あふれる作品を書けたとは思えない、もっと教養のある別人(例えば、フランシス・ベーコン)が「シェークスピア」という名前で戯曲を書いたのではないか…といった説です。専門家の間ではまったくの俗説として退けられているのですが、この説を否定する根拠の一つは計量文献学によるものです。具体的には、二人の文章の比較をしてみると、平均的な単語の長さとか一文中の単語の数が違っているじゃないか、などなど*1

理数系の学生だった私は、大学生の頃にこういう研究手法の話をはじめて聞いて、何となく格好いいと感じたのですが、同時に、自分には無縁の話だとも思っていました。しかし、いまどき古典作品の文書ファイルはweb上を探せば案外見つかるものですし、統計的分析を行う手ごろなツールもあります。これらを利用して、計量文献学の雰囲気だけでも味わえないものでしょうか…?

ここでの課題

pythonにはscikit-learn(サイキット・ラーン)という機械学習に適したモジュールが用意されています。これをうまく使えば、統計に疎い私もお手軽データサイエンティストになれるかもしれません。早速試してみましょう。

ここで取り上げるのは、「教師つき学習」によるテキストの分類です*2。大量の文書群(例えば、ニュースの記事)が与えられたとして、それぞれの文書を適切なジャンルに分類する、という作業を機械に勝手にやらせるという課題です。ここではニュース記事の分類ではなく、古代ギリシャの哲学者プラトンの著作の分類を行なってみたいと思います。

先立つものとして、まず、データとなる文書が必要です。以下のサイトにプラトンの著作の英語版がtxtファイルで落ちていますので、これを利用しましょう。

注意しないといけませんが、このデータは英訳版のプラトンの著作です。本来なら古代ギリシャ語で書かれた原著のtxtファイルを利用すべきですが、ちょっと手に入りそうにないので英語版で我慢します。ギリシャ語のtxtファイルでもほぼ同じアルゴリズムが適用できるはずなので、いずれ試してみたいところです。

次に、教師つき学習による分類には正解ラベルが必須となります。一般に、プラトンの著作は「初期」「中期」「後期」の三つのグループに分けられるので、「初期」「中期」「後期」を正解ラベルとします。『ソクラテスの弁明』なら「初期」、『法律』なら「後期」といった具合です。どの著作がどの時期に属するのかは、wikipediaで適当に調べます。

そういうわけで、作業の方針は

  1. 文書をBOW(bag of words)とみなし、ベクトル化する。
  2. ティマイオス』を除くすべての文書に正解ラベルをつける。
  3. 分類器(例:ランダムフォレスト)に訓練を施す。
  4. ティマイオス』がどの時期の著作であるかを分類器に予測させる。

という感じになります。単純明快の王道を往きましょう。

作業内容は以上ですが、問題設定がいくぶん奇抜に思われるかもしれないので、コードを書く前に、背景と目的も書いておきます。「細かいことはいいからさっさとコードを見せろ」という人は適当に流し読みして、どうぞ。

背景

プラトンの著作年代の推定は19世紀後半になって本格的に行なわれるようになりました。その昔は、プラトンアリストテレスの違いも結構あやふやだったようです。偽作を見抜いたり、年代を推定できるようになったのはつい最近というわけです。

イギリスやドイツの文献学者が武器としたのは、まさに計量文献学の手法です*3プラトンは20を越える対話篇を残していますが、文章のスタイルは一貫していたわけではないようです。文体の統計的パターンを調べると、『ソフィスト』『ポリティコス』『法律』『ティマイオス』『クリティアス』『ピレボス』の類似性が見出されました。アリストテレスの報告から『法律』がプラトン最後の作品だと分かっているので、これらは後期の作品ということになります。同じ要領で調べると、『国家』『パイドロス』『テアイテトス』『パルメニデス』が第二の群をなすことが分かり、これらは内容的にみて過渡期の作品であろう・・・。そんな感じで初期・中期・後期という分類ができあがりました。

ここでやろうとしてるのは、こういう偉大な先達の仕事をコンピュータを使って真似っこしてみるということです。

ティマイオス』をテストデータに利用する理由

プラトンの著作は対話篇と呼ばれ、戯曲のようなスタイルになっています。ほぼ毎回登場するのがソクラテスで、お話の主人公になっています。ですが、後期の対話篇ではソクラテスの出番は徐々に減っていき、『法律』では登場すらしなくなります。これをどう解釈すればいいのか、研究者の間で問題になります。

20世紀初頭の文献学者バーネットは、プラトンが描くソクラテスは実在したソクラテスを忠実に再現しているという仮説を立てました。高校倫理の授業で、プラトンといえばイデア論という図式を習ったと思いますが、イデア論は中期対話篇でソクラテスの口を通して語られます。なので、バーネット先生によればイデア論ソクラテスの学説であって、プラトンの学説とは断定できません。というのは、プラトン中期の最後の作品とされる『パルメニデス』でイデア論は批判されていて、しかも、ソクラテスの役割が切り詰められる後期対話篇でイデア論が積極的に語られることは「まず」ないからです*4

ここでバーネットの解釈に不都合な材料を提供するのが『ティマイオス』です。この著作は文体上は後期対話篇とされますが、イデア論が積極的に語られているからです。バーネットの仮説を支持するにせよしないにせよ、これは説明を要します。実際、『ティマイオス』を後期に分類する文体統計上の証拠は乏しいと主張し、むしろ中期対話篇に分類すべきだと大胆に主張する論者もいます。代表格はオーウェンという人です*5オーウェンの論文は伝統的な見解に従う人々との論争に発展し、泥沼の論争が今も続いているようです*6

さて、それでは我々の分析では『ティマイオス』はどの時期に分類されるでしょうか。調べてみます。

コード

以下のようなコードを書き、実行しました。プログラム初心者なのでガバガバなコードだと思いますが、許してください何でもしますから。

import numpy as np
from sklearn.ensemble import RandomForestClassifier
import glob
from sklearn.feature_extraction.text import TfidfVectorizer

#テキストデータの読み込み
def load_plato():
    category = {
        'early': 1,
        'middle':2,
        'late': 3
    }
    docs  = [ ]
    labels = [ ]
   
    for c_name, c_id in category.items():
        files = glob.glob("./text/{}/*.txt".format(c_name))
        text= ''
       
        for file in files:
            with open(file, "r") as f:
                lines = f.read().splitlines()
                text = "".join(lines[8:-14])
               
            docs.append(text)
            labels.append(c_id)
   
    return docs, labels
   
docs, labels = load_plato()

 

import random
random.seed()
indices = list(range(len(docs)))
random.shuffle(indices)
docs   = [docs[i] for i in indices]
labels = [labels[i] for i in indices]

#テストデータを追加
with open("./text/timaeus_1b.txt", "r") as f:
    lines = f.read().splitlines()
    text = "".join(lines[8:-14])

docs.append(text)

#文章のベクトル化
docs = np.array(docs)
vectorizer = TfidfVectorizer(use_idf=True)
docs = vectorizer.fit_transform(docs)

train_data = docs[:-1]
test_data = docs[-1]

#学習と予測
clf = RandomForestClassifier(n_estimators = 100, random_state=0)
clf.fit(train_data, labels)

print(clf.predict(test_data)) 

出力は [3] でしたので、『ティマイオス』は通説のとおり「後期」ということになります。なお、TfidfVectorizerのインスタンスを生成するときに、use_idf = Falseを引数にとると、tf値だけで文章をベクトル化することになりますが、この場合でも結果は同じでした。

コードの説明

あまり難しいことはやっていないので説明は不要かもしれませんが、少し前の自分に説明するつもりで説明を書きます。

下準備として、”text” というフォルダの中に"early", "middle", "late" というフォルダを用意し、その中に先ほどurlを貼ったサイトからダウンロードしたtxtファイルを格納しておきます。『ティマイオス』だけは"text"フォルダの中に格納しておきます。玄人はスクレイピングで集めるのかもしれませんが、なにぶん素人なのと、数もそれほど多くないので手動で集めました*7

txtファイルを読むときはopen()という組み込み関数を使うことが多いですが、ここではglobというモジュールでまとめて読み込んでます。正規表現が使えて便利です。なお、リンク先から集めたtxtファイルは、冒頭と最後に余計な文字列を含むので、スライスを使って行数を適当に削っています。

文書のベクトル化にはTfidfVectorizerを使います。これは文書中に出現する各単語にtf-idf値という数を割り当て、その配列として文書をベクトル化するというツールです。tfはterm frequencyの略で、単語の出現頻度に相当します。idfはinverse document frequencyの略で、単語の希少性を示します。多くの文書に登場する単語のidfは低く、特定の文書にしか登場しない単語のidfは高くなります。厳密な定義は以下をどうぞ。

シンプルな概念なので、TfidfVectorizerの実装はそれほど難しくないです。が、面倒なのでツールを使います。

乱数を使う場面では再現性を考慮して初期値を与えてます。

検証

以上のやり方で『ティマイオス』は後期対話篇だと結論するのは、もちろん性急です。

問題点はいろいろあると思いますが、最大の問題点は、データの文書が少なすぎることです。ニュース記事の分類などを行なうときには、学習の段階でそれこそ数千・数万件といった大量の文書を食わせることになりますが、ここでは僅か24本の文書しか使えませんので、予測精度にとって致命的かと思います*8

この点、もう少し考えてみます。まず、次のコード

print(clf.score(train_data, labels))

で、訓練データとラベルの対に対して、分類器(学習後)の精度を調べました。結果は1.0だったので、どうもランダムフォレストでは訓練に使ったデータは少なくとも適切に分類するようです。

そこで、ランダムフォレストのインスタンスを生成するときのパラメータ random_stateを、0から80といった広い範囲で動かしてみて、それぞれの場合で予測結果を調べました。

 for i in range(80):
    clf = RandomForestClassifier(n_estimators = 100, random_state=i)
    clf.fit(train_data, labels)
    print(i, clf.score(train_data, labels)) 

出力結果を数えてみると、[3] という予測が9割(72/80)で、残りは [2] という予測でした。意外や意外。[3] という先の結果はまったくの当てずっぽうというわけではなかったようです。

また、データ量の不足という根本的な問題を多少とも改善するため、データの水増しを行なってみました。機械学習で画像を分類するとき、訓練に用いるデータの量を水増しするために、既存のデータを左右反転させたり解像度を落としたり、といった操作を加えることがよくあるそうです。似たような手段を、テキストの分類でも使わない手はないと思います。

問題はどうやって水増しするかですが、次のように考えました。『国家』と『法律』の対話篇はプラトンの著作でも長大な作品であり、10巻に分割されています*9。そこで、『国家』と『法律』のtxtファイルを10個のtxtファイルにバラしました(手動)。

大した水増しではありませんが、このデータセットで同じコードを実行すると、78/80の割合で [3] という予測結果が出ました。残りは [2] です。より安定してきたような気がします。

そんなわけで、ランダムフォレストの分類器によれば、『ティマイオス』は後期作品の蓋然性が高そう、と結論できそうです。これは通説にも合致しております。

一応、めでたしめでたし。 

*1:西内『統計学が最強の学問である』pp.245-247

*2:機械学習は大きく三種類に分かれ、教師つき学習の他に教師なし学習と強化学習があります。

*3:ジョン・バーネット『プラトン哲学』1章を参照。

*4:こういう考え方に対する反論は、藤沢『プラトンの哲学』を参照。

*5:ギリシア哲学の最前線I』所収の論文を参照。

*6:Plato's Timaeus (Stanford Encyclopedia of Philosophy)

*7:ティマイオス』のtxtファイルは文字化けを起こしてる箇所がいくつかあったので、それも手動で消したりしてつじつまを合わせてます。

*8:プラトンの著作はすべて残っているので、新たな対話篇が発見されることは期待できません。

*9:ただし、邦訳の岩波文庫では上下二巻本。