y_uti のブログ

統計、機械学習、自然言語処理などに興味を持つエンジニアの技術ブログです

夏目漱石なランダム文生成

せっかくランダム文生成ができたので、コーパスを変えてもう少し遊んでみました。青空文庫から『吾輩は猫である』を使ってみようと思います。

$ wget http://www.aozora.gr.jp/cards/000148/files/789_14547.html

文字コードがシフト JIS なので変換しておきます。

$ iconv -f SHIFT_JIS -t UTF8 789_14547.html >789_14547_utf8.html

ファイルの中身をざっと眺めてみたところ ruby タグが使われています。次のようにすればよさそうです。

  • rb タグの中身が img の場合は外字なので捨てる。このときは rt タグの中身 (ひらがな) を生かす
  • rb タグの中身がテキストの場合は rb タグの中身を生かして残りを捨てる
  • その他のタグは全部捨ててしまう

こんな感じでしょうか。

cat $1 |\                                                # $1 が入力として
sed 's/<rp>[^<]*<\/rp>//g' |\                            # rp タグは不要なので捨てる
sed 's/<rb><img [^>]*><\/rb><rt>\([^<]*\)<\/rt>/\1/g' |\ # rb タグの中身が img の場合
sed 's/<rb>\([^<]*\)<\/rb><rt>[^<]*<\/rt>/\1/g' |\       # rb タグの中身がテキストの場合
sed 's/<[^>]*>//g' |\                                    # 残りの全タグを捨てる
grep -v '[<>]'                                           # <!DOCTYPE ...> を捨てる

あとは python で同じように。

>>> print ''.join(ngram.generate(100, ['吾輩', 'は']))
吾輩は元来地上の者ではない。こう先方の口上を真似ているのである。「どうも驚ろいたまあと、徐々上り込む。逃がすものか」「それ見たがその注意をしたのでありましたろう」と姉の面影を存しても別段主人の庭は竹垣の外がすぐ解釈して、すこぶる幽邃な梵刹です。年は四五遍繰り返したあとには白い湯でも朗読するの