GiNZAとは
「GiNZA」は、ワンステップでの導入、高速・高精度な解析処理、単語依存構造解析レベルの国際化対応などの特長を備えた日本語自然言語処理オープンソースライブラリです。
https://www.recruit.co.jp/newsroom/2019/0402_18331.html
リクルートの研究機関が開発した日本語用の自然言語処理ライブラリ。
spacyを利用して形態素解析を簡単に実施することができる。
目的
運用手順書とか、開発手順書とかを機械学習させて、手順確認レビューを簡素化したい。
文章を機械学習させるためには形態素解析が必須なので、その部分をGiNZAにて実施したい。
インストール方法
公式サイト参照
GiNZAパッケージのインストール
$ pip install "https://github.com/megagonlabs/ginza/releases/download/v1.0.2/ja_ginza_nopn-1.0.2.tgz"
pipでインストールできるのでそれを利用すると簡単。
自動的にspacy-2.1.3もインストールされる。
ちなみにspacyの最新版は2.1.4だが、GiNZAが2.1.3にしか対応していないため注意。
すでにscacy-2.1.4が入っている場合はこれをインストールすると勝手にダウングレードされる。
動作確認
$ python -m spacy.lang.ja_ginza.cli
正しくインストールされた場合、以上のコマンドで対話型で形態素解析が可能。
以下例
$ python -m spacy.lang.ja_ginza.cli Loading model 'ja_ginza_nopn' mode is C disabling sentence separator 依存構造解析の実験を行っています。 text = 依存構造解析の実験を行っています。 1 依存 依存 NOUN 名詞-普通名詞-サ変可能 _ 3 compound _ SpaceAfter=No|NP_B 2 構造 構造 NOUN 名詞-普通名詞-一般 _ 3 compound _ SpaceAfter=No|NP_I 3 解析 解析 NOUN 名詞-普通名詞-サ変可能 _ 5 nmod _ SpaceAfter=No|NP_I 4 の の ADP 助詞-格助詞 _ 3 case _ SpaceAfter=No 5 実験 実験 NOUN 名詞-普通名詞-サ変可能 _ 7 obj _ SpaceAfter=No|NP_B 6 を を ADP 助詞-格助詞 _ 5 case _ SpaceAfter=No 7 行っ 行う VERB 動詞-一般 _ 0 root _ SpaceAfter=No 8 て て SCONJ 助詞-接続助詞 _ 7 mark _ SpaceAfter=No 9 い 居る AUX 動詞-非自立可能 _ 7 aux _ SpaceAfter=No 10 ます ます AUX 助動詞 _ 7 aux _ SpaceAfter=No 11 。 。 PUNCT 補助記号-句点 _ 7 punct _ SpaceAfter=No
うまく解析できていたら以上のように出力される。
テストプログラム
今回はpythonプログラムにてGiNZAを呼び出すことを目的とする。
というわけで、簡単なプログラムを作成してテストする。
GiNZA_Test.py
# coding:utf-8
import spacy
def posAnalyze(s):
nlp = spacy.load('ja_ginza_nopn') # spacyにGiNZAを読み込ませる
doc = nlp(s)
result = [] #結果を返す用のリスト型変数
for sent in doc.sents:
for token in sent:
result.append(token) # 結果をresult(リスト型変数)に入れていく
return result
def main():
for w in posAnalyze('依存構造解析の実験を行っています。'):
print(w.i, w.orth_, w.lemma_, w.pos_, w.dep_, w.head.i) # 解析結果を標準出力
if __name__ == "__main__":
main()
たった20行足らずで形態素解析ができてしまう。
(可読性を犠牲にすればおそらく3行ぐらいで書ける気がする)
ちなみに、以上のプログラムは公式サイトにて紹介されているサンプルコードをほぼそのまま流用しただけである。
実行結果
0 依存 依存 NOUN compound 2 1 構造 構造 NOUN compound 2 2 解析 解析 NOUN nmod 4 3 の の ADP case 2 4 実験 実験 NOUN obj 6 5 を を ADP case 4 6 行っ 行う VERB root 6 7 て て SCONJ mark 6 8 い 居る AUX aux 6 9 ます ます AUX aux 6 10 。 。 PUNCT punct 6
きちんと品詞ごとに分割できていることが分かる。
応用(品詞を日本語化)
品詞名を日本語でほしい(名詞、とか動詞、とか)のであれば、main関数を以下に変更すればよい。
def main():
for w in posAnalyze('依存構造解析の実験を行っています。'):
print(w.i, w.orth_, w.lemma_, w._.pos_detail)
0 依存 依存 名詞,普通名詞,サ変可能,* 1 構造 構造 名詞,普通名詞,一般,* 2 解析 解析 名詞,普通名詞,サ変可能,* 3 の の 助詞,格助詞,, 4 実験 実験 名詞,普通名詞,サ変可能,* 5 を を 助詞,格助詞,, 6 行っ 行う 動詞,一般,, 7 て て 助詞,接続助詞,, 8 い 居る 動詞,非自立可能,, 9 ます ます 助動詞,,,* 10 。 。 補助記号,句点,,
4カラム目を「,(カンマ)」でsplitしてあげれば名詞、とかとれる。
応用(名詞のみを出力)
形態素解析の結果をもとに、名詞のみを抽出するために以下の関数を作成。
def extractNoun(list):
result = []
for w in list:
if w._.pos_detail.split(',')[0] == '名詞':
result.append(w)
return result
この関数にGinZA_Test.pyのposAnalyze関数の戻り値を食わせれば、名詞のみを抽出したリストが返却される。
プログラム全体はこんな感じになる。
# coding:utf-8
import spacy
def posAnalyze(s):
nlp = spacy.load('ja_ginza_nopn') # spacyにGiNZAを読み込ませる
doc = nlp(s)
result = []
for sent in doc.sents:
for token in sent:
result.append(token) # 結果をresult(リスト型変数)に入れていく
return result
def extractNoun(list):
result = []
for w in list:
if w._.pos_detail.split(',')[0] == '名詞':
result.append(w)
return result
def main():
for w in extractNoun(posAnalyze('依存構造解析の実験を行っています。')):
print(w.i, w.orth_, w.lemma_, w._.pos_detail)
if __name__ == "__main__":
main()
出力結果は以下。
$ python GiNZA_Test.py 0 依存 依存 名詞,普通名詞,サ変可能,* 1 構造 構造 名詞,普通名詞,一般,* 2 解析 解析 名詞,普通名詞,サ変可能,* 4 実験 実験 名詞,普通名詞,サ変可能,*
メモ
基本的にはspacyの拡張機能みたいものなので、使いこなすにはspacyモジュールの勉強が必要。
とりあえず目的であった形態素解析の実施自体は達成できたので、あとは追加要件に合わせて都度勉強していくこととする。
コメント