君が袖振る(1)

[訓読]あかねさす紫野行き標野行き野守は見ずや君が袖振る
[原文]茜草指 武良前野逝 標野行 野守者不見哉 君之袖布流

額田王の歌の「君が袖振る」の原文が「君之袖布流」となっていて「之」って「が」なの?ということが気になった。


まず、以下の手順で、万葉集のDBを作る。

1.WIKISOURCE(https://ja.wikisource.org/wiki/万葉集)から、テキストを取り出す。
2.取り出したテキストを、xmlに変換する。
3.xmlにしたデータを、DBのテーブルに挿入する。




1.WIKISOURCE(https://ja.wikisource.org/wiki/万葉集)から、テキストを取り出す。

(get_manyoshu.rb)

#!/usr/bin/env ruby

require 'uri'
require 'open-uri'
require 'nokogiri'

#doc = Nokogiri.HTML(open(URI.escape('https://ja.wikisource.org/wiki/万葉集/第一巻')))
#
#doc.css('p').each do |element|
#  puts element.text
#end

VOLUMES=['第一巻','第二巻','第三巻','第四巻','第五巻',
         '第六巻','第七巻','第八巻','第九巻','第十巻',
         '第十一巻','第十二巻','第十三巻','第十四巻','第十五巻',
         '第十六巻','第十七巻','第十八巻','第十九巻','第二十巻']

for vol in VOLUMES do
  doc = Nokogiri.HTML(open(URI.escape('https://ja.wikisource.org/wiki/万葉集/' + vol)))
  doc.css('p').each do |element|
    puts element.text
  end
end


実行する

$ ./get_manyoshu.rb > manyoshu.txt
$ more manyoshu.txt 
第二巻 →
万葉集 第一巻
第一巻

[歌番号]01/0001
[題詞]雜歌 / 泊瀬朝倉宮御宇天皇代 [<大>泊瀬稚武天皇] / 天皇御製歌
[原文]篭毛與 美篭母乳 布久思毛與 美夫君志持 此岳尓 菜採須兒 家吉閑名 告<紗>根 虚見津 山跡乃國者 押奈戸手 吾許曽居 師<吉>名倍手 吾己曽座 我<許>背
齒 告目 家呼毛名雄母
[訓読]篭もよ み篭持ち 堀串もよ み堀串持ち この岡に 菜摘ます子 家聞かな 告らさね そらみつ 大和の国は おしなべて 我れこそ居れ しきなべて 我れこそ座
せ 我れこそば 告らめ 家をも名をも
[仮名]こもよ みこもち ふくしもよ みぶくしもち このをかに なつますこ いへきかな のらさね そらみつ やまとのくには おしなべて われこそをれ しきなべ
て われこそませ われこそば のらめ いへをもなをも
[左注]なし
[校異]雑歌 [元][紀] <> / 太 -> 大 [紀][冷][文] / 吉 [玉小琴](塙)(楓) 告 /沙 -> 紗 [元][類][冷] / 告 -> 吉 [玉小琴] / 許者 -> 許 [元][類][古]
[事項]雑歌 作者:雄略天皇 朝倉宮 野遊び 演劇 妻問媿 予祝 枕詞 地名 奈良
[訓異]こもよ[寛],
みこもち[寛],
ふくしもよ[寛],
みぶくしもち,[寛]みふくしもち,
このをかに[寛],
なつますこ,[寛]なつむすこ,
いへきかな[寛],
のらさね,[寛]つけさね,
そらみつ[寛],
やまとのくには[寛],
おしなべて,[寛]おしなへて,
われこそをれ,[寛]われこそをらし,
しきなべて,[寛]つけなへて,
われこそませ[略],[寛]われこそをらし,
われこそば,[寛]われこそは,
のらめ,[寛]せなにはつけめ,
いへをもなをも[寛],

[歌番号]01/0002
[題詞]高市岡本宮御宇天皇代 [息長足日廣額天皇] / 天皇登香具山望國之時御製歌
[原文]山常庭 村山有等 取與呂布 天乃香具山 騰立 國見乎為者 國原波 煙立龍 海原波 加萬目立多都 怜A國曽 蜻嶋 八間跡能國者
[訓読]大和には 群山あれど とりよろふ 天の香具山 登り立ち 国見をすれば 国原は 煙立ち立つ 海原は 鴎立ち立つ うまし国ぞ 蜻蛉島 大和の国は
...


2.取り出したテキストを、xmlに変換する。

取り出したテキストを、以下のようなフォーマットに変換したい。

<万葉集>
<歌>
  <歌番号>01/0001</歌番号>
  <題詞>雜歌 / 泊瀬朝倉宮御宇天皇代 [&lt;大&gt;泊瀬稚武天皇] / 天皇御製歌</題詞>
  <原文>篭毛與 美篭母乳 布久思毛與 美夫君志持 此岳尓 菜採須兒 家吉閑名 告&lt;紗&gt;根 虚見津 山跡乃國者 押奈戸手 吾許曽居 師&lt;吉&gt;名倍手 吾己曽座 我&lt;許&gt;背齒 告目 家呼毛名雄母</原文>
  <訓読>篭もよ み篭持ち 堀串もよ み堀串持ち この岡に 菜摘ます子 家聞かな 告らさね そらみつ 大和の国は おしなべて 我れこそ居れ しきなべて 我れこそ座せ 我れこそば 告らめ 家をも名をも</訓読>
  <仮名>こもよ みこもち ふくしもよ みぶくしもち このをかに なつますこ いへきかな のらさね そらみつ やまとのくには おしなべて われこそをれ しきなべて われこそませ われこそば のらめ いへをもなをも</仮名>
  <左注>なし</左注>
  <校異>雑歌 [元][紀] &lt;&gt; / 太 -&gt; 大 [紀][冷][文] / 吉 [玉小琴](塙)(楓) 告 /沙 -&gt; 紗 [元][類][冷] / 告 -&gt; 吉 [玉小琴] / 許者 -&gt; 許 [元][類][古]</校異>
  <事項>雑歌 作者:雄略天皇 朝倉宮 野遊び 演劇 妻問媿 予祝 枕詞 地名 奈良</事項>
  <訓異>こもよ[寛],みこもち[寛],
ふくしもよ[寛],
みぶくしもち,[寛]みふくしもち,
このをかに[寛],
なつますこ,[寛]なつむすこ,
いへきかな[寛],
のらさね,[寛]つけさね,
そらみつ[寛],
やまとのくには[寛],
おしなべて,[寛]おしなへて,
われこそをれ,[寛]われこそをらし,
しきなべて,[寛]つけなへて,
われこそませ[略],[寛]われこそをらし,
われこそば,[寛]われこそは,
のらめ,[寛]せなにはつけめ,
いへをもなをも[寛],
</訓異>
</歌>
<歌>
  <歌番号>01/0002</歌番号>
  <題詞>高市岡本宮御宇天皇代 [息長足日廣額天皇] / 天皇登香具山望國之時御製歌</題詞>
  <原文>山常庭 村山有等 取與呂布 天乃香具山 騰立 國見乎為者 國原波 煙立龍 海原波 加萬目立多都 怜A國曽 蜻嶋 八間跡能國者</原文>
  <訓読>大和には 群山あれど とりよろふ 天の香具山 登り立ち 国見をすれば 国原は 煙立ち立つ 海原は 鴎立ち立つ うまし国ぞ 蜻蛉島 大和の国は</訓読>
  <仮名>やまとには むらやまあれど とりよろふ あめのかぐやま のぼりたち くにみをすれば くにはらは けぶりたちたつ うなはらは かまめたちたつ うましくにぞ あきづしま やまとのくには</仮名>
  <左注>なし</左注>
  <校異>なし</校異>
  <事項>雑歌 作者:舒明天皇 飛鳥 国見 予祝 枕詞 地名 動物 奈良 土地讃美 寿歌</事項>
  <訓異>やまとには[寛],むらやまあれど,[寛]むらやまあれと,
とりよろふ[寛],
あめのかぐやま,[寛]あまのかくやま,
のぼりたち,[寛]のほりたち,
くにみをすれば,[寛]くにみをすれは,
くにはらは[寛],
けぶりたちたつ,[寛]けふりたちたつ,
うなはらは[寛],
かまめたちたつ[寛],
うましくにぞ,[寛]おもしろきくにそ,
あきづしま,[寛]あきつしま,
やまとのくには[寛],
</訓異>
</歌>
...
</万葉集>


以下のプログラムでxmlに変換する。
(manyotxt2xml.rb)

#!/usr/bin/env ruby

status = ""
print "<万葉集>\n"
STDIN.each do |line|
  line.chomp!
  line.gsub!(/[<>&"]/,
            "<" => "&lt;", ">" => "&gt;", "&" => "&amp;", '"' => "&quot;")
  if /^\[歌番号\](.*)$/ =~ line
    if status != ""
      print "</#{status}>\n"
      print "</歌>\n"
    end
    print "<歌>\n"
    print "  <歌番号>#{$1}"
    status = "歌番号"
  elsif /^\[題詞\](.*)$/ =~ line
    print "</#{status}>\n"
    print "  <題詞>#{$1}"
    status = "題詞"
  elsif /^\[原文\](.*)$/ =~ line 
    print "</#{status}>\n"
    print "  <原文>#{$1}"
    status = "原文"
  elsif /^\[訓読\](.*)$/ =~ line
    print "</#{status}>\n"
    print "  <訓読>#{$1}"
    status = "訓読"
  elsif /^\[仮名\](.*)$/ =~ line
    print "</#{status}>\n"
    print "  <仮名>#{$1}"
    status = "仮名"
  elsif /^\[左注\](.*)$/ =~ line 
    print "</#{status}>\n"
    print "  <左注>#{$1}"
    status = "左注"
  elsif /^\[校異\](.*)$/ =~ line 
    print "</#{status}>\n"
    print "  <校異>#{$1}"
    status = "校異"
  elsif /^\[事項\](.*)$/ =~ line 
    print "</#{status}>\n"
    print "  <事項>#{$1}"
    status = "事項"
  elsif /^\[訓異\](.*)$/ =~ line 
    print "</#{status}>\n"
    print "  <訓異>#{$1}"
    status = "訓異"
  elsif /^(.+)$/ =~ line && status != ""
    print "#{$1}\n"
  elsif /^$/ =~ line && status != "" 
    #print "</#{status}>\n"
  else
    #print "unexpected line!\n"
  end
end
print "</#{status}>\n"
print "</歌>\n"
print "</万葉集>\n"


最初は、歌と歌とを区切るデリミタ を「空行」としていたが、以下のデータがあったので、デリミタ を「[歌番号]」に変更した。

[歌番号]06/1027
[題詞](秋八月廿日宴右大臣橘家歌四首)
[原文]橘 本尓道履 八衢尓 物乎曽念 人尓不所知
[訓読]橘の本に道踏む八衢に物をぞ思ふ人に知らえず
[仮名]たちばなの もとにみちふむ やちまたに ものをぞおもふ ひとにしらえず
[左注]右一首右大辨高<橋>安麻呂卿語云 故豊嶋采女之作也 但或本云三方沙弥戀妻苑臣作歌也 然則豊嶋采女當時當所口吟此歌歟
[校異]橘 -> 橋 [西(訂正)][元][類][紀] / 歌 [西] 謌 [西(訂正)] 歌 / 此歌 [西] 此謌 [西(訂正)] 此歌
[事項]雑歌 作者:豊島采女 三方沙弥 伝誦 高橋安麻呂 宴席 古歌 植物 鬱屈 天平11年8月20日 年紀

[訓異]たちばなの,[寛]たちはなの,
もとにみちふむ[寛],
やちまたに[寛],
ものをぞおもふ,[寛]ものをりおもふ,
ひとにしらえず,[寛]ひとにしられぬ,

[歌番号]06/1028
[題詞]十一年己卯 天皇遊猟高圓野之時小獣<泄>走<都>里之中 於是適値勇士生而見獲即以此獣獻上御在所<副>歌一首 [獣名俗曰牟射
佐妣]


以下のコマンドで、xmlファイルを作成する。

$ cat manyoshu.txt | ./manyotxt2xml.rb > manyoshu.xml


3.xmlにしたデータを、DBのテーブルに挿入する。

xmlパーサを使用して、<歌>のノードを順番にたどって、子ノード(<歌番号>, <題詞>, ...)のコンテンツを表示してみる。

まずREXMLを試したが、<歌>を取り出した後に、そこから子ノードを抽出する方法がわからず断念する。

次に、nokogiriを使ってみた。

(parse_manyo_nokogiri.rb)

#!/usr/bin/env ruby
require 'nokogiri'

File.open(ARGV[0], 'r') do |f|
  doc = Nokogiri::XML(f)
  doc.xpath('/万葉集/歌').each do |leave|
    puts leave.xpath('歌番号').text
    puts leave.xpath('題詞').text
    puts leave.xpath('原文').text
    puts leave.xpath('訓読').text
    puts leave.xpath('仮名').text
    puts leave.xpath('左注').text
    puts leave.xpath('校異').text
    puts leave.xpath('事項').text
    puts leave.xpath('訓異').text
    puts '--'
  end
end


実行してみる

$ ./parse_manyo_nokogiri.rb manyoshu.xml | more
01/0001
雜歌 / 泊瀬朝倉宮御宇天皇代 [<大>泊瀬稚武天皇] / 天皇御製歌
篭毛與 美篭母乳 布久思毛與 美夫君志持 此岳尓 菜採須兒 家吉閑名 告<紗>根 虚見津 山跡乃國者 押奈戸手 吾許曽居 師<吉>名倍手 吾己曽座 我<許>背齒 告目 家呼毛名雄母
篭もよ み篭持ち 堀串もよ み堀串持ち この岡に 菜摘ます子 家聞かな 告らさね そらみつ 大和の国は おしなべて 我れこそ居れ しきなべて 我れこそ座せ 我れこそば 告らめ 家をも名をも
こもよ みこもち ふくしもよ みぶくしもち このをかに なつますこ いへきかな のらさね そらみつ やまとのくには おしなべて われこそをれ しきなべて われこそませ われこそば のらめ いへをもなをも
なし
雑歌 [元][紀] <> / 太 -> 大 [紀][冷][文] / 吉 [玉小琴](塙)(楓) 告 /沙 -> 紗 [元][類][冷] / 告 -> 吉 [玉小琴] / 許者 -> 許 [元][類][古]
雑歌 作者:雄略天皇 朝倉宮 野遊び 演劇 妻問媿 予祝 枕詞 地名 奈良
こもよ[寛],みこもち[寛],
ふくしもよ[寛],
みぶくしもち,[寛]みふくしもち,
このをかに[寛],
なつますこ,[寛]なつむすこ,
いへきかな[寛],
のらさね,[寛]つけさね,
そらみつ[寛],
やまとのくには[寛],
おしなべて,[寛]おしなへて,
われこそをれ,[寛]われこそをらし,
しきなべて,[寛]つけなへて,
われこそませ[略],[寛]われこそをらし,
われこそば,[寛]われこそは,
のらめ,[寛]せなにはつけめ,
いへをもなをも[寛],
--
01/0002
高市岡本宮御宇天皇代 [息長足日廣額天皇] / 天皇登香具山望國之時御製歌
山常庭 村山有等 取與呂布 天乃香具山 騰立 國見乎為者 國原波 煙立龍 海原波 加萬目立多都 怜A國曽 蜻嶋 八間跡能國者
大和には 群山あれど とりよろふ 天の香具山 登り立ち 国見をすれば 国原は 煙立ち立つ 海原は 鴎立ち立つ うまし国ぞ 蜻蛉島 大和の国は
...

いい感じだ。


また、こんな書き方もできるみたい。
(parse_manyo_nokoslop.rb)

#!/usr/bin/env ruby
require 'nokogiri'

doc = Nokogiri::Slop(open(ARGV[0]).read)
doc.万葉集.歌.each do |leave|
  puts leave.歌番号.text
  puts leave.題詞.text
  puts leave.原文.text
  puts leave.訓読.text
  puts leave.仮名.text
  puts leave.左注.text
  puts leave.校異.text
  puts leave.事項.text
  puts leave.訓異.text
  puts '--'
end


xmlのデータをsqliteに入れる。

(make_manyoshu_db.rb)

#!/usr/bin/env ruby
require 'nokogiri'
require 'sqlite3'

db = SQLite3::Database.new "manyoshu.db" 

# Create a table
rows = db.execute <<-SQL
  create table leaves(
    id varchar,
    daishi text,
    genbun text,
    kundoku text,
    kana text,
    sachu text,
    koui text,
    jikou text,
    kun_i text
  );
SQL

File.open(ARGV[0], 'r') do |f|
  doc = Nokogiri::XML(f)
  doc.xpath('/万葉集/歌').each do |leave|
    puts leave.xpath('歌番号').text
    db.execute("INSERT INTO leaves
                ( id,
                  daishi,
                  genbun,
                  kundoku,
                  kana,
                  sachu,
                  koui,
                  jikou,
                  kun_i)
                  VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )",
                [ leave.xpath('歌番号').text,
                  leave.xpath('題詞').text,
                  leave.xpath('原文').text,
                  leave.xpath('訓読').text,
                  leave.xpath('仮名').text,
                  leave.xpath('左注').text,
                  leave.xpath('校異').text,
                  leave.xpath('事項').text,
                  leave.xpath('訓異').text] )
  end
end


DBを作成する。

$ ./make_manyoshu_db.rb manyoshu.xml 
01/0001
01/0002
01/0003
01/0004
01/0005
01/0006
01/0007
01/0008
01/0009
01/0010
...
20/4512
20/4513
20/4514
20/4515
20/4516


テーブルを見る。

$ sqlite3 manyoshu.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .mode line
sqlite> select * from leaves where id='01/0001';
     id = 01/0001
 daishi = 雜歌 / 泊瀬朝倉宮御宇天皇代 [<大>泊瀬稚武天皇] / 天皇御製歌
 genbun = 篭毛與 美篭母乳 布久思毛與 美夫君志持 此岳尓 菜採須兒 家吉閑名 告<紗>根 虚見津 山跡乃國者 押奈戸手 吾許曽居 師<吉>名倍手 吾己曽座 我<許>背齒 告目 家呼毛名雄母
kundoku = 篭もよ み篭持ち 堀串もよ み堀串持ち この岡に 菜摘ます子 家聞かな 告らさね そらみつ 大和の国は おしなべて 我れこそ居れ しきなべて 我れこそ座せ 我れこそば 告らめ 家をも名をも
   kana = こもよ みこもち ふくしもよ みぶくしもち このをかに なつますこ いへきかな のらさね そらみつ やまとのくには おしなべて われこそをれ しきなべて われこそませ われこそば のらめ いへをもなをも
  sachu = なし
   koui = 雑歌 [元][紀] <> / 太 -> 大 [紀][冷][文] / 吉 [玉小琴](塙)(楓) 告 /沙 -> 紗 [元][類][冷] / 告 -> 吉 [玉小琴] / 許者 -> 許 [元][類][古]
  jikou = 雑歌 作者:雄略天皇 朝倉宮 野遊び 演劇 妻問媿 予祝 枕詞 地名 奈良
  kun_i = こもよ[寛],みこもち[寛],
ふくしもよ[寛],
みぶくしもち,[寛]みふくしもち,
このをかに[寛],
なつますこ,[寛]なつむすこ,
いへきかな[寛],
のらさね,[寛]つけさね,
そらみつ[寛],
やまとのくには[寛],
おしなべて,[寛]おしなへて,
われこそをれ,[寛]われこそをらし,
しきなべて,[寛]つけなへて,
われこそませ[略],[寛]われこそをらし,
われこそば,[寛]われこそは,
のらめ,[寛]せなにはつけめ,
いへをもなをも[寛],

sqlite> select * from leaves where id='01/0020';
     id = 01/0020
 daishi = 天皇遊猟蒲生野時額田王作歌
 genbun = 茜草指 武良前野逝 標野行 野守者不見哉 君之袖布流
kundoku = あかねさす紫野行き標野行き野守は見ずや君が袖振る
   kana = あかねさす むらさきのゆき しめのゆき のもりはみずや きみがそでふる
  sachu = (紀曰 天皇七年丁卯夏五月五日縦猟於蒲生野 于時<大>皇弟諸王内臣及群臣 皆悉従焉)
   koui = なし
  jikou = 雑歌 作者:額田王 滋賀 野遊び 求婚 宴席 枕詞 植物
  kun_i = あかねさす[寛],むらさきのゆき[寛],
しめのゆき[寛],
のもりはみずや,[寛]のもりはみすや,
きみがそでふる,[寛]きみかそてふる,

sqlite>