自然言語処理 -spaCy & GiNZA-
前回は、自然言語処理についての概要を記載しました。
今回は、実際に自然言語処理に触れてみたいと思います。
自然言語のライブラリはいくつかありますが、簡単に利用できる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モデルの説明や、ルールベースでのマッチングについて記載したいと思います。
chameleonmeme.com/ きっかけは、偶然同じ現場で働いていたエンジニア3人の 「もっと仕事にのめり込んだり、熱中したいよね」という雑談でした。 営業から開発、サービスの提供まですべての工程を自分たちの手で行い、 気の合う仲間と楽しく仕事をすることで熱中するためにチームをスタートしました。
Discussion
ADP (Adposition)を「設置詞」と訳すのは、どうも気持ちが悪いのです。「接置詞」か「側置詞」の方がいいと思うのです。また、この例文での「する」は、「勉強」とauxで繋がっていてAUXに見えます。
ご指摘ありがとうございます。
ADPは、ご指摘のとおり「接置詞」がよいですね。修正いたします。
例文の「する」については、誤りでしたので、こちらも修正いたします。