このシリーズでは、自然言語処理の環境構築から学習の方法までまとめます。

今回の記事ではGiNZAまとめ③として、固有表現抽出について紹介します。

Google colabを使用して、簡単に最新の自然言語処理モデルを実装することができますので、ぜひ最後までご覧ください。

(前回の記事)

【🔰自然言語処理】GiNZAまとめ② 〜形態素解析〜

このシリーズでは、自然言語処理の環境構築から学習の方法までまとめます。 今回の記事ではGiNZAまとめ②として、形態素解析を中心に紹介します。 Google colabを使用して…

今回の内容

・GiNZAの導入

・固有表現抽出

・固有表現の追加

GiNZAとは

「GiNZA」は、2019年4月に登場したオープンソースな日本語の自然言語処理ライブラリです。

最先端の機械学習技術を取り入れた自然言語処理ライブラリ「spaCy」をフレームワークとして利用しており、トークン化処理にオープンソースな形態素解析器「SudachiPy」が使われています。

「GiNZA日本語UDモデル」にはMegagon Labsと国立国語研究所の共同研究成果が組み込まれています。

詳細は公式の実装からご確認ください。

GiNZAの導入

ここからはGoogle colabを使用して、GiNZAによる形態素解析の簡単なを実装例を紹介していきます。

まずはインストールします。

# GiNZAのインストール
!pip install -U ginza

動作確認をします。

import spacy

nlp = spacy.load('ja_ginza')

以下のようなエラーが出た場合には、再度インストールします。

Can’t find model ‘ja_ginza’. It doesn’t seem to be a shortcut link, a Python package or a valid path to a data directory.

!pip install ginza ja-ginza 

インストールが終わったら、ランタイムの再起動を行います。

固有表現抽出

地名・人名・組織名といった固有名詞に数量や日付、時間などを加えたものを「固有表現」と言い、与えられたテキストから固有表現を抜き出すタスクのことを固有表現抽出と言います。

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)) # 終了位置

実行すると、以下のような結果が出力されます。

毎週水曜日,Frequency,2,7
山田,Person,8,10
さん,Title_Other,10,12
原宿,City,13,15
代々木上原,City,30,35

強調表現

文中の固有表現に対して強調表現をすることができます。

displacy.render(doc, style='ent', jupyter=True)

実行すると、以下のような結果が出力されます。

私は 毎週水曜日 Frequency に 山田 Person さん Title_Other と 原宿 City のカフェで勉強します。その後、 代々木上原 City のジムに寄ってから帰ります。

固有表現の追加

抽出したい単語が固有表現として抽出されない場合、手動でルールを追加することができます。

まずは以下の例をご覧ください。

import spacy
from spacy import displacy
nlp = spacy.load('ja_ginza')
doc = nlp('私は毎週水曜日に莉子、結菜、芽依、結翔、陽向の5人と一緒に渋谷のカフェで勉強します。')

for ent in doc.ents:
    print(
        ent.text+','+ # テキスト
        ent.label_+','+ # ラベル
        str(ent.start_char)+','+ # 開始位置
        str(ent.end_char)) # 終了位置

実行すると、以下のような結果が出力されます。

毎週水曜日,Frequency,2,7
莉子,Person,8,10
結菜,Person,11,13
5人,N_Person,23,25
渋谷,City,29,31

5人のうち、3人の名前が抽出できていないことがわかります。

ルールの追加

先ほど抽出できなかった3人の名前を追加します。

config={
'overwrite_ents':True
}
ruler=nlp.add_pipe('entity_ruler',config=config)
patterns=[
    {"label": "Person", "pattern": "芽依"},
    {"label": "Person", "pattern": "結翔"},
    {"label": "Person", "pattern": "陽向"}
    ]
ruler.add_patterns(patterns)

先ほどと同様に固有表現抽出をしてみます。

doc = nlp('私は毎週水曜日に莉子、結菜、芽依、結翔、陽向の5人と一緒に渋谷のカフェで勉強します。')

for ent in doc.ents:
    print(
        ent.text+','+ # テキスト
        ent.label_+','+ # ラベル
        str(ent.start_char)+','+ # 開始位置
        str(ent.end_char)) # 終了位置

実行すると、以下のような結果が出力されます。

毎週水曜日,Frequency,2,7
莉子,Person,8,10
結菜,Person,11,13
芽依,Person,14,16
結翔,Person,17,19
陽向,Person,20,22
5人,N_Person,23,25
渋谷,City,29,31

全員の名前が固有表現として認識されました。

まとめ

最後までご覧いただきありがとうございました。

今回の記事では、固有表現抽出について紹介しました。

次回はGiNZAのユーザー辞書機能について紹介します。

このシリーズでは、自然言語処理全般に関するより詳細な実装や学習の方法を紹介しておりますので、是非ご覧ください。

【ChatGPT】自然言語処理まとめ【Huggingface Transformers】

自然言語処理に関するおすすめの書籍 ChatGPT ChatGPTを中心とした、GPT系の関連技術を紹介します。 ChatGPTの概要 ・ChatGPTとは・ChatGPTができること・ChatGPTの問題点…