和歌用語シソーラスの開発と用語空間分析に関する基礎研究

山元啓史 (yamagen at ryu.titech.ac.jp)

Time-stamp: “2014-12-13 20:40:35 yamagen”

プロジェクト概観

ことばは単語を単独で使うのではないにも関わらず、 語と語の互いの関係やまとまりを記述する研究がほとんどありません。

言語の変化を分析するために必要な処理とは何か

まず、「変化」とは何かを考えることにしましょう。 変化とは、2点における違いを見ることです。 これは言語に限られたことではありません。 では、2点における違いはどうやって見ればよいかというと、 比較し、その2点間の距離を求めればよいのです。

「ぶれる」とは

データマイニング研究では、「表記の揺れ」と言いますが、 言語の通時的研究では、 そもそも標準的な表記という取り決めがありません。

これらをすべて同じとみなすか、 個別に扱うか、 あるまとまりにわけて扱うか、 などの処理が必要です。

これを単純に単語の正規化、あるいは、 単語の表記上の違いを正規化する処理ということにします。 実は「表記上の違い」は同じにすればよいというわけではないので、 さまざまな表記を採集し、まとまりで管理する仕組みが必要になります。

そこで、すべての表記はひとつずつのデータとして、 それらを語彙データベースとしてまとめ、 おおままな意味で語の分類を管理する番号(ID)をつけたものを シソーラスと呼ぶことにします。

一般的にはシソーラスは類義語やある語の言い換えを調べるために用いるため、 類義語辞典と呼ばれることもありますが、 類義語を調べるのが目的ではないため、 ここではシソーラスと呼ぶことにします。

現代語については、文字の正規化としては、 Unicode NFKC に基づいた正規化を行っている (Google: 大規模日本語 n-gram データ)が、 古代語については、何の手立てもない。

例1 古今集の「吉野」と「桜」の関係

古今和歌集の桜と吉野(ca. 905)

古今和歌集の桜と吉野(ca. 905)

例2 新古今集の「吉野」と「桜」の関係

新古今和歌集の桜と吉野(1205)

新古今和歌集の桜と吉野(1205)

目的

 このプロジェクトでは、つぎの3点を研究目標としています。

  1. 和歌用語のシソーラスデータベースを完成すること。
  2. データベースを処理するためのソフトウェアを整備すること。
  3. シソーラスにしたがい、歌ことばの理論的体系を導き出すこと。
  4. 和歌用語の単位についての考察を述べることを通して、言語の単位について考えること。

方法

  1. 旧版分類語彙表(国立国語研究所)を拡張し、 作成した分類体系コード一覧表を作成し、 コードにより語の表記と意味を管理します。
  2. 簡易なプログラムを用意し、そのプログラムによってユーザの望む、 任意の文字列処理や語の集計ができるようにします。
  3. グラフ、ネットワークによる語集合の可視化と分析します。

特徴

  1. 古文に見られる短い語については実際に和歌の体系本に見られる文字列を見 出しとして、連語単位で辞書に登録してあります。
  2. 表記の違いを無視する場合、しない場合を選ぶことができます。
  3. プログラム例を参考にし、ユーザが任意に値(語)を入れ替えることによって、 望む出力が得られるようにしてあるため、コンピュータプログラミングを あまり意識しなくても、古語の分析ができます。

欠点

  1. まだまだシソーラス辞書を育てなければなりません。
  2. 和歌以外のテキスト、うまく処理できません。 それは単語が和歌に限られているためです。
  3. Pythonをインストールしなければなりません。

シソーラスの収録テキスト

-現在、シソーラスには八代集の和歌の用語と品詞、 語義を分類するためのコードの情報が収録されています。

八代集の300年間

八代集の300年間

対応テキスト一覧

現在、八代集(古今、後撰、拾遺、後拾遺、金葉、詞花、千載、新古今)の 仮名漢字交じりテキストに対応しています。 それぞれの出典はkh.bibにBiBTeX形式で収録しました。

八代集収録の歌集一覧: 歌数は新編国歌大観による
No. 名称 勅/院宣 成立 撰者
1 古今 醍醐天皇 ca.905 紀友則・紀貫之・凡河内躬恒・壬生忠岑 1100
2 後撰 村上天皇 ca.951 清原元輔・紀時文・大中臣能宣・源順・坂上望城 1425
3 拾遺 花山院 ca.1007 花山院 1351
4 後拾遺 白河天皇 1086 藤原通俊 1218
5 金葉 白河院 ca.1125 源俊頼 665
6 詞花 崇徳院 ca.1151 藤原顕輔 415
7 千載 後白河院 1188 藤原俊成 1288
8 新古今 後鳥羽院 1205 源通具・藤原有家・藤原定家・藤原家隆・藤原雅経・寂蓮 1978

拡張対応テキスト一覧

今後、八代集のシソーラスを二十一代集対応に拡張するための研究を行います。

二十一代集の534年間

二十一代集の534年間

二十一代集収録の歌集一覧: 歌数は新編国歌大観による
No. 名称 勅/院宣 成立 撰者
1 古今 醍醐天皇 ca.905 紀友則・紀貫之・凡河内躬恒・壬生忠岑 1100
2 後撰 村上天皇 ca.951 清原元輔・紀時文・大中臣能宣・源順・坂上望城 1425
3 拾遺 花山院 ca.1007 花山院 1351
4 後拾遺 白河天皇 1086 藤原通俊 1218
5 金葉 白河院 ca.1125 源俊頼 665
6 詞花 崇徳院 ca.1151 藤原顕輔 415
7 千載 後白河院 1188 藤原俊成 1288
8 新古今 後鳥羽院 1205 源通具・藤原有家・藤原定家・藤原家隆・藤原雅経・寂蓮 1978
9 新勅撰 後堀河天皇 1235 藤原定家 1374
10 続後撰 後嵯峨院 1251 藤原為家 1377
11 続古今 後嵯峨院 1265 藤原家良・藤原基家・藤原為家・藤原行家・真観 1915
12 続拾遺 亀山院 1278 藤原為氏 1459
13 新後撰 後宇多院 1303 二条為世 1607
14 玉葉 伏見院 1312 京極為兼 2800
15 続千載 後宇多院 1320 二条為世 2143
16 続後拾遺 後醍醐天皇 1326 二条為藤・二条為定 1353
17 風雅 花園院 ca.1349 光厳院 2211
18 新千載 後光厳天皇 1359 二条為定 2365
19 新拾遺 後光厳天皇 1364 二条為明・頓阿 1920
20 新後拾遺 後円融天皇 1384 二条為遠・二条為重 1554
21 新続古今 後花園天皇 1439 飛鳥井雅世 2144

和歌とコンピュータ関連論文

このプロジェクトに関連する既発表論文はジャンル別にわけると、 次のようになります。

新たなコーパスを形態素解析する

「KyTea:京都テキスト解析ツールキットをRuby, Pythonから使えるMykyteaを作ってみた」のページを見て、恩恵にあずかろうと思います。

1   wget http://www.phontron.com/kytea/download/kytea-0.4.2.tar.gz
2   tar -xzf kytea-X.X.X.tar.gz
3   cd kytea-X.X.X
4   ./configure
5   make
6   sudo make install
7   kytea --help

KyTeaの辞書を作る

かつて作成した八代集の辞書で解析した結果を訓練データとします。 ここで考えなければならないことは2点です。

ひとつはすでに作成した解析結果が新しい辞書とシステムを使うことによって 違う結果が出てしまったところを確認できるようにすることです。

もうひとつは新しく追加するテキストが正しく解析されているかを観察することです。

すなわち、新しいテキストを正しく解析できるようにすることと、 従来のテキストを新しいテキストのための辞書エントリを追加したことによって、 かつて解析結果に影響を与えないようにモニタすることです。

Pythonから利用できるようにする。

1   git clone git://github.com/chezou/Mykytea-python.git

README.mdを読むと、

lv README.md
KyTea wrapper for python
...

インストールの仕方は、

To build Mykytea-python, run
--------------------

    % make
    % sudo make install
    % swig -c++ -python -I/usr/local/include mykytea.i
    % ARCHFLAGS="-arch x86_64" CC=gcc CXX=g++ make

How to use?
--------------------

とあり、使い方は、

  See 'mykytea_test.py' as a sample program.

とあるので、それにしたがって、変更を加えて、 徐々に自分のプログラムにします。

使用方法

  1. Pythonをインストールしてください。
  2. Pythonから、import wakaを実行してください。
  3. シソーラスがローカルになければ、ダウンロードします。

和歌シソーラス

ここでは和歌シソーラスの基本について説明します。

シソーラスの仕様

01:000001:0001 A00 BG-01-1630-01-0100 02 年 年 とし 年 とし 
01:000001:0001 A10 BG-01-1911-03-1800 02 年 年 とし 年 とし 
01:000001:0002 A00 BG-08-0061-07-0100 61 の の の の の 
01:000001:0003 A00 BG-01-1770-01-0300 02 内 内 うち 内 うち 
01:000001:0004 A00 BG-08-0061-05-0100 61 に に に に に 
01:000001:0005 A00 BG-01-1624-02-0100 02 春 春 はる 春 はる 
01:000001:0006 A00 BG-08-0065-07-0100 65 は は は は は 
01:000001:0007 A00 BG-02-1527-01-0102 47 き 来 く 来 き 
01:000001:0008 A00 BG-03-1200-02-0900 74 に ぬ ぬ に に 
01:000001:0008 A10 BG-09-0010-01-0101 74 に ぬ ぬ に に 
01:000001:0008 A20 BG-09-0010-03-0200 74 に ぬ ぬ に に 
01:000001:0009 A00 BG-09-0010-04-0300 74 けり けり けり けり けり 
01:000001:0010 B00 BG-01-1950-14-0100 02 ひとゝせ 一年 ひととせ 一年 ひととせ 
01:000001:0010 C00 BG-01-1950-01-0300 19 一 一 いち 一 いち 
01:000001:0010 C01 BG-01-1630-01-0100 02 年 年 とし 年 とし 
01:000001:0011 A00 BG-08-0061-10-0100 61 を を を を を 
01:000001:0012 A00 BG-01-1642-02-0100 02 去年 去年 こぞ 去年 こぞ 
01:000001:0013 A00 BG-08-0061-04-0100 61 と と と と と 
01:000001:0014 A00 BG-08-0065-14-0100 65 や や や や や 
01:000001:0015 A00 BG-02-3120-01-0100 47 いは 言ふ いふ 言は いは 
01:000001:0016 A00 BG-03-3012-03-2600 74 む む む む む 
01:000001:0016 A10 BG-09-0010-02-0102 74 む む む む む 
01:000001:0017 B00 BG-01-1641-02-0100 02 今年 今年 ことし 今年 ことし 
01:000001:0017 C00 BG-03-1000-01-0100 57 この この この この この 
01:000001:0017 C01 BG-01-1630-01-0100 02 年 年 とし 年 とし 
01:000001:0018 A00 BG-08-0061-04-0100 61 と と と と と 
01:000001:0019 A00 BG-08-0065-14-0100 65 や や や や や 
01:000001:0020 A00 BG-02-3120-01-0100 47 いは 言ふ いふ 言は いは 
01:000001:0021 A00 BG-03-3012-03-2600 74 む む む む む 
01:000001:0021 A10 BG-09-0010-02-0102 74 む む む む む 

上記は古今和歌集一番歌のシソーラスです。

シソーラスのテキスト形式

01:000001:0005 A00 BG-01-1624-02-0100 02 春 春 はる 春 はる 
|  |      |    |   |                  |  |  |  |    |  |
+--|------|----|---|------------------|--|--|--|----|--|---- 歌集の番号 1
   +------|----|---|------------------|--|--|--|----|--|---- 歌の番号 2
          +----|---|------------------|--|--|--|----|--|-----語の番号 3
               +---|------------------|--|--|--|----|--|-----多義処理の番号 3
                   +------------------|--|--|--|----|--|-----分類番号 4
                                      +--|--|--|----|--|-----品詞番号 5
                                         +--|--|----|--|-----出現形 6
                                            +--|----|--|-----基本形 7
                                               +----|--|-----基本形よみ 8
                                                    +--|-----活用形 9 
                                                       +-----活用形よみ 10
  1. 歌集の番号 01. 古今和歌集, 02. 後撰和歌集, 03. 拾遺和歌集, 04. 後拾遺和歌集, 05. 金葉和歌集, 06. 詞歌和歌集, 07. 千載和歌集, 08. 新古今和歌集
  2. 歌の番号: 新編国歌大観による。
  3. 語の番号: 歌の先頭からの通し番号。
  4. 分類番号: 国立国語研究所旧版分類語彙表による。形式は変更した。BGは分類語彙表にしたがったもの。CHは地名のみを独自に作ったもの。PNは人名のみを独自に作ったもの。
  5. 品詞番号: ChaSen添付の辞書による。
  6. 出現形: 実際に和歌に出てきた形。
  7. 基本形: いわゆる辞書に出てくる形。代表形、標準形や終止形とも。
  8. 基本形よみ: 基本形にしたがう読みがな。
  9. 活用形: 基本形が和歌で用いられたときの形。 出現形は和歌に出てきた形で必ずしも標準的な形ではない。
  10. 活用形よみ: 活用形の読みがな。

Pythonによる和歌シソーラスの利用方法

ここでは、Pythonを使って、1ステップずつ和歌シソーラスの利用方法について 説明します。

ファイルをオープンする

カレントディレクトリに all-v02-utf8.db を置き、ファイルを open()関数で開き、オブジェクト f に渡します。

>>> f = open("all-v02-utf8.db")
>>> f
<open file './all-v02-utf8.db', mode 'r' at 0x879d2a0>

次のような関数を定義する。インデントは4文字。

>>> def database(x):
>>>     data = []
>>>     with open("all-v02-utf8.db") as f:
>>>         for line in f:
>>>             s = line.rstrip()
>>>             match = re.search(x,s)
>>>             if match:
>>>                 data.append(s)
>>>     f.close()
>>>     return data

この関数には、ファイルオープンとxにしたがう行のみをdataに格納します。 ファイルをオープンしたら、f.close()もしましょう。 後で述べますが、ファイルを読み出すのではなく、書き出す時には、 f.close()の前にf.flush()も書き添えます。

正規表現で必要なものを選ぶ

それで、xはどんなものかというと、xはつぎの関数で定義します。

>>>  gosen1 = re.compile("^02:000001:.....[ACE]0[0-9]")

re.compile()という関数は、正規表現(regular expression)のパターンを あらかじめコンピュータで処理するのに便利な形に編集するという仕事を します。 ’^’は行頭を表します。行頭の02:は後撰集を表します。 それぞれの歌集の歌番号は実際には4桁もあれば十分ですが、 余裕を持って、6桁で表示しています。 後撰集の1番歌を取り出すために000001:を指定しています。 [ACE]0[0-9]は分割単位として固有名詞も含めて、 小さく分ける単位を選んでいます。

特定の歌集だけを読み込む

xにgosen1を代入します。

>>> database(gosen1)
>>> database
<function database at 0x9557b8c>

これで、メモリのdataに後撰集の1番歌が格納されました。

データベースを出力する

dataに和歌の分析データが格納されています。 表示してみましょう。

>>> print u'\n'.join(s for s in data)
02:000001:0001 A00 BG-02-1540-10-0100 47 ふる 降る ふる 降る ふる
02:000001:0002 A00 BG-01-5153-07-0100 02 雪 雪 ゆき 雪 ゆき
02:000001:0003 A00 BG-08-0061-07-0100 61 の の の の の
02:000001:0004 A00 BG-01-4230-07-1302 02 みのしろ衣 蓑代衣 みのしろころも 蓑代衣 みのしろころも
02:000001:0005 A00 BG-02-1563-01-0101 47 うち 打つ うつ 打ち うち
02:000001:0006 A00 BG-02-3330-03-0100 47 き 着る きる 着 き
02:000001:0007 A00 BG-08-0064-15-0100 64 つつ つつ つつ つつ つつ
02:000001:0008 A00 BG-01-1624-02-0100 02 春 春 はる 春 はる
02:000001:0009 A00 BG-02-1527-01-0102 47 き 来 く 来 き
02:000001:0010 A00 BG-03-1200-02-0900 74 に ぬ ぬ に に
02:000001:0011 A00 BG-09-0010-04-0300 74 けり けり けり けり けり
02:000001:0012 A00 BG-08-0061-04-0100 61 と と と と と
02:000001:0013 A00 BG-02-3010-02-0100 47 おどろか 驚く おどろく 驚か おどろか
02:000001:0014 A00 BG-09-0040-02-0100 74 れ る る れ れ
02:000001:0015 A00 BG-03-1200-02-0900 74 ぬる ぬ ぬ ぬる ぬる

表記の種類

それぞれの行は大きく空白で各情報が区切られています。 それぞれを取り出しやすくするために、命名しておきましょう。

>>> hyoki = {'id':0,'tag':1,'code':2,'pos':3,'gen':4,'kihon':5,'yomi':6,'kanji':7,'kana':8}

一行のデータは、空白で9つの情報に分けられています。 それぞれを番号ではなく、名前で抽出できるようにします。 たとえば、ある語が和歌の中で出てきたとおりのものは、 行頭から5番目にあります。 データは0からはじまりますから、 5番目は4になります。 ‘gen’:4と書いて、genで表示できるようにしておきます。

表記を番号でなく名前で指定できるようにする

つぎのように入力すると番号で答えてくれますので、 何番目のデータだったかを覚えておく必要はありません。

>>> hyoki['gen']
4

これで、原表記を取り出すことができます。

>>> print u''.join(s.split()[hyoki['gen']] for s in data)
ふる雪のみのしろ衣うちきつつ春きにけりとおどろかれぬる

もう一つ、、かな表記で取り出してみましょう。

>>> print u''.join(s.split()[hyoki['kana']] for s in data)
ふるゆきのみのしろころもうちきつつはるきにけりとおどろかれぬる

さらに、標準的な漢字表記で取り出してみましょう。

>>> print u''.join(s.split()[hyoki['kanji']] for s in data)
降る雪の蓑代衣打ち着つつ春来にけりと驚かれぬる

品詞番号と意味分類コード

pos (品詞番号)を出力してみよう。同じ品詞が続くのはどんな場合でしょう。 番号が連続すると分かりにくいので、間にスペースを入れて出力してみます。

>>>  print u' '.join(s.split()[hyoki['pos']] for s in data)
47 02 61 02 47 47 64 02 47 74 74 61 47 74 74

47(動詞)の連続が1箇所(打ち、着)と74(助動詞)の連続が2箇所(に、けり)(れ、ぬる)見えます。

code (国立国語研究所準拠の意味分類コード)を出力してみると、 次のようになります。

>>> print u'\n'.join(s.split()[hyoki['code']] for s in data)
BG-02-1540-10-0100
BG-01-5153-07-0100
BG-08-0061-07-0100
BG-01-4230-07-1302
BG-02-1563-01-0101
BG-02-3330-03-0100
BG-08-0064-15-0100
BG-01-1624-02-0100
BG-02-1527-01-0102
BG-03-1200-02-0900
BG-09-0010-04-0300
BG-08-0061-04-0100
BG-02-3010-02-0100
BG-09-0040-02-0100
BG-03-1200-02-0900

一休み

以上が、大雑把ですが、和歌データの取り出し方です。 和歌の実例を見るときに必要になりますが、 ほとんどの場合、codeによって計算するので、 実際の和歌を逐一出力することはありません。[@yamagen2007ap]

シソーラスコード辞書の作り方

日本語の表記は、かな、漢字、現代かなづかい、歴史的かなづかいなど、 いろいろあるだけでなく、古典語ともなると、標準的な表記というものがありません。

「立覧」(たつらん)
「契剣」(ちぎりけん)
「思ふ蝶」(おもふてふ)

などは、送り仮名がないばかりか、助動詞や複合辞にも漢字が当てられています。

立覧→立つらむ

と整理するか、そのままとするかは研究目的によって柔軟に使い分ける表記システムが必要です。

和歌のリストを生成する関数を作る

つぎのプログラムは和歌データを作る関数です。

>>> def waka_print(x,y='gen',dem_a=' ',dem_b=''):
>>>      old = ''
>>>      whole = dem_a
>>>      for i in x:
>>>          fields = i.decode('utf-8').rstrip().split()
>>>          num = fields[hyoki['id']]
>>>          new = num[0:9]
>>>          if new != old:
>>>              if old != '':
>>>                  print old + whole
>>>              old = new
>>>              whole = ''
>>>          whole += dem_b + fields[hyoki[y]]
>>>      print old + whole

和歌のリストを生成する関数を実行する

では、実行してみましょう。 後撰集のみのdata、基本形 kihon で出力します。

>>> waka_print(data,'kihon')
...(略)
02:001423 鳴く声に添ふて涙は昇るずど雲の上より雨と降るらむ
02:001424 亡し人の共にし帰る年なりば暮る行く今日は嬉しまし
02:001425 恋ふ間に年の暮るぬば亡し人の別るやいとど遠し成るぬむ

ジェネレータ関数を作る

今度は、ジェネレータで作ってみましょう。 歌のデータを得るだけならば、関数の中で直接 print してもよいのですが、 それをさらに利用するためには、 関数の返り値が得られるようにしておくと便利です。

>>> def waka_generate(x,y='gen',dem_a=' ',dem_b=''):
>>>     old = ''
>>>     whole = ''
>>>     for i in x:
>>>         fields = i.decode('utf-8').rstrip().split()
>>>         num = fields[hyoki['id']]
>>>         new = num[0:9]
>>>         if new != old:
>>>             if old != '':
>>>                yield old + whole
>>>             old = new
>>>             whole = dem_a
>>>         whole += dem_b + fields[hyoki[y]]
>>>     yield old + whole

前の関数 waka_generate() のうち、printのところが yield になっています。

ジェネレータ関数を使う

では、ジェネレータ関数の waka_generate() を使ってみましょう。

>>> i = waka_generate(data,'kanji')
>>> print(i)
02:000001 降る雪の蓑代衣打ち着つつ春来にけりと驚かれぬる
>>> print(i)
02:000002 春立つと聞きつるからに春日山消え敢へぬ雪の花と見ゆらむ

のように1行ずつ出力してくれます。 一挙に出力するためには、

>>> for i in waka_generate(data,'kanji'):
>>>     print(i)
...(略)
02:001423 鳴く声に添ふて涙は昇るずど雲の上より雨と降るらむ
02:001424 亡し人の共にし帰る年なりば暮る行く今日は嬉しまし
02:001425 恋ふ間に年の暮るぬば亡し人の別るやいとど遠し成るぬむ

のようにします。

原表記を出力する

さてやっと原表記について説明できます。 まず先ほどのwaka_generate()関数の第2引数を’gen’(=原表記、出現形)にして、 出力してみましょう。ちなみに第2引数’gen’はデフォルトなので、 第1引数のdataだけでもよい。

>>> for i in waka_generate(data,'gen'):
>>>     print(i)
...(略)
02:001423 鳴く声にそひて涙はのぼらねど雲の上より雨と降るらん
02:001424 亡き人のともにし帰年ならば暮れゆく今日はうれしからまし
02:001425 恋ふる間に年の暮れなば亡き人の別やいとゞ遠くなりなん

もう一つ、標準表記(=kanji、漢字)でも出力してみましょう。

>>> for i in waka_generate(data,'kanji'):
>>>     print(i)
...(略)
02:001423 鳴く声に添ひて涙は昇らねど雲の上より雨と降るらむ
02:001424 亡き人の共にし帰る年ならば暮れ行く今日は嬉しからまし
02:001425 恋ふる間に年の暮れなば亡き人の別れやいとど遠く成りなむ

原表記(出現形)と標準表記

前の2種類の表記を3首ずつ見たところで、 原表記の問題点は見つかったでしょうか。

gen   02:001425 恋ふる間に年の暮れなば亡き人の別やいとゞ遠くなりなん
kanji 02:001425 恋ふる間に年の暮れなば亡き人の別れやいとど遠く成りなむ

比べてみると、結構難儀な問題を抱えていることが分かります。

ここまでのコマンドのまとめ (1-1)

正規表現で必要な和歌の範囲を指定する。

>>>  gosen1 = re.compile("^02:000001:.....[ACE]0[0-9]")

ファイルをオープンし、必要な和歌あるいは歌集をメモリに読み込む。

>>> database(gosen1)
>>> database
<function database at 0x9557b8c>

表記の種類を定義する。

>>> hyoki = {'id':0,'tag':1,'code':2,'pos':3,'gen':4,'kihon':5,'yomi':6,'kanji':7,'kana':8}

ここまでのコマンドのまとめ (1-2)

ジェネレート関数による個別和歌の出力

>>> i =waka_generate(data,'kanji')
>>> print(next(i))
02:000001 降る雪の蓑代衣打ち着つつ春来にけりと驚かれぬる

ジェネレート関数による一斉和歌の出力

>>> for i in waka_generate(data,'kanji'):
>>>     print(i)
...(略)
02:001423 鳴く声に添ひて涙は昇らねど雲の上より雨と降るらむ
02:001424 亡き人の共にし帰る年ならば暮れ行く今日は嬉しからまし
02:001425 恋ふる間に年の暮れなば亡き人の別れやいとど遠く成りなむ

関数を組み合わせてひとつづきの関数にする

ここまでで和歌のリストを出力することができましたが、 いくつかのコマンドを使ったり、関数を作ったりしながら、 最終的にリストを出力しました。 リストの出力が目的の時は、毎回ひとつひとつ入力するのは面倒です。 そこで、これらをまとめたものをさらに関数にしてみましょう。

def waka_list(x,y='gen',dem_a=' ',dem_b=''):
    wl = re.compile(x)
    data = database(wl)
    for i in waka_generate(data,y,dem_a,dem_b):
        print i

ひとつひとつのコマンドをうつと複雑なことをしているようですが、 前記のようにみると5行にまとめられてシンプルです。 また、インタラクティブモードでひとつひとつの関数は、 それぞれ正しく出力されることが、確認されていますから、 安心です。

実行してみましょう。

>>> for i in waka_list("^01:......:.....[ACE]0[0-9]"):
>>>     print i
...(略)
01:001109 山科のをとはの滝のをとにだに人のしるべくわがこひめやも
01:001110 わが背子が来べきよひ也さゝがにの蜘蛛の振る舞ふかねてしるしも
01:001111 道知らば摘みにもゆかむ住の江の岸に生ふとおっしゃる恋しわすれる草

’^01’は古今集のすべてを抽出します。

歌番号データをファイルに書き出す

ここまででシソーラスから和歌のさまざまなデータを作る方法について述べました。 ここまでのところのデータをファイルに保存すると便利かもしれません。

まず、waka_list関数は画面に出力する関数だったので、 それをgenerate関数書き換えます。 さきほどのwaka_list関数の最後のprintをyieldに変更します。 これで、リストを変数に格納できます。 これをwaka_yield関数としておきます。

def waka_yield(x,y='gen',dem_a=' ',dem_b=''):
    wl = re.compile(x)
    data = database(wl)
    for i in waka_generate(data,y,dem_a,dem_b):
        yield i

つぎにファイルに書き出してみます。

>>> waka = open('waka-kokin.txt','w')
>>> s = waka_yield("^01:......:.....[ACE]0[0-9]")
>>> waka.write('\n'.join(i for i in s))
>>> waka.flush()
>>> waka.close()

書き出したファイルの内容を確認する

では、waka-kokin.txtにデータが確かに書き込まれているか見てみましょう。

% less waka-kokin.txt
01:000001 年の内に春はきにけり一年を去年とやいはむこの年とやいはむ
01:000002 袖ひちてむすびし水のこほれるを春立けふの風やとくらむ
01:000003 春霞たてるやいづこみ吉野のよしのの山に雪はふりつゝ
...(略)
01:001109 山科のをとはの滝のをとにだに人のしるべくわがこひめやも
01:001110 わが背子が来べきよひ也さゝがにの蜘蛛の振る舞ふかねてしるしも
01:001111 道知らば摘みにもゆかむ住の江の岸に生ふとおっしゃる恋しわすれる草

全1,111首が書き込まれているのがわかります。 もし、途中で終わっていたら、 waka.flush()を忘れていないかどうか、 もう一度確かめて見てください。

語と意味コードの対応表を作る

語の情報量を計算する

二十一代集間を部立で比較する

二十一代集は古今集の部立を伝統的にほぼ踏襲しています。 そのおかげで、春なら春の歌を二十一代集に渡って、 比較し、春の語彙の変化を調べることができます。 単純計算ではありますが、約530年間の春のイメージの移り変わりを 見ることができるのは、とても便利なことです。 部立を踏襲してくれて、どうもありがとうと言いたくなるくらいです。

将来の計画と可能性

スマートフォンのカメラで書籍中のQRコードを読み取ると、 3Dの歌ことばネットワークが浮き出る仕組みとその基礎技術

免責事項

本研究に関する著作物について、 配布はGPL2とし、関連データ、プログラムにより発生した損害、 賠償については一切、山元には責任はないものとします。

この文章の作り方

この文章は、markdown 記法を用い、pandocで生成しました。 生成は、html5とslidyの二種類のテンプレートで行いました。 html5は Bor Hodošček 氏によるtwitter bootstrap cssをで行いました。 slidyはpandocのデフォルトで行いました。

% pandoc -S -s -t html5 --template=./bootstrap-template.html5 index.md -o index.html
% pandoc -S -s -t slidy index.md -o index.html

文献