英語教育の現場では「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 の判定に使用)、attr や acomp が存在すれば補語(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