04b.ゑひもせすん番外「インカの串歌」

「04.ゑひもせすん」で、文書内のひらがな使用頻度が「い、ん、か、し」順に多いと書きました。Web で見た数字ですが、自分のお話はどうだろうとプログラムを作って調べることにしました。

使うのは「夜道」。普通の文体で、特に会話が多くもなく、言葉遣いも普通なので適切かと判断しました。

 夜道 >>

Word の一ページ分くらいのテキストを測定する手順を考えます。

1.計測には Excel VBAVisual Basic for Application)を使う
プログラムとしては、配列に「あいうえお」とお話本文を格納し、それぞれの要素を一つずつ比較して「あいうえお」順に出現回数を加算すればいい。Excel を使うのは Excel の表を配列の代わりにすれば、メモリ内に展開される配列データを目で見える形に残せるからです。

・Sheet2 の A 列に「あかさたなはまやらわ」五十音を書き込みます。「ぃ」「っ」などの即音便や、「ば、ぱ」などの濁音半濁音「がざだばぱ」も入れました。全 75 字。
・Sheet1 の A 列にお話の本文を書き込みます。全てひらがなにして、縦一列にします。動作テストのために、「あいうういうきあ」のように文字が重複するダミーデータを書き込みました。
・Sheet2 の「あいうえお」を順に、Sheet1 のお話本文に出現する回数を計測し、Sheet2 のひらがなの隣のセルに書き込みます。「あ」「17」、「い」「79」のように並んで行きます。これを最後まで繰り返し、「あいうえお」と出現回数の列をコピーして少し離れたところにペースト。ここで出現回数をキーにして多い順に並べ変えます。

■プログラムはこちら(使い捨てなので簡単でエラーチェックもなし)

Sub letterCount()
Const HIRAGANA = 75
Const MOJISU = 1067
Dim i, j As Integer
Dim str As String

 For i = 1 To HIRAGANA
  str = Worksheets(2).Cells(i, 1).Value
  For j = 1 To MOJISU
   If Worksheets(1).Cells(j, 1).Value = str Then
    Worksheets(2).Cells(i, 2).Value = Worksheets(2).Cells(i, 2).Value + 1
   End If
  Next j
 Next i
End Sub

問題なく動作しました。
さて、次の問題はお話本文をひらがなにし、縦一列のテキストにすることです。

2.漢字を全てひらがなに変換する
原稿をひらがなで入力し直しは避けたい、と考えていて思い出しました。Word では確定している漢字を選択して、スペースバーか変換キーを押すと、変換候補のプルダウンが表示されて再変換出来るのです(他社のエディタなどでは出来ません)。マイクロソフトの製品だから IMEAPI を叩いているのでしょうか、変換中と同じ状態になるのでエスケープキーを押せばひらがなのまま。入力し直しよりは遥かに楽です。暇な時に、順番に漢字部分を選択してひらがなに戻しました。
次に、「」『』、。改行、空白など記号を検索/置換で全部削除します。計測対象に入れていないので削除しなくてもいいのですが、計測結果の合計文字数とお話全体の文字数がずれるので、後で悩まなくていいように削除。1,125 文字が 1,067 文字になりました。

よみちかんそくじょをでるのがおそくなってしまったいつもはもっとはやくおわるのだがめずらしくたいようふれあによるきょだいなでんぱばーすとげんしょうがおきていたのででーたをちぇっくしていたらこんなじかんになってしまったのだ…

3.全文をひらがな縦一字ずつの文書にする
Excel の A 列に入れてチェックするので、お話が縦一列のテキストファイルになっていなければなりません。5,000 字のお話なら一行一文字で 5,000 行。一字ごとにリターンキーを押すのは面倒だ。Excel VBA でテキストファイルを読み込んで、一文字ずつ取り出すことも考えましたが、プログラムが長くなりそうでこれも面倒だ。
スクリプト系言語、PerlRubyPython はこの手の作業が得意なことを思い出しました。でも、Perl は止めよう。Perl のコードは暗号のようになるので、自分で書いて一週間後に読めなくなったことがあります。文法を思い出すのも面倒なので Ruby にしよう。大昔インストールしたままだし、Ruby なら国産だから日本語の扱いも大丈夫だろうと安易に考えました。
インターネットで「Ruby テキストファイル読み込み 一文字」などで検索して、サンプルコードを見つけました。イテレータって言ったっけ。こんなに簡単でいいの? って感じ。早速、読み込んで表示するだけのコードを書いて実行すると文字化けです。RubyUTF-8 だっけ。Shift-JIS だからかな。手元の Ruby はバージョン 1.8.7。最新は 2.4。他のサイトを見ると、1.9 より以前では文字コードを明示的に指定してやらないといけないらしい。んでもってそのコードを追加して試しました。文字化けもせず、ひらがなのテキストファイルを読み込んで表示出来ました。
次に一文字ずつ読み込んで表示するコードを追加。ファイルへの書き出しはリダイレクトを使う。
■プログラムはこちら(LCread.rb)

#! ruby -Ks
# -*- mode:ruby; coding:shift_jis -*-
$KCODE='s'
require 'jcode'

 f = File.open("LCsample.txt")
  f.each_char{|c|
  p c

リダイレクトして

C:\kusuda>ruby LCread.rb > LCtate.txt

「LCtate.txt」見事縦一列のお話ファイルが出来ました。

"よ"
"み"
"ち"
"か"
"ん"
"そ"

「"あ"」のように一文字ずつクォーテーションが付いてますが、これはExcel にインポートすれば勝手に削除してくれるはずです。

4.実行結果
縦一列のテキストファイルを Excel に読み込んで実行しました。対象のお話文字数 1,067、ひらがなの出現回数チェックでは、次のようになりました。

い(71)、ん(49)、か(44)、の(41)、く(39)、し(39)、う(38)、た(37)

「インカの串歌」です。言葉になっているのが凄い。
「い、ん、か、し」とは違いますが、これはデータの量が 1,067 文字と頼りないせいでしょう。長編全文 100,000 文字とかを計測したらそうなると思われます。

ところが!
気付いたのは濁音半濁音。ひらがなの出現頻度を計測しているので、濁音半濁音は別にしています。しかし、使う文字として「で」とか「だ」の出現頻度は高いはず。
ならばと、「で --> て」「だ --> た」「ば、ぱ --> は」など、濁点の付かないかなに集約する形で再集計してみました。発音的には「で」と「て」は全く違うだろうけど日本人としては仲間に思えるのでいいかと。

か(72)、い(71)、し(62)、て(58)、た(56)、ん(49)、の(41)

「解して嘆野」。「い、ん、か、し」と全然違う。でも「い」が健闘して上位を維持しています。

f:id:kusuda_fumihito:20170719130639j:plain

 

「夜道」冒頭の濁音半濁音集約式ひらがな出現回数計測順です(空白は勝手に挿入)。何となく意味がありそうでないところが怖い。暗号に使えるかも。

「かいしてたんの くうとつは まよおなきこに そをちあす もやえ けせゆほ さわふみ めひむね」