😀

GiNZA使ってみた

2021/05/20に公開

大学の研究に際してGiNZAにふれる機会が合ったので備忘録的に書いておきます

#環境

  • Python 3.6.8
  • pyenv 1.2.24.1-6-g132d5464
  • pip 21.0.1

install

公式のgithubを見てインストールしました

https://github.com/megagonlabs/ginza

(面倒な人へ)インストールコマンド

pip install -U ginza

ロードと解析

こんな感じのプログラム書いてみました.昨日から胃がキリキリと痛いという文の形態素解析をしてもらいましょう

program

analy.py
import spacy

nlp = spacy.load('ja_ginza')
doc = nlp('昨日から胃がキリキリと痛い。')

for sent in doc.sents:
    for token in sent:
        print(token.i, token.orth_, token.lemma_, token.pos_, token.tag_, token.dep_, token.head.i)
    print('EOS')

output

$ python analy.py

0 昨日 昨日 NOUN 名詞-普通名詞-副詞可能 obl 6
1 から から ADP 助詞-格助詞 case 0
2 胃 胃 NOUN 名詞-普通名詞-一般 nsubj 6
3 が が ADP 助詞-格助詞 case 2
4 キリキリ キリキリ NOUN 名詞-普通名詞-一般 obl 6
5 と と ADP 助詞-格助詞 case 4
6 痛い 痛い ADJ 形容詞-一般 ROOT 6
7 。 。 PUNCT 補助記号-句点 punct 6
EOS

左から単語・見出し語・品詞タグ・品詞情報・依存関係ラベル・係り先の単語インデックスを表示しています.
この中にあるNOUN・ADPやnmod・nsubjという文字列はUniversal Dependencyというプロジェクトで定義されているラベルらしいです

主語と述語を抜き出す

nsubjというラベルが主語述語の係り受けなので,nsubjのラベルを持っているトークンと係り受け先のトークンをペアとします.

program

nsubj.py
import spacy

def parse_document(sentence, nlp):
    doc = nlp(sentence)
    tokens = []

    for sent in doc.sents:
        for token in sent:
            tokens.append(token)

    subject_list = []

    for token in tokens:
        ## 依存関係ラベルがnsubj=>「<見出し語>:<係り先の見出し語>」をリストに追加する。
        if token.dep_ in  ["nsubj", "iobj"]:
            subject_list.append(f"{token.lemma_}:{tokens[token.head.i].lemma_}")
    
    return subject_list

## ここからメイン

nlp = spacy.load('ja_ginza')
print(parse_document("昨日から胃がキリキリと痛い。ただ、熱は無い。", nlp))

output

$ python nsubj.py

['胃:痛い', '熱:無い']

Discussion