【Python】GiNZAを使って形態素解析を行う

GiNZA

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モジュールの勉強が必要。

とりあえず目的であった形態素解析の実施自体は達成できたので、あとは追加要件に合わせて都度勉強していくこととする。

 

コメント

タイトルとURLをコピーしました