英文の5文型を自動判定する sent-pattern をPythonで作った


英語教育の現場では「5文型」は避けて通れないトピックです。でも、生徒が自力で文型を判別できるようになるまでには時間がかかる。「英文を入力したら即座に文型と各要素を返してくれるツールがあれば」という動機から、このパッケージを作りました。 Spacy Universeに登録されています。


背景:なぜ5文型の自動判定が必要か

日本の英語教育で使われる5文型は、C. T. Onions の Advanced English Syntax(1904)に基づいています。主語・動詞・目的語・補語の関係を整理するこの枠組みは、文構造の理解に非常に有効です。

しかし実際の授業では、

  • 生徒が文型を誤って覚えているかどうか、即座に確認するのが難しい
  • 教員が大量の例文をチェックするのに時間がかかる
  • 自主学習ツールとして使える既製品がほぼ存在しない

という課題があります。そこで、NLP ライブラリ spaCy を使って英文を解析し、文型と各構成要素を自動で返す Python パッケージ sent-pattern を開発しました。

参考:Influence of His Grammar on English Language Education in Japan


技術スタック

要素内容
言語Python
依存ライブラリspaCy
使用モデルen_core_web_lg(大規模英語モデル)
配布PyPI / spaCy Universe

spaCy は依存関係ツリー(dependency parse)を生成する機能を持っており、これが文型判定の核となっています。nsubj(名詞主語)、ROOT(述語動詞)、dobj(直接目的語)、dative(間接目的語)などの依存関係ラベルを組み合わせることで、5文型への分類を実現しています。


実装の詳細

依存関係リストの構築

まず create_dep_list() で文の依存関係を辞書形式に整理します。

import spacy
from sent_pattern import tags

nlp = spacy.load("en_core_web_lg")
doc = nlp("he gives me something")

dep_list = tags.create_dep_list(doc)
print(dep_list)
# {'ROOT': [gives], 'dative': [me], 'dobj': [something], 'nsubj': [he]}

spaCy が各トークンに付与した依存関係ラベルをキーとして集約することで、文の骨格が見えてきます。

文要素の抽出

次に create_elements() で主語・動詞・目的語などの要素オブジェクトを生成します。

elements = tags.create_elements(dep_list=dep_list)

内部では、nsubj を Subject、ROOT を Verb、dobj を Object として対応付けています。dative が存在すれば間接目的語(SVOO の判定に使用)、attracomp が存在すれば補語(SVC / SVOC の判定に使用)として扱います。

文型の判定

最後に create_sent_pattern() が文型クラスを返します。

p = tags.create_sent_pattern(elements=elements)
pattern = p.pattern_type

print(pattern.subject.root.text)  # "he"
print(pattern.verb.root)          # gives (spacy.Token)
print(pattern.abbreviation)       # "SVOO"

返ってくるのは FourthSentencePattern などの専用クラスです。abbreviation プロパティで SV / SVC / SVO / SVOO / SVOC の文字列が取れるので、UI 表示やログ出力に便利です。

パイプラインとして使う

spaCy のカスタムパイプラインとして登録すれば、doc._.sentpattern に直接アクセスできます。

nlp.add_pipe("span_noun")
nlp.add_pipe("sent_pattern")

doc = nlp("he gives me something")
print(doc._.sentpattern)  # FourthSentencePattern

前置詞句の抽出(オプション)

文型だけでなく、前置詞句をまとめて取り出すこともできます。長文の構造把握に役立ちます。

from sent_pattern import ElementsFactory

text = "The Eureka client handles all aspects of service instance registration"
doc = nlp(text)
dep_list = tags.create_dep_list(doc)

custom = ElementsFactory.make_custom_elements(dep_list, doc=doc, option="prep")
print(custom.option.prep_groups)
# [of service instance registration]

教育現場での活用イメージ

  • 自動採点補助:生徒が入力した英文の文型が正しいか即座に判定
  • 例文データベースの分類:教材の英文を文型別に自動仕分け
  • 学習アプリのバックエンド:FastAPI と組み合わせた Web API として提供(examples/ にサンプルあり)

インストール

pip install sent-pattern
python -m spacy download en_core_web_lg

リンク

← Works 一覧へ戻る