EntityRulerを使って深層学習ベースのNERにルールを追加[sciSpacy]

8月 30, 2020

本記事では、Spacyにおける標準のNER(en_core_sci_sm)に、ルールを追加する方法について紹介する。これができると、NERの結果が少し物足りないときにルールで微調整することができるため、覚えておくと便利だと思う。

まず、NERをあてるための前処理を行う。ここでは、nlpという名前でNERモデルを読み込むところまでを行っている。

import spacy
from spacy.pipeline import EntityRuler
nlp = spacy.load("en_core_sci_sm")
patterns = [{"label": "ORG", "pattern": "Jeffrey Hinton"},
{"label": "ORG", "pattern": "University of Toronto"},
{"label": "ORG", "pattern": "Google"}]
ruler = EntityRuler(nlp, overwrite_ents=True)
ruler.add_patterns(patterns)
nlp.add_pipe(ruler)
doc = nlp("Jeffrey Hinton is a British-born computer science and cognitive psychology researcher. \Famous for studying neural networks. Currently working for University of Toronto and Google.")

ルールを追加する際は、EntityRulerにadd_patternsで追加パターン(ルール)を追加するだけで良い。

また、"en_core_sci_sm"をロードした際は、エンティティに既存のラベルがついているので,overwrite_ents=Trueにする必要がある.

比較として、「Before(ルール追加前)」の場合と、「After(ルール追加後)」の場合とにわけて結果を紹介する。

Before (ルール追加前)

for ent in doc.ents:
print(ent.text, ent.label_)
# output
Jeffrey Hinton ENTITY
British-born computer science ENTITY
cognitive psychology ENTITY
neural networks ENTITY
University of Toronto ENTITY
Google ENTITY

After (ルール追加後)

for ent in doc.ents:
print(ent.text, ent.label_)
# output
Jeffrey Hinton ORG
British-born computer science ENTITY
cognitive psychology ENTITY
neural networks ENTITY
University of Toronto ORG
Google ORG

結果をみると、Beforeではラベルの付いていなかった"Jeffrey Hinton"と"University of Toronto"と"Google"にそれぞれ固有ラベルが付いていることが確認できる。

参考

spaCyを使ってルールベースの記述をシンプルに! – Qiita

https://spacy.io/api/entityruler

https://spacy.io/usage/rule-based-matching

自然言語処理(NLP)について知識を身に着けたいときには以下の書籍がおすすめだ。

Uncategorized

Posted by vastee