あいうabc ▲これを、こうしたい▼ あ い う a b c
自然言語処理をやっていると、テキストファイルの中に含まれている「文字」を1つ1つ列挙したくなることが時折ある。Linuxコマンドを使ってサクッとできないものかと思い、「1文字ごと 改行」などのキーワードで調べてみた。しかし、見つかる記事はどれも、バイト数を指定して改行するもので、半角英数字にのみにしか対応していないものばかりだった。もちろん、2 バイトごとに改行すれば2バイト文字である日本語も改行できる。しかし、それでは日本語と英字が混ざったテキストにはうまく適用できないという問題がある。
半角全角に関係なく1文字ごとに改行する方法
結論から言うと、これがベストだ、
nkf -f1-0
nkfコマンドの"-f"オプションを利用する。指定したバイト数で改行してくれるオプションだが、2バイト文字もうまく処理してくれる。上述のコマンドは1バイト(ただし2バイト文字は2バイトで)改行するという意味だ。
-f1-0
の末尾の -0
はマージンと呼ばれるものだ。
通常、英語の文は単語途中で改行しないという決まりがある。nkfは、この決まりを守って改行してくれる。うまり、指定したバイト数で厳密には改行されず、何文字か余分にカウントされる。この余分な文字を「何文字まで許容するか」が、マージンの意味するところである。ちなみに、デフォルトではマージンは10だ。
nkf -f30 hamlet.txt The nights are wholesome; then no planets strike, No fairy takes, nor witch hath power to charm, So hallow'd and so gracious is the time.
このマージンを"0"と指定すれば、強制的に指定バイト数で改行させることができる。つまり、1文字で強制的に改行したい場合は
nkf -f1-0
となる。しかも嬉しいことに、2バイト文字の場合はうまく2バイト分で改行してくれる。
サンプルを使って試してみよう。
cat input ABCDEあいうえXYZ 今日も1日かんばるzoi 空行もあるよ!
nkf -f1-0 input A B C D E あ い う え X Y Z 今 日 も 1 日 か ん ば る z o i 空 行 も あ る よ !
うまく1文字で改行されている。
空行を削除したいときはこうだ。
nkf -f1-0 input | grep -v "^$" A B C D E あ い う え X Y Z 今 日 も 1 日 か ん ば る z o i 空 行 も あ る よ !
ユニーク(被りが無いよう)にするときはこうだ。
nkf -f1-0 input | grep -v "^$" | sort -u ! 1 A B C D E X Y Z i o z あ い う え か ば も よ る ん 空 行 今 日
nkfがlinuxにインストールされていない場合は、以下のようにしてインストールすることができる。(例はUbuntuの場合)
sudo apt-get install nkf
以上。