🗣️

自然言語処理 -spaCy & GiNZA-

2022/05/15に公開2

前回は、自然言語処理についての概要を記載しました。
今回は、実際に自然言語処理に触れてみたいと思います。

自然言語のライブラリはいくつかありますが、簡単に利用できるspaCyとGiNZAを使用していきます。

使用するライブラリ

spaCy : 自然言語ライブラリ(詳細は後述)
GiNZA : 日本語の自然言語処理を行うためのライブラリ。spaCyからモデルをロードすることで使用することができます。

さわってみよう

spaCy/GiNZAインストール

百聞は一見にしかずということで、いきなりですがspaCy使ってみましょう。

pip install spaCy
pip install ja-ginza

NLP実行

import spacy

nlp = spacy.load('ja_ginza')    # GiNZAのモデルをロード
doc = nlp("私は自然言語を勉強する") # 解析対象のテキストを渡して、nlpを実行 

これだけでGiNZAモデルを使った自然言語の解析ができてしまいます。
それでは、結果を見てみましょう。spaCyには、結果を可視化するdisplacyといライブラリがあります。

from spacy import displacy

displacy.render(doc, style="dep", options={"compact":True},  jupyter=True)

上記結果から以下が行われていることがわかります。
・ 形態素解析によりトークン(最小単位の単語)に分解し品詞タグを割り当て
・ 構文解析によりトークン間の依存関係を分析し係り受けタグを割り当て

トークン 品詞タグ 係り受けタグ 係り受け先
PRON(代名詞) nsubj(主語名詞) 勉強
ADP(接置詞) case(格表示)
自然 NOUN(名詞) compound(複合名詞) 言語
言語 NOUN(名詞) obj(目的語) 勉強
ADP(接置詞) case(格表示) 言語
勉強 VERB(動詞) ROOT(文の根) 勉強
する AUX(助動詞) aux(助動詞) 勉強

解説

わずか数行で自然言語処理の解析ができてしまいました。
spaCyで何が行われているか、簡単に解説します。

nlp = spacy.load('ja_ginza') 

Languageモデルをロード(今回はGiNZAを使用)して、Languageクラスを生成します。

spaCyの公式ドキュメントにアーキテクチャ図が記載されています。

Languageクラスにtextを渡すことで、解析結果のdataが作成される流れになります。

doc = nlp("私は自然言語を勉強する")

内部の処理では、以下のpipeline処理が動きます。
以下も公式ドキュメントに記載されているpipelineの図になります。

pipelineで実行される処理は以下になります。

処理 説明
tokenizer テキストをトークンに分割する
tagger 品詞タグを割り当てる(形態素解析)
parser 係り受けタグを割り当てる(構文解析)
ner 名前付きエンティティを検出してラベルを付ける(固有表現抽出)
lemmatizer 単語の基本形を決定する(レンマ化)
textcat ドキュメントラベルを割り当てる

まとめ

ここまで見ていただいたように、簡単に自然言語処理を使うことができることがわかったと思います。
ただ、解析の精度を上げるには、自前で学習モデルを作成したり、特定のエンティティを抽出するには、ルールベースでのマッチングをしたりする必要があります。
次回は、Languageモデルの説明や、ルールベースでのマッチングについて記載したいと思います。

Discussion

安岡孝一安岡孝一

ADP (Adposition)を「設置詞」と訳すのは、どうも気持ちが悪いのです。「接置詞」か「側置詞」の方がいいと思うのです。また、この例文での「する」は、「勉強」とauxで繋がっていてAUXに見えます。

akimenakimen

ご指摘ありがとうございます。
ADPは、ご指摘のとおり「接置詞」がよいですね。修正いたします。
例文の「する」については、誤りでしたので、こちらも修正いたします。