Wikipedia 日本語版の記事から見つかった偶然 5・7・5・7・7 になっている文章をツイートする, 偶然短歌botというものがあります. twitter.com inaniwa3.hatenablog.com
これと同じように, Wikipedia 日本語版の記事から偶然できている回文を見つけてみたというものです.
偶然できた回文を見つけるというものは, 朝日新聞の15年分の記事について調べたものが以下にあります. ci.nii.ac.jp
手法
上記の偶然短歌botについての記事で説明されている方法を参考にしました.
まず, Wikipedia のダンプ から jawiki-latest-pages-articles.xml.bz2 (9月3日の版) をダウンロードし (2GB ちょっとある), WP2TXT を用いてテキストファイルに展開しました. github.com
続いて MeCab + ipadic を用いて文章を形態素解析しました (これ系のスクリプトってなんか Ruby か R でやってるのが多いイメージがあるのですが, 残念ながら私は JavaScript しか書けないので Node.js でやりました).
MeCab のバインディングは mecab-async を使用しました. github.com
そんなこんなでできた回文判定モジュールがこれ, github.com
Wikipedia の記事から回文を抽出するのがこれです. github.com
回文の判定は MeCab の出力から文章らしいといえる部分を取り出して, 読みを濁音・半濁音・拗音・促音を清音と同一として判定しています. 詳しくは上記の回文判定のリポジトリにあるソースを読んでください.
また, 新聞記事についての論文 (+ 適当な文章で少し試した結果と, たぶん指数関数的に減っていくだろうという予想) によると, 5音 (例えば「出しました。」のような) 以下のものがかなり多くなるようなので, とりあえず5音以上のみを記録して, 4音以下は無視するようにしました. あまり短くても面白く無いしね.
後は先ほどのテキストファイル全部に対して処理を回すだけです (23時間かかった).
結果
5音以上の回文は 94871 個見つかりました. 見つかった全回文はここにあります (タブ区切りで回文, 音数, 記事タイトル, 抽出元のファイル名).
音数の頻度分布はこんな感じになっていて, 予想通り5音がずば抜けて多いです (全体の約96%). あと, 音数が少ないところでは偶数よりも奇数の方が多くなるようです. これは多分「父の父」「夫婦は夫婦」みたいなものが多いためだと思います.
また, 音数が多くなるにつれ, 当然ですが狙って作られた回文が多くなってきます. 「偶然出来た回文」を探しているので, これにはあまり興味はないのですが, 一個一個手作業で除くのも面倒なのでとりあえず含めてあります.
また, 回文判定の段階で極力文章らしいものを選ぶようにしましたが, それでも不自然な文章 (?) がかなり残ってしまいました.
最長のものは, (これは含めていいのか迷うところですが,)
ぃぃぃぃぃいぃいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい
(竹安佐和記 - Wikipedia, 40音) でした. 音数が多いところにはこういった叫び声のような何かが大量に含まれてしまっています.
まともな文章になっているものでは, これは狙って回文として作られたものですが,
なかきよのとおのねふりのなふめさめふなのりふねのおとのよきかな
(Prolog - Wikipedia など, 31音) でした.
おそらく偶然回文になっているものとして最長のものは,
本店が旗艦店舗
(八重洲ブックセンター - Wikipedia, 11音) だと思われます.
その他にもいくつか面白いものはあったので, そのうち bot でも作って垂れ流そうと思います. なにぶんノイズが多いので, ある程度厳選したほうが良い気がしますが.
感想
たのしかったです.
Wikipedia の記事をテキストファイルに展開するのはいいのですが, そのフォーマットが結構雑で, 記事タイトルと文中のリンクやファイル埋め込みの形式が同じなため, 何回か記事タイトルの抽出が上手くできていないのに気付かずに途中まで進めてしまって, しばらくして気付いてやり直すということを繰り返したため, 無駄に時間がかかりました. 同じようなことを試す場合にはご注意ください.
あと, 上で挙げたような叫び声の類や, 例えば「多角形」や「依り代」などが正しく読めず, 誤って回文として検出されているものが多々ありました. 叫び声に関してはかなり難しそうですが, 読みに関しては, 今回辞書として ipadic を使いましたが, もう少し Wikipedia に使われている語彙 (といっても範囲が広すぎる気がするけれど) に合う辞書を使ったほうがいいように思いました.