自分のBlogにおける「ひらがなの出現頻度」を、パソコンを使って調べてみよう!(kanji2na+morogram編、244万文字頻度付き)

(未来:大規模N-gramデータが公開されていた……改正著作権法の施行後に公開されたものらしく、作者提示の利用条件で安心して使えるところも◎。 - 雑記/えもじならべあそび)
(未来:452万文字分の、はてなダイアリー日記内かな連接頻度データ。 - 雑記/えもじならべあそび)
(未言及:Excite Bit コネタ「あいうえおかきくけこ……」一番使われているひらがなはどれ?)
(過去:kakasiとmorogramとその他。)
(参考: http://ash.jp/code/codetbl1.htm )
(参考: http://ash.jp/code/codetbl2.htm )
(未来:「雑記/えもじならべあそび」における、全2,440,461文字についての1〜3文字連接頻度、表計算ドキュメント版。)

 動作は未検証(読み返しによる検証のみを行った状態)のため、部分的に間違っているかもしれません。

 ……さすがに同記事へと3回もトラバするのはどうかと思ったので、今のところこれはストップしています。


 元記事の調査では「ある程度のサンプル」に対して「手作業で漢字→かな変換」を行っていたようで。
 それに対して、ここでは「膨大なサンプル」に対して「MS-IMEの逆変換機能を使って漢字→かな変換」を行う方法を説明します。
 以下の方法を使う場合、変換精度はMS-IMEの逆変換精度そのものとなりますので、手作業で変換処理を行う場合に比べて、変換精度はある程度劣化します。
 (今のところ、kakasiMeCabよりは、若干マシな変換精度が期待できるようです。)


 とりあえず、手順を書いていきます。
 同じ事を繰り返し書いているところもあります……が、とりあえずはそのままにしておきます。

 注)ここから途中までは、「新字新かな文章をつかって作る、かな下し正かな」のためのn-gramを作るためには、使用しません。
 別途記事(後に公開予定)に従って操作してください。

作業用のフォルダを作成します。

  • 画面左下の「スタート」ボタンを右クリックして、「エクスプローラ」を選択し起動します。
  • (C:)ドライブのアイコンを選択し、右側にCドライブ・ルートの中身を表示させます。
  • 右側の何もない場所で右クリックし、「新規作成(W)→フォルダ(F)」とたどります。
  • フォルダ名はひとまず、半角英小文字で【n-gram】とします。
  • (C:)ドライブのフォルダ【n-gram】アイコンを選択し、右側にCドライブ【n-gram】の中身を表示させます。
    • 以降、何度となくこのフォルダの中身を表示させるための操作を指示しています……ので、そのまま開きっぱなしにしておく方が楽だと思います。

自身が書いているBlogのログをダウンロードする。

  • ここは、各ブログの「ヘルプ」などを参考に、記事やコメント類がひとまとめになった「ログ」をダウンロードしてください。
  • このとき、ログにつけるファイル名は、とりあえず【c:\n-gram\export.src】にしておいてください。

Blogログの「文字コード」を、Shift-JISに変換する。

  • (メモ)jgawk.exeの都合でShift-JISかEUCしか選択肢がないため、ここではShift-JISに統一することにします。
  • サクラエディタ」を起動して、【c:\n-gram\export.src】を開く。
    • 表示されている文字が化けていた場合、Altメニューの「ファイル→文字コードセット(H)」の中から、うまく表示されるものを選ぶ。
      • こういう場合、たいていは「UTF-8」か「EUC」を選ぶと正常に表示される。
  • 文字が化けなくなったら、全体を「Ctrlを押しながらA」を押して選択し、「Ctrlを押しながらC」を押して全文をコピーする。
  • いったん、サクラエディタを終了する。
  • もう一回「サクラエディタ」を開いて、そのまま「Ctrlを押しながらV」を押して、全文を貼り付ける。
  • その状態で、【c:\n-gram\export.sjs】という名前を付けて保存する。
    • 保存するときには、ファイル名を入れる場所の下にある「文字コードセット(C)」には【SJIS】を選択し、「改行コード(E)」には【CR+LF】を選択すること。
  • この状態で、たぶん【c:\n-gram\export.sjs】というファイルは「Shift-JIS化されたBlogログ」が入っているはずです。

 注)ここまでは、「新字新かな文章をつかって作る、かな下し正かな」のためのn-gramを作るためには、使用しません。
 別途記事(後に公開予定)に従って操作してください。

Blogログの中から、半角の英数字や記号類を削除する。

  • (メモ)これらの文字を除去しないと、「漢字→かな」変換中に止まってしまうことがあります……。
  • 「jgawk」というツールをダウンロードしてから、lhaplusなどを用いてファイルアーカイブを解きます。
  • 画面左下の「スタート」ボタンを右クリックして、「エクスプローラ」を選択し起動します。
  • (C:)ドライブのフォルダ【n-gram】アイコンを選択し、右側にCドライブ【n-gram】の中身を表示させます。
  • 解いたフォルダ「jgawk」の中に入っているファイルを、すべて【c:\n-gram】にコピーします。
  • 右側の何もない場所で右クリックし、「新規作成(W)→テキスト ドキュメント」とたどります。
  • ファイル名はひとまず、半角英小文字で【sjs2nas.bat】とします。拡張子を変更するかどうかを問われるので、OKを押します。
  • 【sjs2nas.bat】を右クリックして「編集(E)」を選択します。
  • 以下の内容を、出てきた【sjs2nas.bat】のメモ帳にコピーします。
c:
cd \n-gram
type export.sjs | jgawk '{gsub(/[!-~]/,"")}{print $0}' > export.nas
  • メモ帳を閉じます。保存するかどうかを聞かれたらOKを選択します。
  • ファイル【sjs2nas.bat】を右クリックして、「開く(O)」を選択します。
  • この状態で、たぶん【c:\n-gram\export.nas】というファイルは「半角英数と半角記号が除去されたBlogログ」が入っているはずです。

漢字をひらがなに変換する。

  • 「Kanji2na」をダウンロードし、Lhaplusなどでアーカイブを解きます。
  • Kanji2naを起動し、Altメニューの「ファイル(F)→開く(O)」とたどり、ファイル【c:\n-gram\export.nas】を選択します。
  • Kanji2naの右上方にある【ふ】というボタンを押して、全文の漢字をひらがなに変換します。処理は数十秒〜数分かかります。
    • このときの「漢字→ひらがな」変換精度はMS-IMEに依存します。
      • 2010年10月11日0:42:47追記:もとのテキストが300万かな相当分(c:\n-gram\export.nasが、だいたい6MBサイズ)を超えている場合、このあとの作業は(保存作業を含めて)kanji2kanaで行えないため、右ウィンドウに出ているかなをCtrl-Aで選択しCtrl-Cでコピーして、サクラエディタに貼り付けしてください。サクラエディタでも、Ctrl-F10操作で「カタカナ→ひらがな」変換は可能です。
  • Kanji2naの右上方にある【か】というボタンを押して、全文のカタカナをひらがなに変換します。処理は数秒〜数十秒で終わるはずです。
  • 変換が終わったら、Kanji2naでとりあえずファイル名【c:\n-gram\export.hir】として保存します。

【c:\n-gram\export.hir】の中から、解析のじゃまになる文字を削除する。

  • 画面左下の「スタート」ボタンを右クリックして、「エクスプローラ」を選択し起動します。
  • (C:)ドライブのフォルダ【n-gram】アイコンを選択し、右側にCドライブ【n-gram】の中身を表示させます。
  • 右側の何もない場所で右クリックし、「新規作成(W)→テキスト ドキュメント」とたどります。
  • ファイル名はひとまず、半角英小文字で【hir2kna.bat】とします。拡張子を変更するかどうかを問われるので、OKを押します。
  • 【hir2kna.bat】を右クリックして「編集(E)」を選択します。
  • 以下の内容を、出てきた【hir2kna.bat】のメモ帳にコピーします。
c:
cd \n-gram
cls
@echo process 1/7 o.......
type export.hir | jgawk '{gsub(/[!-~]/,"")}{print $0}' > export.na1
cls
@echo process 2/7 oo......
type export.na1 | jgawk '{gsub(/[。-゚]/,"")}{print $0}' > export.na2
cls
@echo process 3/7 ooo.....
type export.na2 | jgawk '{gsub(/[:;‐/\‖|]/,"")}{print $0}' > export.na1
cls
@echo process 4/7 oooo....
type export.na1 | jgawk '{gsub(/[゛-〇]/,"")}{print $0}' > export.na2
cls
@echo process 5/7 ooooo...
type export.na2 | jgawk '{gsub(/[‥-@]/,"")}{print $0}' > export.na1
cls
@echo process 6/7 oooooo..
type export.na1 | jgawk '{gsub(/[@-z]/,"")}{print $0}' > export.na2
cls
@echo process 7/7 ooooooo.
type export.na2 | jgawk '{gsub(/[ァ-熙]/,"")}{print $0}' > export.kna
del export.na2
del export.na1
  • メモ帳を閉じます。保存するかどうかを聞かれたらOKを選択します。
  • ファイル【hir2kna.bat】を右クリックして、「開く(O)」を選択します。処理は数十秒×7回なので、数分かかるはずです。
  • この状態で、たぶん【c:\n-gram\export.kna】というファイルは「ひらがなとごく一部の記号のみの内容」が入っているはずです。

 注)新字新かなのテキストを処理しているときは、そのまま次に進んでください。
   新字正かなのテキストを処理した場合は、次に進む前に、サクラエディタで「export.kna」を開いてから、次の置換処理を行ってください(kanji2na経由で使うMS-IMEが、条件によっては「ゐ」の再変換に失敗して、以下の誤変換が大量に残る場合があります……)。

検索ワード 置換ワード
しょゐ かゐ
おもうゐ おもゐ
いただきゐ いただゐ

morogramを使って集計します。

  • 「morogram」をダウンロードして、lhaplusなどでアーカイブを解きます。
  • 画面左下の「スタート」ボタンを右クリックして、「エクスプローラ」を選択し起動します。
  • (C:)ドライブのフォルダ【n-gram】アイコンを選択し、右側にCドライブ【n-gram】の中身を表示させます。
  • 解いたフォルダ「morogram」の中に入っているファイルを、すべて【c:\n-gram】にコピーします。
  • 画面左下の「スタート」ボタンを右クリックして、「エクスプローラ」を選択し起動します。
  • (C:)ドライブのフォルダ【n-gram】アイコンを選択し、右側にCドライブ【n-gram】の中身を表示させます。
  • 右側の何もない場所で右クリックし、「新規作成(W)→テキスト ドキュメント」とたどります。
  • ファイル名はひとまず、半角英小文字で【kna2gram.bat】とします。拡張子を変更するかどうかを問われるので、OKを押します。
  • 【kna2gram.bat】を右クリックして「編集(E)」を選択します。
  • 以下の内容を、出てきた【kna2gram.bat】のメモ帳にコピーします。
    • その際、先にアーカイブを解いた中にある「morogram-なんとかかんとかxCJKT.exe」というファイル名が、下記と同一かどうか確認してください。もしも異なる場合は、下からコピーした後で、【該当部分をファイル名に一致するよう修正してから】メモ帳を保存する必要があります。
c:
cd \n-gram
REM  ↓↓↓【morogram-○○○○○○CJKT.exe】は、アーカイブ内にあるファイル名へと変更してください。
morogram-0.7.1xCJKT.exe --g=1,1 --I=sjis --O=sjis export.kna > k1-gram.txt
morogram-0.7.1xCJKT.exe --g=2,2 --I=sjis --O=sjis export.kna > k2-gram.txt
morogram-0.7.1xCJKT.exe --g=3,3 --I=sjis --O=sjis export.kna > k3-gram.txt
REM  ↑↑↑【morogram-○○○○○○CJKT.exe】は、アーカイブ内にあるファイル名へと変更してください。
REM  ※おそらく、数字の部分がこの例とは異なっているはずです。
  • メモ帳を閉じます。保存するかどうかを聞かれたらOKを選択します。
  • ファイル【kna2gram.bat】を右クリックして、「開く(O)」を選択します。
    • ここでの処理は、「驚くほど長い時間」がかかります。ひらがなのファイル5MB(Shift-JISの全角文字なので250万文字)を集計する場合、一番はじめの「ひらがなの1文字出現頻度」を解析するだけでも数十分数時間(@Pentium4-2.80GHz)かかります。
  • この状態で、たぶん【c:\n-gram\k1-gram.txt】というファイルは「ひらがなの1文字出現頻度」が入っているはずです。
  • この状態で、たぶん【c:\n-gram\k2-gram.txt】というファイルは「ひらがなの2文字連接頻度」が入っているはずです。
  • この状態で、たぶん【c:\n-gram\k3-gram.txt】というファイルは「ひらがなの3文字連接頻度」が入っているはずです。

表計算ソフトなどを使って、適当に並べ替えするなどします。

  • 表計算ソフトをお持ちでない方は、OpenOffice.orgをダウンロードしてください。
  • 時間があれば、この下にうちでの結果を貼ることができるかもしれません。

2007年6月4日18:07:21追記。

 1文字のひらがな出現頻度(MS-IME依存)を、うちの日記から抽出した全2,440,461文字から集計した結果が出ました。
 (もっとも、一部「ひらがな」じゃないものも混じっていますけど……。)


 ちなみに、「ひらがなの1文字出現頻度」だけを集計するために費やした、morogramでの処理時間は、2時間25分33秒でした。
 さすがに2文字〜3文字の連接頻度がでるまで待つのは面倒なので、今日は1文字出現頻度だけで取りやめることにします。
 その結果を、表計算ソフトで並べ替えたものを掲示します。

順位 かな 出現回数 出現頻度 出現回数累計 出現頻度累計
1 146278 5.994% 146278 5.994%
2 121425 4.975% 267703 10.969%
3 109615 4.492% 377318 15.461%
4 92790 3.802% 470108 19.263%
5 88350 3.620% 558458 22.883%
6 81606 3.344% 640064 26.227%
7 66030 2.706% 706094 28.933%
8 64256 2.633% 770350 31.566%
9 61190 2.507% 831540 34.073%
10 60009 2.459% 891549 36.532%
11 57355 2.350% 948904 38.882%
12 56913 2.332% 1005817 41.214%
13 55981 2.294% 1061798 43.508%
14 55558 2.277% 1117356 45.785%
15 55358 2.268% 1172714 48.053%
16 54136 2.218% 1226850 50.271%
17 45345 1.858% 1272195 52.129%
18 45239 1.854% 1317434 53.983%
19 43231 1.771% 1360665 55.754%
20 42344 1.735% 1403009 57.490%
21 40868 1.675% 1443877 59.164%
22 40742 1.669% 1484619 60.834%
23 40391 1.655% 1525010 62.489%
24 40182 1.646% 1565192 64.135%
25 39944 1.637% 1605136 65.772%
26 39910 1.635% 1645046 67.407%
27 38431 1.575% 1683477 68.982%
28 37089 1.520% 1720566 70.502%
29 34310 1.406% 1754876 71.908%
30 30795 1.262% 1785671 73.169%
31 29994 1.229% 1815665 74.398%
32 29857 1.223% 1845522 75.622%
33 29253 1.199% 1874775 76.821%
34 29225 1.198% 1904000 78.018%
35 26218 1.074% 1930218 79.092%
36 25925 1.062% 1956143 80.155%
37 24984 1.024% 1981127 81.178%
38 24625 1.009% 2005752 82.187%
39 23553 0.965% 2029305 83.153%
40 23101 0.947% 2052406 84.099%
41 21129 0.866% 2073535 84.965%
42 20654 0.846% 2094189 85.811%
43 20194 0.827% 2114383 86.639%
44 20131 0.825% 2134514 87.464%
45 18628 0.763% 2153142 88.227%
46 17564 0.720% 2170706 88.947%
47 16895 0.692% 2187601 89.639%
48 15318 0.628% 2202919 90.267%
49 14793 0.606% 2217712 90.873%
50 14762 0.605% 2232474 91.478%
51 14693 0.602% 2247167 92.080%
52 13748 0.563% 2260915 92.643%
53 13398 0.549% 2274313 93.192%
54 12702 0.520% 2287015 93.712%
55 11171 0.458% 2298186 94.170%
56 9691 0.397% 2307877 94.567%
57 9608 0.394% 2317485 94.961%
58 9278 0.380% 2326763 95.341%
59 8352 0.342% 2335115 95.683%
60 7380 0.302% 2342495 95.986%
61 7326 0.300% 2349821 96.286%
62 7025 0.288% 2356846 96.574%
63 7015 0.287% 2363861 96.861%
64 6119 0.251% 2369980 97.112%
65 6101 0.250% 2376081 97.362%
66 5624 0.230% 2381705 97.592%
67 5604 0.230% 2387309 97.822%
68 5163 0.212% 2392472 98.034%
69 4800 0.197% 2397272 98.230%
70 4569 0.187% 2401841 98.418%
71 3787 0.155% 2405628 98.573%
72 3675 0.151% 2409303 98.723%
73 3133 0.128% 2412436 98.852%
74 2890 0.118% 2415326 98.970%
75 2538 0.104% 2417864 99.074%
76 2311 0.095% 2420175 99.169%
77 2247 0.092% 2422422 99.261%
78 2156 0.088% 2424578 99.349%
79 2032 0.083% 2426610 99.432%
80 2008 0.082% 2428618 99.515%
81 1817 0.074% 2430435 99.589%
82 1789 0.073% 2432224 99.662%
83 1698 0.070% 2433922 99.732%
84 1576 0.065% 2435498 99.797%
85 1373 0.056% 2436871 99.853%
86 1111 0.046% 2437982 99.898%
87 846 0.035% 2438828 99.933%
88 541 0.022% 2439369 99.955%
89 519 0.021% 2439888 99.977%
90 310 0.013% 2440198 99.989%
91 127 0.005% 2440325 99.994%
92 48 0.002% 2440373 99.996%
93 44 0.002% 2440417 99.998%
94 42 0.002% 2440459 100.000%
95 ? 2 0.000% 2440461 100.000%

(2007年6月5日12:17:48追記:表に「順位・累計出現回数・累計出現頻度」を追加しました)

2007年7月8日12:20:30追記。

 【c:\n-gram\k3-gram.txt】の中は9万行ほどのリストになっており、そのまま表計算ソフトでは扱えない*1という大きな問題があります。
 そこで、【c:\n-gram\k3-gram.txt】を分割して、表計算ソフトで扱いやすいレベルに分割してみたいと思います。
 ただ分割すると後の処理が厄介なので、ここでは「3文字連接の2文字目が同じもの同士を、一つのファイルに抽出する」方法をとることにします。
 こうすることにより、「あるかなの前と後に付く文字」という視点で抽出できるので、日本語入力法の設計時や検証時に役立つかもしれませんので。

  • 画面左下の「スタート」ボタンを右クリックして、「エクスプローラ」を選択し起動します。
  • (C:)ドライブのフォルダ【n-gram】アイコンを選択し、右側にCドライブ【n-gram】の中身を表示させます。
  • 右側の何もない場所で右クリックし、「新規作成(W)→テキスト ドキュメント」とたどります。
  • ファイル名はひとまず、半角英小文字で【div3gram.bat】とします。拡張子を変更するかどうかを問われるので、OKを押します。
  • 【div3gram.bat】を右クリックして「編集(E)」を選択します。
  • 以下の内容を、出てきた【div3gram.bat】のメモ帳にコピーします。
c:
cd \n-gram
rem ↓で下位フォルダを製作します。
md div3gram
rem ↓ではすべて、下位フォルダに結果のファイルを出力します。
for %%f in (い う ん か し と て の な た) do jgawk 'BEGIN { FS = "\t"; OFS = "\t" } ;/\t.%%f.\t/{print $0}' k3-gram.txt > div3gram\k3-gram-%%f.txt
for %%f in (は に き で す く る 、 が ま) do jgawk 'BEGIN { FS = "\t"; OFS = "\t" } ;/\t.%%f.\t/{print $0}' k3-gram.txt > div3gram\k3-gram-%%f.txt
for %%f in (も こ っ じ つ り 。 ょ れ を) do jgawk 'BEGIN { FS = "\t"; OFS = "\t" } ;/\t.%%f.\t/{print $0}' k3-gram.txt > div3gram\k3-gram-%%f.txt
for %%f in (ー お だ あ ら け さ よ ゅ ど) do jgawk 'BEGIN { FS = "\t"; OFS = "\t" } ;/\t.%%f.\t/{print $0}' k3-gram.txt > div3gram\k3-gram-%%f.txt
for %%f in (ち … せ そ え み ひ め ほ ふ) do jgawk 'BEGIN { FS = "\t"; OFS = "\t" } ;/\t.%%f.\t/{print $0}' k3-gram.txt > div3gram\k3-gram-%%f.txt
for %%f in (わ ば ろ や ゆ ぶ び ぎ ず ね) do jgawk 'BEGIN { FS = "\t"; OFS = "\t" } ;/\t.%%f.\t/{print $0}' k3-gram.txt > div3gram\k3-gram-%%f.txt
for %%f in (ご ゃ む へ げ ぼ ・ べ ぷ ぜ) do jgawk 'BEGIN { FS = "\t"; OFS = "\t" } ;/\t.%%f.\t/{print $0}' k3-gram.txt > div3gram\k3-gram-%%f.txt
for %%f in (ざ ぐ ぱ ぞ づ ? ぴ ぽ ぁ ぇ) do jgawk 'BEGIN { FS = "\t"; OFS = "\t" } ;/\t.%%f.\t/{print $0}' k3-gram.txt > div3gram\k3-gram-%%f.txt
for %%f in (ぺ ぃ ! ぉ 〜 , ぬ ぢ ぅ .) do jgawk 'BEGIN { FS = "\t"; OFS = "\t" } ;/\t.%%f.\t/{print $0}' k3-gram.txt > div3gram\k3-gram-%%f.txt
  • メモ帳を閉じます。保存するかどうかを聞かれたらOKを選択します。
  • ファイル【div3gram.bat】を右クリックして、「開く(O)」を選択します。
  • このバッチファイルでは「div3gram」というフォルダを下位に生成し、そこに全ての結果を収容するため、ファイルはすべて【c:\n-gram\div3gram】の中にあります。
    • 【c:\n-gram】のなかにはフォルダ【div3gram】が生成されるだけなので、実行後はフォルダ【div3gram】の中身をチェックしてください。
  • フォルダ【div3gram】の中に生成されるファイル名は【k3-gram-※ひらがな※.txt】というファイルになっています。
    • ※ひらがな※の部分には、替わりに文字が1文字入っていて、そのファイルには「※ひらがな※が2文字目に来る3字連接頻度」のみが収容されることになります。
    • ファイルは90個作られるので、驚かないでください……。

2007年7月30日3:23:10追記。

 うちの日記で上記処理を行った結果を、表計算ドキュメントの形で公開しています。
 →【「雑記/えもじならべあそび」における、全2,440,461文字についての1〜3文字連接頻度、表計算ドキュメント版。
 サンプルがかなり偏っているので、実際に役立つかどうかは不明ですが……「数時間かけて処理する暇なんて無いよ!」という方や、あるいは「偏っていても構わないから、大体の傾向を見てみたい」という方には、おそらく役立つものになると思われます。

*1:たいていは3万行なり6万行なりといった行数制限がある