自然言語処理ライブラリGiNZAの解析結果を解りやすく表示してみた


はじめに

この記事はspaCy/GiNZAを触ったことがない人を対象に、どのような解析結果が出力されるか把握し理解することを目的としています。

spaCy/GiNZAとは

GiNZAUniversal Dependencies(UD)に基づいたオープンソースな日本語処理ライブラリです。
spaCyというMITライセンスで商用レベルな自然言語処理フレームワークをベースに構築されています。

Pythonがインストールされていれば、簡単にインストールすることができます。

$ pip install -U ginza

まずはそのまま動かしてみる

ginzaコマンドが使えるようになっているためそのまま解析することができます。

$ ginza
銀座でランチをご一緒しましょう。今度の日曜日はどうですか。
# text = 銀座でランチをご一緒しましょう。
1       銀座    銀座    PROPN   名詞-固有名詞-地名-一般 _       6       obl     _       SpaceAfter=No|BunsetuBILabel=B|BunsetuPositionType=SEM_HEAD|NP_B|Reading=ギンザ|NE=B-GPE|ENE=B-City
2       で      で      ADP     助詞-格助詞     _       1       case    _       SpaceAfter=No|BunsetuBILabel=I|BunsetuPositionType=SYN_HEAD|Reading=デ
3       ランチ  ランチ  NOUN    名詞-普通名詞-一般      _       6       obj     _       SpaceAfter=No|BunsetuBILabel=B|BunsetuPositionType=SEM_HEAD|NP_B|Reading=ランチ
4       を      を      ADP     助詞-格助詞     _       3       case    _       SpaceAfter=No|BunsetuBILabel=I|BunsetuPositionType=SYN_HEAD|Reading=ヲ
5       ご      ご      NOUN    接頭辞  _       6       compound        _       SpaceAfter=No|BunsetuBILabel=B|BunsetuPositionType=CONT|Reading=ゴ
6       一緒    一緒    VERB    名詞-普通名詞-サ変可能  _       0       root    _       SpaceAfter=No|BunsetuBILabel=I|BunsetuPositionType=ROOT|Reading=イッショ
7       し      する    AUX     動詞-非自立可能 _       6       advcl   _       SpaceAfter=No|BunsetuBILabel=I|BunsetuPositionType=SYN_HEAD|Inf=サ行変格,連用形-一般|Reading=シ
8       ましょう        ます    AUX     助動詞  _       6       aux     _       SpaceAfter=No|BunsetuBILabel=I|BunsetuPositionType=SYN_HEAD|Inf=助動詞-マス,意志推量形|Reading=マショウ
9       。      。      PUNCT   補助記号-句点   _       6       punct   _       SpaceAfter=No|BunsetuBILabel=I|BunsetuPositionType=CONT|Reading=。

# text = 今度の日曜日はどうですか。
1       今度    今度    NOUN    名詞-普通名詞-副詞可能  _       3       nmod    _       SpaceAfter=No|BunsetuBILabel=B|BunsetuPositionType=SEM_HEAD|NP_I|Reading=コンド
2       の      の      ADP     助詞-格助詞     _       1       case    _       SpaceAfter=No|BunsetuBILabel=I|BunsetuPositionType=SYN_HEAD|Reading=ノ
3       日曜日  日曜日  NOUN    名詞-普通名詞-副詞可能  _       5       nsubj   _       SpaceAfter=No|BunsetuBILabel=B|BunsetuPositionType=SEM_HEAD|NP_I|Reading=ニチヨウビ|NE=B-DATE|ENE=B-Day_Of_Week
4       は      は      ADP     助詞-係助詞     _       3       case    _       SpaceAfter=No|BunsetuBILabel=I|BunsetuPositionType=SYN_HEAD|Reading=ハ
5       どう    どう    ADV     副詞    _       0       root    _       SpaceAfter=No|BunsetuBILabel=B|BunsetuPositionType=ROOT|Reading=ドウ
6       です    です    AUX     助動詞  _       5       aux     _       SpaceAfter=No|BunsetuBILabel=I|BunsetuPositionType=SYN_HEAD|Inf=助動詞-デス,終止形-一般|Reading=デス
7       か      か      PART    助詞-終助詞     _       5       mark    _       SpaceAfter=No|BunsetuBILabel=I|BunsetuPositionType=SYN_HEAD|Reading=カ
8       。      。      PUNCT   補助記号-句点   _       5       punct   _       SpaceAfter=No|BunsetuBILabel=I|BunsetuPositionType=CONT|Reading=。

無事解析できましたが、コンソールだと見づらいですね。

今度はわかりやすく表示してみる

今回、構文従属関係や表を見やすくするためspaCyのVisualizerStreamlitで可視化してみました。
構文従属関係の描画の際、PROPN・ADP・obl・advclといったUD用語を日本語に置き換えるためcreate_manual()を経由してsvgを生成し、streamlit.image()で描画しています。

input_list = st.text_area("入力文字列").splitlines()
nlp = spacy.load('ja_ginza')
for input_str in input_list:
    doc = nlp(input_str)
    for sent in doc.sents:
        svg = spacy.displacy.render(create_manual(sent), style="dep", manual=True)
        streamlit.image(svg)

また表をstreamlit.table()で固有表現(エンティティ)をstreamlit.components.v1.html()で描画しています。ソースコード全文はこちら

動作結果はこんな感じになりました。

入力と解析結果は以下のような形になっています。

入力文字列

銀座でランチをご一緒しましょう。今度の日曜日はどうですか。
吾輩は猫である。 名前はまだ無い。

1-1. 銀座でランチをご一緒しましょう。

構文従属関係

詳細

i(index) 0 1 2 3 4 5 6 7 8
orth(テキスト) 銀座 ランチ 一緒 ましょう
lemma(基本形) 銀座 ランチ 一緒 する ます
reading_form(読みカナ) ギンザ ランチ イッショ マショウ
pos(PartOfSpeech) PROPN ADP NOUN ADP NOUN VERB AUX AUX PUNCT
pos(品詞) 固有名詞 設置詞 名詞 設置詞 名詞 動詞 助動詞 助動詞 句読点
tag(品詞詳細) 名詞-固有名詞-地名-一般 助詞-格助詞 名詞-普通名詞-一般 助詞-格助詞 接頭辞 名詞-普通名詞-サ変可能 動詞-非自立可能 助動詞 補助記号-句点
inflection(活用情報) - - - - - - サ行変格連用形-一般 助動詞-マス意志推量形 -
ent_type(エンティティ型) City - - - - - - - -
ent_iob(エンティティIOB) B O O O O O O O O
lang(言語) ja ja ja ja ja ja ja ja ja
dep(dependency) obl case obj case compound ROOT advcl aux punct
dep(構文従属関係) 斜格要素 格標識 目的語 格標識 複合語 ROOT 副詞的修飾節 助動詞 句読点
head.i(親index) 5 0 5 2 5 5 5 5 5
bunsetu_bi_label B I B I B I I I I
bunsetu_position_type SEM_HEAD SYN_HEAD SEM_HEAD SYN_HEAD CONT ROOT SYN_HEAD SYN_HEAD CONT
is_bunsetu_head TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE
ent_label_ontonotes B-GPE O O O O O O O O
ent_label_ene B-City O O O O O O O O

文節区切り

銀座で/ランチを/ご一緒しましょう。

文節の主辞区間と句の区分

銀座(NP)/ランチ(NP)/ご一緒(VP)

固有表現(エンティティ)

1-2. 今度の日曜日はどうですか。

構文従属関係

詳細

i(index) 9 10 11 12 13 14 15 16
orth(テキスト) 今度 日曜日 どう です
lemma(基本形) 今度 日曜日 どう です
reading_form(読みカナ) コンド ニチヨウビ ドウ デス
pos(PartOfSpeech) NOUN ADP NOUN ADP ADV AUX PART PUNCT
pos(品詞) 名詞 設置詞 名詞 設置詞 副詞 助動詞 助詞 句読点
tag(品詞詳細) 名詞-普通名詞-副詞可能 助詞-格助詞 名詞-普通名詞-副詞可能 助詞-係助詞 副詞 助動詞 助詞-終助詞 補助記号-句点
inflection(活用情報) - - - - - "助動詞-デス 終止形-一般" -
ent_type(エンティティ型) - - Day_Of_Week - - - - -
ent_iob(エンティティIOB) O O B O O O O O
lang(言語) ja ja ja ja ja ja ja ja
dep(dependency) nmod case nsubj case ROOT aux mark punct
dep(構文従属関係) 名詞修飾語 格標識 名詞句主語 格標識 ROOT 助動詞 節標識 句読点
head.i(親index) 11 9 13 11 13 13 13 13
bunsetu_bi_label B I B I B I I I
bunsetu_position_type SEM_HEAD SYN_HEAD SEM_HEAD SYN_HEAD ROOT SYN_HEAD SYN_HEAD CONT
is_bunsetu_head TRUE FALSE TRUE FALSE TRUE FALSE FALSE FALSE
ent_label_ontonotes O O B-DATE O O O O O
ent_label_ene O O B-Day_Of_Week O O O O O

文節区切り

今度の/日曜日は/どうですか。

文節の主辞区間と句の区分

今度(NP)/日曜日(NP)/どう(ADVP)

固有表現(エンティティ)

参考サイト

最後に

構文従属関係などが解りやすくなったでしょうか?

本記事の「構文従属関係や表を見やすくする」には残念ながら対応していませんが、Herokuで自然言語処理ライブラリspaCy/GiNZAのオンラインデモサイトを立ててみた という記事も書きました。
spaCy/GiNZAのオンラインデモサイトにもアクセスしてみてください。
GiNZAに少しでも興味持ってもらえたら幸いです。