juman++を利用して分かち書き
ひとまずの目標がrnnlmを作ってみることなので、その準備として日本語の文書を渡してそれを形態素ごとに区切って出力するやつを作っておきたいです。
環境を汚したくないのでdocker内にjuman++をインストールします
FROM ubuntu:17.10 RUN apt-get update RUN apt-get install -y git wget build-essential libboost-all-dev RUN wget http://lotus.kuee.kyoto-u.ac.jp/nl-resource/jumanpp/jumanpp-1.02.tar.xz RUN tar Jxf jumanpp-1.02.tar.xz RUN cd jumanpp-1.02 && ./configure && make && make install
これは
docker build . -t jumanpp
みたいな感じでイメージを作成できます
イメージを作成したら
docker run -d -it --name jumanpp-container jumanpp
みたいな感じでコンテナを起動しておきます
すると
$ echo "吾輩は猫である。" | docker exec -i jumanpp-container jumanpp 吾輩 わがはい 吾輩 名詞 6 普通名詞 1 * 0 * 0 "代表表記:我が輩/わがはい カテゴリ:人" は は は 助詞 9 副助詞 2 * 0 * 0 NIL 猫 ねこ 猫 名詞 6 普通名詞 1 * 0 * 0 "代表表記:猫/ねこ 漢字読み:訓 カテゴリ:動物" である である だ 判定詞 4 * 0 判定詞 25 デアル列基本形 15 NIL 。 。 。 特殊 1 句点 1 * 0 * 0 NIL EOS
みたいな感じで実行できます。
やりたいのは分かち書きなので、適当にシェルを書きます
#!/bin/bash for line in $(cat -) do echo "$line" | docker exec -i jumanpp-container jumanpp | while read output do if [ "${output}" != "EOS" ]; then word=$(echo ${output} | cut -d " " -f 1) if [ "${word}" != "@" ]; then result="${result} ${word}" fi else echo $result fi done done
これをwakachi.shとか名前をつけて保存しておきます。
吾輩は猫である。 名前はまだ無い。 どこで生まれたかとんと見当がつかぬ。
みたいなファイルをテストのために用意しました
$ cat test.txt | ./wakachi.sh 吾輩 は 猫 である 。 名前 は まだ 無い 。 どこ で 生まれた か とんと 見当 が つか ぬ 。
こんな感じで出力できました。