GiNZA入門 (1) - 事始め
「GiNZA」の使い方をまとめました。
・GiNZA 4.0.5
1. GiNZA
「GiNZA」は、オープンソースな日本語の自然言語処理ライブラリです。最先端の機械学習技術を取り入れた自然言語処理ライブラリ「spaCy」をフレームワークとして利用しており、トークン化処理にオープンソースな形態素解析器「SudachiPy」が使われています。
・文境界解析
・形態素解析
・係り受け解析
・固有表現抽出
・文節抽出
2. GiNZA のインストール
(1) 「Google Colab」で以下のコマンドを実行。
!pip install -U ginza
(2) メニュー「ランタイム → ランタイムを再起動」で「Google Colab」を再起動。
3. 文境界解析
「文境界解析」は、文章を文の境界を検出して、文に分解する処理です。
import spacy
nlp = spacy.load('ja_ginza')
doc = nlp('銀座でランチをご一緒しましょう。今度の日曜日はどうですか。')
# 文境界解析
for sent in doc.sents:
print(sent)
銀座でランチをご一緒しましょう。
今度の日曜日はどうですか。
doc.sentsは「文」のジェネレータになります。
4. 形態素解析
◎ 形態素分割
「形態素解析」は、文を「形態素」(意味を持つ最小の言語単位)に分割する処理です。
import spacy
nlp = spacy.load('ja_ginza')
doc = nlp('私は選挙管理委員会です')
# 形態素分割
for sent in doc.sents:
for token in sent:
print(token)
私
は
選挙管理委員会
です
sentは「トークン」のジェネレータになります。
◎ 形態素の分割モード
「GiNZA」では、3種類の形態素を切り替えて利用することができます。
・A:選挙 / 管理 / 委員 / 会
・B:選挙 / 管理 / 委員会
・C:選挙管理委員会 (デフォルト)
import spacy
import ginza
nlp = spacy.load('ja_ginza')
ginza.set_split_mode(nlp, "B")
doc = nlp('私は選挙管理委員会です')
# 形態素分割
for sent in doc.sents:
for token in sent:
print(token)
私
は
選挙
管理
委員会
です
◎ レンマと品詞の抽出
日本語の形態素解析の多くは、形態素分割すると同時に「レンマ」と「品詞」の抽出も行います。
import spacy
nlp = spacy.load('ja_ginza')
doc = nlp('銀座でランチをご一緒しましょう。')
# レンマと品詞の抽出
for sent in doc.sents:
for token in sent:
print(
str(token.i)+', '+ # トークン番号
token.text+', '+ # テキスト
token.lemma_+', '+ # レンマ
token.pos_+' ,'+ # 品詞
token.tag_) # 品詞詳細
0, 銀座, 銀座, PROPN, 名詞-固有名詞-地名-一般
1, で, で, ADP, 助詞-格助詞
2, ランチ, ランチ, NOUN, 名詞-普通名詞-一般
3, を, を, ADP, 助詞-格助詞
4, ご, ご, NOUN, 接頭辞
5, 一緒, 一緒, VERB, 名詞-普通名詞-サ変可能
6, し, する, AUX, 動詞-非自立可能
7, ましょう, ます, AUX, 助動詞
8, 。, 。, PUNCT, 補助記号-句点
tokenの主なプロパティは、次のとおりです。
・token.i : トークン番号。
・token.text : テキスト。
・token.lemma_ : レンマ。
・token.tag_ : 日本語の品詞タグ。
・token.pos_ : Universal Dependenciesの品詞タグ。
日本語の品詞タグの値は、次のとおりです。
・名詞-普通名詞-一般
・名詞-普通名詞-サ変可能
・名詞-普通名詞-形状詞可能
・名詞-普通名詞-サ変形状詞可能
・名詞-普通名詞-副詞可能
・名詞-普通名詞-助数詞可能
・名詞-固有名詞-一般
・名詞-固有名詞-人名-一般
・名詞-固有名詞-人名-姓
・名詞-固有名詞-人名-名
・名詞-固有名詞-地名-一般
・名詞-固有名詞-地名-国
・名詞-数詞
・名詞-助動詞語幹
・代名詞
・形状詞-一般
・形状詞-タリ
・形状詞-助動詞語幹
・連体詞
・副詞
・接続詞
・感動詞-一般
・感動詞-フィラー
・動詞-一般
・動詞-非自立可能
・形容詞-一般
・形容詞-非自立可能
・助動詞
・助詞-格助詞
・助詞-副助詞
・助詞-係助詞
・助詞-接続助詞
・助詞-終助詞
・助詞-準体助詞
・接頭辞
・接尾辞-名詞的-一般
・接尾辞-名詞的-サ変可能
・接尾辞-名詞的-形状詞可能
・接尾辞-名詞的-サ変形状詞可能
・接尾辞-名詞的-副詞可能
・接尾辞-名詞的-助数詞
・接尾辞-形状詞的
・接尾辞-動詞的
・接尾辞-形容詞的
・記号-一般
・記号-文字
・補助記号-一般
・補助記号-句点
・補助記号-読点
・補助記号-括弧開
・補助記号-括弧閉
・補助記号-AA-一般
・補助記号-AA-顔文字
・空白
UDの品詞タグの値は、次のとおりです。
・NOUN : 名詞
・名詞-普通名詞 (但しVERB,ADJとして使われるものを除く) (例: パン)
・PROPN : 固有名詞
・名詞-固有名詞 (例: 北海道)
・VERB : 動詞
・動詞(但し非自立となるものを除く) (例: 食べる)
・名刺+サ変可能で動詞の語尾が付いたもの (例: '食事'する)
・ADJ : 形容詞
・形容詞(但し非自立となるものを除く) (例: 大きい)
・形状詞 (例: 豊か)
・連体詞(但しDETを除く) (例: 大きな)
・名詞-形状詞可能で形状詞の語尾が付く場合 (例: '自由'な)
・ADV : 副詞
・副詞 (例: ゆっくり)
・INTJ : 間投詞
・間投詞 (例: あっ)
・PRON : 代名詞
・代名詞 (例: 私)
・NUM : 数詞
・名詞-数詞 (例: 5)
・AUX : 助動詞
・助動詞 (例: た)
・動詞/形容詞のうち非自立のもの (例: して'いる', 食べ'にくい’)
・CONJ : 接続詞
・接続詞または助詞-接続助詞のうち、等位接 続詞として用いるもの (例: と)
・SCONJ : 従属接続詞
・接続詞・助詞-接続助詞(CONJとなるものを除く) (例: て)
・準体助詞 (例: 行く'の'が)
・DET : 限定詞
・連体詞の一部 (例: この, その, あんな, どんな)
・ADP : 接置詞
・助詞-格助詞 (例: が)
・副助詞 (例: しか)
・係助詞 (例: こそ)
・PART : 接辞
・助詞-終助詞 (例: 何時です'か')
・接尾辞 (例: 深'さ')
・PUNCT : 句読点
・補助記号-句点/読点/括弧開/括弧閉
・SYM : 記号
・記号・補助記号のうちPUNCT以外のもの
・X : その他
・空白
5. 係り受け解析
「係り受け解析」は、形態素解析で得られた単語間の関係性を解析する処理です。
◎ 単語間の係り受け解析
import spacy
from spacy import displacy
nlp = spacy.load('ja_ginza')
doc = nlp('銀座でランチをご一緒しましょう。')
# 単語間の係り受け解析
for sent in doc.sents:
for token in sent:
print(token.text+' ← '+token.head.text+', '+token.dep_)
# グラフ表示
displacy.render(doc, style='dep', jupyter=True, options={'compact':True, 'distance': 90})
銀座 ← 一緒, obl
で ← 銀座, case
ランチ ← 一緒, obj
を ← ランチ, case
ご ← 一緒, compound
一緒 ← 一緒, ROOT
し ← 一緒, advcl
ましょう ← 一緒, aux
。 ← 一緒, punct
tokenの係り受け解析のプロパティは、次のとおりです。
・token.dep_ : 構文従属関係。
・token.head: 構文上の親のトークン。
・token.children : 構文上の子のトークン。
・token.lefts : 構文上の左のトークン郡。
・token.rights : 構文上の右のトークン郡。
「構文従属関係」の定数は、次のとおりです。
・acl : 名詞の節修飾子
・advcl : 副詞節修飾子
・advmod : 副詞修飾子
・amod : 形容詞修飾子
・appos : 同格
・aux : 助動詞
・case : 格表示
・cc : 等位接続詞
・ccomp : 補文
・clf : 類別詞
・compound : 複合名詞
・conj : 結合詞
・cop : 連結詞
・csubj : 主部
・dep : 不明な依存関係
・det : 限定詞
・discourse : 談話要素
・dislocated : 転置
・expl : 嘘辞
・fixed : 固定複数単語表現
・flat : 同格複数単語表現
・goeswith : 1単語分割表現
・iobj : 関節目的語
・list : リスト表現
・mark : 接続詞
・nmod : 名詞修飾子
・nsubj : 主語名詞
・nummod : 数詞修飾子
・obj : 目的語
・obl : 斜格名詞
・orphan : 独立関係
・parataxis : 並列
・punct : 句読点
・reparandum : 単語として認識されない単語表現
・root : ルート
・vocative : 発声関係
・xcomp : 補体
◎ 文節間の係り受け解析
import spacy
import ginza
nlp = spacy.load('ja_ginza')
doc = nlp('銀座でランチをご一緒しましょう。')
# 文節間の係り受け解析
for sent in doc.sents:
for span in ginza.bunsetu_spans(sent):
for token in span.lefts:
print(str(ginza.bunsetu_span(token))+' ← '+str(span))
銀座で ← ご一緒しましょう。
ランチを ← ご一緒しましょう。
6. 固有表現抽出
「固有抽出表現」は、文から日付や地名等の「固有表現」(名前付きエンティティ)を抽出する処理です。
import spacy
from spacy import displacy
nlp = spacy.load('ja_ginza')
doc = nlp('山田さんと銀座でランチをご一緒しましょう。')
# 固有表現抽出
for ent in doc.ents:
print(
ent.text+','+ # テキスト
ent.label_+','+ # ラベル
str(ent.start_char)+','+ # 開始位置
str(ent.end_char)) # 終了位置
# 強調表示
displacy.render(doc, style='ent', jupyter=True, options={'distance': 90})
銀座,City,0,2
entityのプロパティは、次のとおりです。
・text: テキスト。
・ent.label_: ラベル。
・ent.start_char: 開始位置。
・ent.end_char: 終了位置。
「entity._label」のラベルは、以下を参照してください。