教養学党ブログ

artes liberales: 自由であるための技術

自分の知識構造を俯瞰する

知識構造を俯瞰する

自分の知識がどのように構成されているのかを理解することは重要です。 前提として、偏りのない考え方を持っている人はいないし、 他人と全く同じ見解に立つということもあり得ないです。

そうすると、自分が持っている特定の意見について、それがどのような背景から生み出されたものなのか、 自分で把握することに意味があります。 他人と合意を形成する、ないし少なくとも理解することで分断を防ぐという場面において特に。

「知識の偏りを知る」で書いたように、日本図書十進分類法(NDC)を手掛かりにすると構造を見ることができると思っています。 知識の偏りを知る - 教養学党ブログ 今回はその発展です。

読書記録をデータソースとする

Web本棚サービスのブクログには読書履歴のエクスポート機能があります。 https://booklog.jp/users/ユーザID の本棚ホーム画面から設定メニューを呼び出し、エクスポートを選択します。

f:id:ba_tabata:20210417113701p:plain
エクスポートメニュー

NDLサーチのWebAPIを叩く

エクスポートされた中にISBNがあるので、NDLサーチのWebAPIを利用してNDCでどこに該当するのかを教えてもらいます。 今回はOpenSearch形式を利用したので https://iss.ndl.go.jp/api/opensearch?dpid=iss-ndl-opac&isbn= の最後にISBNを指定すれば書誌データ(図書館の本のメタデータ)を取得できます。 その中からNDC9該当する部分を正規表現で取ってくればOKなので、 1行ずつ処理していくプログラムを書きました。

俯瞰する① 全体

一次区分でみて、どの類が多いか見ていきます。 以下は恥ずかしながら僕の事例。 n類(中身):登録されている冊数 概ね5%ごとに■が1つ積まれます。

実際に見てみる

  • 0類 ■■■■(総記) : 33
  • 1類 ■■■(哲学・宗教) : 23
  • 2類 ■■■(歴史) : 17
  • 3類 ■■■■■■■(社会科学) : 91
  • 4類 ■■■■(自然科学) : 46
  • 5類 ■■(技術・工学) : 15
  • 6類 ■■(産業): 5
  • 7類 ■■(芸術) : 6
  • 8類 ■■(言語): 1
  • 9類 ■■■■■■(文学) : 74

見直してみる

小説を読むので9類(文学)は一つの山になります(たぶん、多くの人がそうなります)。

社会科学全般や教育学にもともとバックグラウンドがあるので、3類(社会科学)は多く、 4類(自然科学)も科学技術政策やSTSに分野を移してきたので多いです。

冊数で見ると4類(自然科学)>5類(技術・工学)>6類(産業)になるところにSTSの人間としての自分の性質がよく見られます。

一応、歴史学科出身なのですが2類(歴史)が無残なことになっていますね。歴史学出身を名乗ることは皆無です。

俯瞰する② 分野ごと

一次区分の冊数を分母にして二次区分ごとの割合を出します。 今回は公開しませんが、そこに対応するタイトルも一覧で出力されます。

0類(総記)

総記は分かりにくいかもしれませんが、全体に関するものです。

図書館情報学やジャーナリズム論、辞典類、読書案内などです。情報学も元々ここにありました。

図書館で働き始めてから図書館情報学も一応勉強しているので、その影響が見られます。

最近、メディア論をサボっていることが分かりますね。

  • 0類二次区分 0: 12■■■■■■■■■
  • 0類二次区分 1(図書館情報学): 16■■■■■■■■■■■
  • 0類二次区分 2(図書・書誌学): 1■■
  • 0類二次区分(百科事典) 3: 0
  • 0類二次区分 4(一般論文集): 0
  • 0類二次区分 5(逐次刊行物): 0
  • 0類二次区分 6(団体): 0
  • 0類二次区分 7(新聞・ジャーナリズム): 2■■■
  • 0類二次区分 8(叢書・全集・選集): 2■■■
  • 0類二次区分 9(貴重書・郷土資料): 0

1類(哲学・宗教)

0~5が哲学、6~9が宗教という少し特殊な構造をしているのが1類です。

パスカルが好きな関係で西洋哲学が少し多いですね。

  • 1類二次区分 0: 1■■
  • 1類二次区分 1(哲学各論): 2■■■
  • 1類二次区分 2(東洋思想): 1■■
  • 1類二次区分 3(西洋哲学): 8■■■■■■■■
  • 1類二次区分 4(心理学): 1■■
  • 1類二次区分 5(倫理・道徳): 6■■■■■■■
  • 1類二次区分 6(宗教): 2■■■
  • 1類二次区分 7(神道): 0
  • 1類二次区分 8(仏教): 0
  • 1類二次区分 9(キリスト教): 2■■■

    2類(歴史)

    少ないので省略。6類(産業)、7類(芸術)、8類(言語)も同様

    3類(社会科学)

    社会科学です。メインの領域ですね。教育学から教育行政に関心が移り、 公共政策の中でも政治・行政をメインにし、多少経済分析もしていた一方で、法律には強くないことが分かります。

近年社会学をサボっていることも分かりますね…。

  • 3類二次区分 0: 6■■■
  • 3類二次区分 1(政治学): 24■■■■■■■
  • 3類二次区分 2(法学): 7■■■
  • 3類二次区分 3(経済学): 17■■■■■
  • 3類二次区分 4(財政): 2■■
  • 3類二次区分 5(統計): 1■■
  • 3類二次区分 6(社会学): 13■■■■
  • 3類二次区分 7(教育学): 21■■■■■■
  • 3類二次区分 8(民俗学): 0
  • 3類二次区分 9(軍事・防衛): 0

4類(自然科学)

一番意味のある情報はここでした。自然科学全般(0)に関することは勉強しているが、各分野は弱いということです。

知っていましたが、こうやってみると如実ですね。

STS領域の人はバイオやICT、宇宙や医療などそれぞれに強みを持つケースが多いです。僕も何かしら分野をちゃんと持った方が良いですね。ウナギ以外にも。

  • 4類二次区分 0: 28■■■■■■■■■■■■■■
  • 4類二次区分 1(数学): 5■■■■
  • 4類二次区分 2(物理): 1■■
  • 4類二次区分 3(化学): 0
  • 4類二次区分 4(天文): 0
  • 4類二次区分 5(地球科学): 2■■
  • 4類二次区分 6(生物一般): 3■■■
  • 4類二次区分 7(植物): 0
  • 4類二次区分 8(動物): 2■■
  • 4類二次区分 9(医学・薬学): 5■■■■

5類(技術・工学)

  • 5類二次区分 0: 4■■■■■■■
  • 5類二次区分 1(建築工学): 2■■■■
  • 5類二次区分 2(建築学): 0
  • 5類二次区分 3(機械工学・原子力工学): 2■■■■
  • 5類二次区分 4(電気工学): 2■■■■
  • 5類二次区分 5(海洋工学): 0
  • 5類二次区分 6(金属工学): 0
  • 5類二次区分 7(化学工業): 0
  • 5類二次区分 8(製造工業): 1■■■
  • 5類二次区分 9(家政学・生活科学): 4■■■■■■■

9類(文学)

日本の文学への偏りが激しい。翻訳ものすらあまり読まないらしい。

  • 9類二次区分 0: 0
  • 9類二次区分 1(日本): 63■■■■■■■■■■■■■■■■■■■
  • 9類二次区分 2(中国): 2■■
  • 9類二次区分 3(英米): 3■■
  • 9類二次区分 4(独): 1■■
  • 9類二次区分 5(仏): 3■■
  • 9類二次区分 6(西): 0
  • 9類二次区分 7(伊): 0
  • 9類二次区分 8(露): 0
  • 9類二次区分 9(その他): 2■■

見えてきたもの

分野

人文学系は思っていた以上に弱い。というか、近年サボり気味。

自然科学については分野を持つことが大事。メタサイエンスだけでなく興味ある各論を進めていくことが、 メタサイエンスについて考えていくうえでもおそらく価値を持つ。

「科学技術」という日本独自の用語に対応する上で、技術・工学とのつながりを意識する必要がもっとありそう。

分析方法

論文ベースで情報を入手している分野は反映されないです。言い換えると、図書という媒体を経由していない知識は拾えていません。

また、あくまで分野で見ているので、その中での質などは見られていないし、ページ数なども反映されないです。

複数の主題を扱っている出版物は、NDCが1つしか付与されないため不完全でしょう。分類が複数付与されている場合への対応や件名などから拾う方法も考えた方がよさそうです。

今回はNDC9版の情報を基本としました。したがって、8版以前のNDCしか持たない書誌データや10版が既に適用されている書誌データからはうまく情報を引き出せないです。版違いによる互換性に問題を感じたので、手動で対応することにしたのですが、全国書誌として見るならばここの一貫性は求められるところになるかもしれないと考えています。

総じて、今まで計量書誌学がぶつかってきた点を再確認したという感触を得ました。

スクリプト本文

Python3系列で(下手ですが)書いています。好きにご利用ください。

Pandasを利用する必要はなかったのですが、使ってみたかった(本音)

"""
簡単な使い方
ブクログでエクスポートする。
csvの1行目にタイトル行を入れる。ISBNの列にはISBN、タイトル列にはTitleと入れる。utf-f(BOMなし)で保存する。
1列目に1~順番に番号を振り、Numを1行目に付ける。名前はbooklog.csv

APIは待機時間を設けているため、算出に時間がかかる。
類表示後に特定の類の数字を入力するとその類の中での割合を再度表示できる。
表示を終えたい時はexitと入力する
"""
# -*- coding: utf-8 -*-
import urllib.request
import re
import csv
import time
import pandas as pd
import os


# pd.set_option("display.max_columns",17)
# 割合を返して■で示す関数
def my_rateprint(num):
    i = 0
    x = 0
    while (num - x)>0:
        x = (0.05 * i)
        i +=1
        if (num -x) == -0.05:
            break
            return (num -x)
        elif i ==20:
            break
    return("■"*(i))

# NDLSearchからAPIでNDCを引っ張ってくる関数、引っ張ってこられない場合はエラーコードの1000を返す
def my_ndcapi(isbn):
    response = urllib.request.urlopen('https://iss.ndl.go.jp/api/opensearch?dpid=iss-ndl-opac&isbn='+ str(isbn))
    content = response.read().decode("utf-8")
    re.search('NDC\(9\).\s(\d{3}.\d+|\d{3})',content)
    if re.search('NDC\(9\).\s(\d{3}.\d+|\d{3})',content) != None:
        ndc9 = re.search('NDC\(9\).\s(\d{3}.\d+|\d{3})',content)
        ndc = re.search('(\d{3}.\d+|\d{3})',ndc9.group())
        return float(ndc.group())
    else:
        return ("1000")
    response.close()
        
path ='./resultlist.csv'
if (os.path.isfile(path)):
    df = pd.read_csv('./resultlist.csv',dtype={'NDCR':float}).set_index('Num')
else:
    df = pd.read_csv('./booklog.csv',dtype=str).set_index('Num')
    for index, row in df.iterrows():
        isbn=(row[2])
        df.at[index, 'NDCR'] = my_ndcapi(row['ISBN'])
        time.sleep(2)

df.to_csv("resultlist.csv")
y = 0
li ={}
while y < 10:
    li[y] = df[(df['NDCR']<(y+1)*100) & (df['NDCR']>=(y*100))].values.tolist()
    print(str(y)+"類 : ",len(li[y]))
    print(my_rateprint(len(li[y])/len(df)))
    y +=1
while y != 'exit':
    y = input()
    if y == 'exit':
        break
    else:
        y = int(y)
        print([r[10] for r in li[y]])
        x = 0
        j = 0
        while x < 10:
            for r in li[y]:
                if((r[-1])-y*100) < (x+1) *10 and ((r[-1])-y*100) >= x * 10 :
                    j +=1
            print(str(y)+"類二次区分 "+str(x)+": "+str(j)+ my_rateprint(j/len(li[y])))
            j = 0
            x +=1