君が袖振る(3)

下のように長文になると、「之」に対応する「仮名」が見つけづらい。

f:id:tigerii:20191026230113p:plain



そこで、指定した文字を含む句を取り出して、「原文」と「仮名」を表示するようにしたい。

天地之 <初時> 久堅之 天河原尓 八百萬 千萬神之...
あめつちの はじめのとき ひさかたの あまのかはらに やほよろづ ちよろづかみの...
↓
天地之:あめつちの
久堅之:ひさかたの
千萬神之:ちよろづかみの

句のデリミタは、「原文」、「仮名」とも半角スペースでよさそう。
角括弧で囲まれた部分は、原文と仮名の句数が一致しないケースがあるようなので、半角スペースを"::"に置き換え、ひとかたまりにする。

[一云 指上 日女之命]
[さしのぼる ひるめのみこと]
↓
[一云::指上::日女之命]
[さしのぼる::ひるめのみこと]


↓作ったプログラム
(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のところ
f:id:tigerii:20191027001222p:plain
いい感じ。


デリミタ の位置が想定と違うと、ずれが生じる。

sqlite> select * from leaves where id='02/0091';
     id = 02/0091
 daishi = 近江大津宮御宇天皇代 [天命開別天皇 謚曰天智天皇] / 天皇賜鏡王女御歌一首
 genbun = 妹之家毛 継而見麻思乎 山跡有 大嶋嶺尓 家母有猿尾 [一云 妹之當継而毛見武尓] [一云 家居麻之乎]
kundoku = 妹が家も継ぎて見ましを大和なる大島の嶺に家もあらましを [一云 妹があたり継ぎても見むに] [一云 家居らましを]
   kana = いもがいへも つぎてみましを やまとなる おほしまのねに いへもあらましを [いもがあたり つぎてもみむに][いへをらましを]
  sachu = なし
   koui = なし
  jikou = 相聞 作者:天智天皇 鏡王女 見る 国見 異伝 贈答 歌垣 奈良 地名
  kun_i = いもがいへも,[寛]いもかいへも,つぎてみましを,[寛]つきてみましを,
やまとなる[寛],
おほしまのねに,[寛]おほしまみねに,
いへもあらましを[寛],
[いもがあたり,
つぎてもみむに],
[いへをらましを],

「原文」には、「[一云 妹之當継而毛見武尓] [一云 家居麻之乎]」の間に半角スペースがあるが、「仮名」の方は
「[いもがあたり つぎてもみむに][いへをらましを]」がつながっているので、以下の実行結果では、[一云::家居麻之乎]
に対する仮名の句がない。

02/0091
妹之家毛:いもがいへも
[一云::妹之當継而毛見武尓]:[いもがあたり::つぎてもみむに][いへをらましを]
[一云::家居麻之乎]: