下のように長文になると、「之」に対応する「仮名」が見つけづらい。
そこで、指定した文字を含む句を取り出して、「原文」と「仮名」を表示するようにしたい。
天地之 <初時> 久堅之 天河原尓 八百萬 千萬神之... あめつちの はじめのとき ひさかたの あまのかはらに やほよろづ ちよろづかみの... ↓ 天地之:あめつちの 久堅之:ひさかたの 千萬神之:ちよろづかみの
句のデリミタは、「原文」、「仮名」とも半角スペースでよさそう。
角括弧で囲まれた部分は、原文と仮名の句数が一致しないケースがあるようなので、半角スペースを"::"に置き換え、ひとかたまりにする。
[一云 指上 日女之命] [さしのぼる ひるめのみこと] ↓ [一云::指上::日女之命] [さしのぼる::ひるめのみこと]
↓作ったプログラム
(more search_genbun.rb)
#!/usr/bin/env ruby require 'sqlite3' class String #[]で括られている部分を一つの塊にしたいので、 #デリミタ"::"で埋める #[a b c] → [a::b::c] def colonfill str = "" tail = self while tail =~ /^(.*?)(\[[^\]]*\])(.*)$/ do head = $1 body = $2 tail = $3 while body =~ /^(\[\S+)(\s+)(.*\])$/ do body = $1 + "::" + $3 end str = str + head + body end str = str + tail end end #main db = SQLite3::Database.new "manyoshu.db" sql = "select id, genbun, kana from leaves where genbun like '%#{ARGV[0]}%'" puts "SQL: #{sql}\n\n" db.execute(sql) do |row| #歌番号を出力する puts row[0] #原文からARGV[0]を含む句を抽出する genbun = row[1].colonfill.split(/\s+/) index = [] genbun.each_with_index do |ph, i| if ph =~ /#{ARGV[0]}/ index.push(i) end end #ARGV[0]を含む原文の句と、それに対応する仮名の句を出力する kana = row[2].colonfill.split(/\s+/) index.each do |i| printf("%s:%s\n", genbun[i].gsub(/#{ARGV[0]}/,"\033[36m#{ARGV[0]}\033[0m"), kana[i]) end puts end
実行する。
$ ./search_genbun.rb 之 SQL: select id, genbun, kana from leaves where genbun like '%之%' 01/0003 八隅知之:やすみしし 伊縁立之:いよりたたしし 梓弓之:あづさのゆみの 今他田渚良之:いまたたすらし <梓>弓之:あづさのゆみの ... ...
↓02/0167のところ
いい感じ。
デリミタ の位置が想定と違うと、ずれが生じる。
sqlite> select * from leaves where id='02/0091'; id = 02/0091 daishi = 近江大津宮御宇天皇代 [天命開別天皇 謚曰天智天皇] / 天皇賜鏡王女御歌一首 genbun = 妹之家毛 継而見麻思乎 山跡有 大嶋嶺尓 家母有猿尾 [一云 妹之當継而毛見武尓] [一云 家居麻之乎] kundoku = 妹が家も継ぎて見ましを大和なる大島の嶺に家もあらましを [一云 妹があたり継ぎても見むに] [一云 家居らましを] kana = いもがいへも つぎてみましを やまとなる おほしまのねに いへもあらましを [いもがあたり つぎてもみむに][いへをらましを] sachu = なし koui = なし jikou = 相聞 作者:天智天皇 鏡王女 見る 国見 異伝 贈答 歌垣 奈良 地名 kun_i = いもがいへも,[寛]いもかいへも,つぎてみましを,[寛]つきてみましを, やまとなる[寛], おほしまのねに,[寛]おほしまみねに, いへもあらましを[寛], [いもがあたり, つぎてもみむに], [いへをらましを],
「原文」には、「[一云 妹之當継而毛見武尓] [一云 家居麻之乎]」の間に半角スペースがあるが、「仮名」の方は
「[いもがあたり つぎてもみむに][いへをらましを]」がつながっているので、以下の実行結果では、[一云::家居麻之乎]
に対する仮名の句がない。
02/0091 妹之家毛:いもがいへも [一云::妹之當継而毛見武尓]:[いもがあたり::つぎてもみむに][いへをらましを] [一云::家居麻之乎]: