LoginSignup
3
3

More than 1 year has passed since last update.

SpacyとGiNZAで固有表現抽出

Posted at

はじめに

本記事ではspaCyとGiNZAを使用した固有表現抽出の手順について紹介します。
インストールすれば簡単にできるので固有表現抽出を行う際におすすめです。
今回はあくまで固有表現抽出のみを行います。

想定する読者

日本語の自然言語処理に興味がある人
Pythonのコードが読める人

環境

Windows10
Windows11

spaCyとは

Pythonで利用できる自然言語処理ライブラリです。
Explosion AI社によって公開されています。
spaCyでは、テキスト分類、トークン化などをはじめとした非常に多くの機能を提供しています。
spaCyでは訓練済みのモデルを読み込むことで多言語の自然言語処理に対応します。

GiNZAとは

GiNZAは日本語の自然言語処理を行うためのライブラリでリクルートと国語研が共同で開発したライブラリです。
GiNZAはspaCyのAPIを使用して学習されており、spaCyからモデルをロードして使用することができます。

インストール

spaCyのインストール

pip install spacy

GiNZAのインストール

次のコマンドでインストールされるパッケージには大容量モデルファイルは含まれていない

# pip install -U ginza ja_ginza_electra

大容量モデルファイルを含めたインストールを行うには、次のようにGitHubのリリースアーカイブを指定する

# pip install -U ginza https://github.com/megagonlabs/ginza/releases/download/latest/ja_ginza_electra-latest-with-model.tar.gz

spaCyからGiNZAのモデルをロード

GiNZAのモデルをロードしてみましょう。

import spacy

nlp = spacy.load('ja_ginza_electra')

GiNZAで固有表現抽出

docには固有表現抽出を行いたいテキストを入力します。

doc = nlp('小学生のサツキと5歳のメイの二人は、母の療養のために父と一緒に初夏の頃に3丁目に引っ越してくる。')

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

抽出結果

小学生,School_Age,0,3
サツキ,Name_Other,4,7
5歳,Age,8,10
メイ,Name_Other,11,13
二人,N_Person,14,16
初夏,Date,31,33
3丁目,Facility_Part,36,39

このように固有表現とそのラベルが抽出されます。
開始位置と終了位置は文字列のどの位置に固有表現があるのかを示しています。

ルール追加

GiNZAでの固有表現抽出には抽出されない単語も存在します。
その単語を抽出したい際にはルールを手動で追加する必要があります。
例えば、先ほどの文章からは"母"と"父"という単語は抽出されていません。今回はこの2つを抽出するルールを追加してみます。
以下のコードをロードの後に記述します。

config={
'overwrite_ents':True
}
ruler=nlp.add_pipe('entity_ruler',config=config)
patterns=[{'label':'Person','pattern':''},
          {'label':'Person','pattern':''}]
ruler.add_patterns(patterns)

抽出結果

小学生,School_Age,0,3
サツキ,Name_Other,4,7
5歳,Age,8,10
メイ,Name_Other,11,13
二人,N_Person,14,16
母,Person,18,19
父,Person,26,27
初夏,Date,31,33
3丁目,Facility_Part,36,39

このように"母"と"父"が固有表現として抽出されました。

ソースコード

上記の内容を1つにまとめたコードを以下に示します。

import spacy

#GiNZAのモデルをロード
nlp = spacy.load('ja_ginza_electra')

# ルールの追加
config={
'overwrite_ents':True
}
ruler=nlp.add_pipe('entity_ruler',config=config)
patterns=[{'label':'Person','pattern':''},
          {'label':'Person','pattern':''}]
ruler.add_patterns(patterns)

doc = nlp('小学生のサツキと5歳のメイの二人は、母の療養のために父と一緒に初夏の頃に3丁目に引っ越してくる。')

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

おわりに

本記事ではspaCyとGiNZAを使った固有表現抽出の手順を紹介しました。
この手法で固有表現抽出は簡単にできるので、固有表現抽出に興味のある人ややってみたい人におすすめです。

不明な点や、改善すべき点などがあればコメントでお願いします。
また共有できることがあれば投稿したい思います。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3