PythonとJuman++で分かち書きをするよ
どうも、この前導入した新しい形態素解析器のJuman++ですが、マニュアルを見る限り、どうやら単体では分かち書きを出力できるようにはなっていないようです。というわけで、今回はJuman++とPythonを用いて分かち書きを行うプログラムを書いたので、ここで載っけておこうと思います。
本来ならGitHubとかにのせるべきなんでしょうが、デフォルトで分かち書きができるとかだととても恥ずかしいのでひっそりとここだけで完結しておきます。
プログラムの実行した準備として、Python3が動く環境とJuman++とpythonラッパーのインストールをよろしくお願いします。
OS : Ubuntu 16.04 LTS
Python : 3.5.2
Juman++ : 1.01
1. 書いたコード
今回書いたコードは以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#coding:utf-8 import argparse from pyknp import Jumanpp # 実行引数の受け取り parser = argparse.ArgumentParser(description="Juman++で分かち書きを行うためのスクリプトです") parser.add_argument('input', type=str, help="入力ファイルへのPath(必須)") parser.add_argument('-o', '--output', type=str, default="./out.txt", help="出力ファイルへのPath(Default:out.txt)") parser.add_argument('-t', '--target', type=str, nargs='+', default=[], help="出力する品詞(Default:ALL)") parser.add_argument('-e', '--exclusion', type=str, nargs='+', default=["未定義語","特殊"], help="解析時に除外する品詞(Default:未定義語,特殊)") parser.add_argument('-s', '--splitchar', type=str, default=' ', help="分かち書きを行う際に各形態素の間に挿入される文字です(Default:Space)") args = parser.parse_args() # 入力ファイルと出力ファイルの準備 in_file = open(args.input) out_file = open(args.output, 'w') # Juman++のインスタンス作成 juman = Jumanpp() # 解析開始 for line in in_file: text = '' result = juman.analysis(line) # 一行毎に解析 for m in result.mrph_list(): # 解析対象の品詞か確認して出力に追加 if (not len(args.target) or m.hinsi in args.target) and m.hinsi not in args.exclusion: text += str(m.midasi) + args.splitchar # 解析した行に形態素があれば出力ファイルに記述 if text is not '': out_file.write(text + "\n") |
単純に分かち書きを行うならもう少しシンプルにかけますが、今回は対象とする品詞を制限する機能を付けたかったので、少しだけ長くなっています。
2. 使い方
では、次に使い方ですが、そこまで長いものではないので、読み飛ばしても大丈夫だと思います。
説明の都合上、ここでは上記のコードを「main.py」というファイルに記述しているとします。また、分かち書きにしたい元の文章が書かれているテキストファイルを「input.txt」とします。この条件では、以下のコマンドで分かち書きを実行することができます。
1 |
$ python3 main.py input.txt |
これで、プログラムが走ります。出力結果はデフォルトなら「out.txt」に記述されているはずです。
このコードでは、実行引数を持たせることで、解析対象とする品詞を限定することができます。限定するための引数は”-t”と”-e”で指定することができます。”-t”では、対象とする品詞を選べます(何も指定しなければすべての品詞が対象)。また、”-e”では対象外にする品詞を選べます(デフォルトでは”未定義語”と”特殊”を対象外にしている)。つまり、このどちらも引数に持たせない場合だと、(なかなか気持ち悪い仕様ではありますが、)未定義語と特殊の品詞をもつ形態素は出力から除外されるということです。以下にいくつか実行例を載せておきます。
1 2 3 4 5 6 |
$# 対象品詞を"名詞"と"動詞"に絞る場合 $ python3 main.py input.txt -t 名詞 動詞 $# 対象外品詞に助詞も入れる場合 $ python3 main.py input.txt -e 未定義語 特殊 助詞 $# "未知語"と"特殊"も解析対象にする場合 $ python3 main.py input.txt -e "" |
上記の実行引数以外に、出力ファイルのパスを変更する”-o”(デフォルトでは、”./out.txt”)と、分かち書きをする際に形態素の間に挿入される文字の変更ができる”-s”(デフォルトでは半角スペース)を用意しました。必要に合わせて使ってください。
おわりに
さて、今回はJumann++を使った分かち書きコードを載せました。別に難しいことは全くしていないので、上記のような残念コードではなく、自分にあうように自作してみればいいと思います。
「JUMAN++ – KUROHASHI-KAWAHARA LAB」