BETA

青空文庫のテキストのクリーニングをした記録

投稿日:2018-12-29
最終更新:2018-12-31
  • 青空文庫の中のテキストデータを使って,簡易なコーパスを作る際に,ルビや注釈等を取り除く必要があります.一括で綺麗にしてくれるソフトもあるようなのですが,ターミナル上で簡単にテキスト処理できたらいいなと思い,sed等のコマンドを使って試してみました.いつもこの手の作業をする時,コマンドを忘れて調べないといけなくなるので,失敗例も含めて備忘録として残しておきます.今回は説明のために,夏目漱石のテキストから適当に抜粋して次のようなテキストデータTest.txtを用意しました.

十六

母がこう聞いた時、嫂は例の通り淋《さむ》しい靨《えくぼ》を寄せて、「妾《わたくし》はどうでも構いません」と答えた。それがおとなしいとも取れるし、また聴きようでは、冷淡とも無愛想とも取れた。それを自分は兄に対して気の毒と思い嫂に対しては損だと考えた。
二人は浴衣《ゆかた》がけで宿を出ると、すぐ昇降器へ乗った。箱は一間四方くらいのもので、中に五六人 | 這入《はい》ると戸を閉めて、すぐ引き上げられた。兄と自分は顔さえ出す事のできない鉄の棒の間から外を見た。そうして非常に欝陶《うっとう》しい感じを起した。
「牢屋見たいだな」と兄が低い声で私語《ささや》いた。

十七

そこは高い地勢のお蔭で四方ともよく見晴らされた。ことに有名な紀三井寺《きみいでら》を蓊欝《こんもり》した木立《こだち》の中に遠く望む事ができた。そうして地方訛《ちほうなまり》ののし[#「のし」に傍点]とかいう語尾をしきりに繰返した。

このテキストデータに対し,以下の四点の処理を施したいと考えています.(太字の部分の削除)
1)《 》と《 》中のふりがな削除
2)[# ]のような注意書きの削除
3) | (ルビの始まる文字の初めにつく記号)の削除
4) 何章目かを表す漢数字の行の削除

《 》と《 》中のふりがな削除

まず初めに
《》とその中の .* (任意の一文字の0回以上の繰り返し) も含めた
文字列を,// に置換(sコマンド)する.最後のgコマンドでマッチする全てのものが 置換されます.

sed 's/《.*》//g' Test.txt

としたところ,

十六

 母がこう聞いた時、嫂は例の通り淋はどうでも構いません」と答えた。それがおとなしいとも取れるし、また聴きようでは、冷淡とも無愛想とも取れた。それを自分は兄に対して気の毒と思い嫂に対しては損だと考えた。
 二人は浴衣しい感じを起した。
「牢屋見たいだな」と兄が低い声で私語いた。

        十七

 そこは高い地勢のお蔭で四方ともよく見晴らされた。ことに有名な紀三井寺ののし[#「のし」に傍点]とかいう語尾をしきりに繰返した。

《さむ》, 《えくぼ》, 《わたくし》のように最小単位での《》を削除したかったのですが,《さむ》しい靨《えくぼ》を寄せて、「妾《わたくし》の部分全てが削除されてしまいました.
正規表現は最長一致がデフォルトのようなので,最短一致の指定をする必要があるようです.
そこで,《》内の文字は, 》以外のときだけ置換する[^》]*という表現を助け加えました.

sed 's/《[^》]*》//g' Test.txt

十六

 母がこう聞いた時、嫂は例の通り淋しい靨を寄せて、「妾はどうでも構いません」と答えた。それがおとなしいとも取れるし、また聴きようでは、冷淡とも無愛想とも取れた。それを自分は兄に対して気の毒と思い嫂に対しては損だと考えた。
 二人は浴衣がけで宿を出ると、すぐ昇降器へ乗った。箱は一間四方くらいのもので、中に五六人|這入ると戸を閉めて、すぐ引き上げられた。兄と自分は顔さえ出す事のできない鉄の棒の間から外を見た。そうして非常に欝陶しい感じを起した。
「牢屋見たいだな」と兄が低い声で私語いた。

        十七

 そこは高い地勢のお蔭で四方ともよく見晴らされた。ことに有名な紀三井寺を蓊欝した木立の中に遠く望む事ができた。そうして地方訛ののし[#「のし」に傍点]とかいう語尾をしきりに繰返した。

今度成功してそうです.一度保存しておきます.
OSX のsedで上書き保存するには時は,-i オプションの後に拡張子を指定しておくことが必要のようです.

sed -i '.txt' 's/《[^》]*》//g' Test.txt

[# ]のような注意書きの削除

先ほどと同じ要領で,《》のかわりに[# ]がマッチするように記述します.半角,全角,スペース等が異なると,マッチングしなくなるので,気をつけます.私は何回か失敗しました.
sed -i '.txt' 's/[#[^]]*]//g' Test.txt

そうして地方訛ののしとかいう語尾をしきりに繰返した。

[12/31:以下のように修正]
他のテキストファイルで試してみたところ,上記のコマンドではうまくいきませんでしたので,以下のように単純にデリートするコマンドを使ったところ消去できました.

sed -i '.txt' '/[#[^]]*]/d' Test.txt

| (ルビの始まる文字の初めにつく記号)の削除

一文字の消去だけなので気が楽です.
sed -i '.txt' 's/|//g' Test.txt

、中に五六人這入ると戸を閉めて

何章目かを表す漢数字の行の削除

本文中の漢数字にはマッチングさせず,章の漢数字のみ削除したい.また,どれだけ長い章立ての小説でも,"三十六"や"九十九"や"百二"のように,使われている文字は三文字までということに注目し,(今回使用する小説に百以上の章はありませんでした)
行の中の文字が一文字から三文字のもののみ削除し,前後の空白行も取り除く.というマッチングの方法を考えました.

今回はgrepコマンドを使って,'^$'(空白で始まる行 )と,'^.\{1,3\}$' (一文字から三文字までの文字列の行)を除いた -v 文字列を出力させてみたところ,
grep -v -e '^$' -e '^.\{1,3\}$' Test.txt >> Kansei.txt

母がこう聞いた時、嫂は例の通り淋しい靨を寄せて、「妾はどうでも構いません」と答えた。それがおとなしいとも取れるし、また聴きようでは、冷淡とも無愛想とも取れた。それを自分は兄に対して気の毒と思い嫂に対しては損だと考えた。
二人は浴衣がけで宿を出ると、すぐ昇降器へ乗った。箱は一間四方くらいのもので、中に五六人這入ると戸を閉めて、すぐ引き上げられた。兄と自分は顔さえ出す事のできない鉄の棒の間から外を見た。そうして非常に欝陶しい感じを起した。
「牢屋見たいだな」と兄が低い声で私語いた。
そこは高い地勢のお蔭で四方ともよく見晴らされた。ことに有名な紀三井寺を蓊欝した木立の中に遠く望む事ができた。そうして地方訛ののしとかいう語尾をしきりに繰返した。

満足のいく結果が得られました.

[12/31:以下のように修正]
他のテキストファイルで試してみたところ,上記のコマンドではうまくいきませんでした.
grep -v '^\s*$' Test.txt 
空白がn回繰り返され, 空白で終わる (空白行の削除)

grep -v '^\s*.\{1,3\}\s*$' Test.txt >> Kansei.txt
空白がn回繰り返されたあと, 1文字から3文字分の文字列が来たあと,また空白がn回繰り返され空白で終わる

と書き直しました.

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

統計学 / 機械学習 / データ分析 /テキスト処理

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!