Englishing 英文構文解析クライアントアプリ

Englishing – 英文を「構文ブロック」で見る英語解析クライアント

Englishingは、ローカルで動かしているPythonサーバー(spaCyなど)に英文を送り、 返ってきた構文情報をもとに、that節・関係代名詞・分詞構文などの「構文ブロック」を色分け表示する 英語解析クライアントアプリです。
文法用語の暗記ではなく、「今読んでいる文のどこがどう繋がっているか」を視覚的に掴むことを目標にしています。

作品の説明

参考書の「解説ページ」はわかりやすいのに、本番の英文になると急に読めなくなる。 そのギャップを埋めるために、実際に読みたい英文(論文や記事)をその場で解析して、 構文ブロックごとに色分けしてくれるクライアントを作りました。

Androidアプリ側では、ユーザーが入力した英文をローカルネットワークのPythonサーバーに送信します。 サーバー側ではspaCyなどのNLPライブラリで構文解析を行い、 「トークン」「依存関係」「句・節のスパン情報」をJSONで返却。 クライアントはそのJSONをもとに、Jetpack ComposeのText/Canvasでブロックごとにハイライトを行います。

  • ① ユーザーが英文を入力 or 貼り付け
  • ② AndroidアプリがPythonサーバーにHTTP POST
  • ③ サーバー側でspaCyなどが構文解析
  • ④ 句・節・依存関係をまとめたJSONを返却
  • ⑤ クライアント側で構文ブロックに色を割り当てて表示
  • ⑥ タップすると日本語メモや解説を表示

システム概要

Englishing システム構成図

左側がAndroidクライアント、右側がローカルPC上のPythonサーバー。 同一LAN内でHTTP(REST)またはWebSocketで接続し、英文テキストと構文解析結果をやり取りします。

技術スタック

  • Android / Client: Kotlin, Jetpack Compose, OkHttp/Retrofit, Kotlinx Serialization
  • Backend / NLP: Python, FastAPI または Flask, spaCy(構文解析), 依存構造・句スパン抽出スクリプト
  • 表示: Compose Text + SpanStyle, Canvas(構文ブロックの背景と線)

主要コンポーネント

  • SentenceInputView: 英文入力欄。履歴から再利用したり、クリップボードから貼り付けてすぐ解析に回せます。
  • SyntaxHighlightView: Pythonサーバーから返ってきた構文ブロックを、色付きのSpanとして重ねて表示するComposeコンポーネント。
  • Python NLP Server: spaCyでトークン分割・品詞タグ付け・依存解析を行い、「節」「句」「修飾関係」をスパンとして構造化してJSON返却。
  • Color Mapping Layer: that節、関係代名詞、分詞構文など、ブロックの種類ごとに一貫した色を割り当てるマッピングロジック。

技術解説

API DESIGN

英文 → 構文ブロックJSONへの変換API

クライアントとサーバーの間では、POST /analyze というシンプルなJSON APIを設計しました。 リクエストは入力英文とオプション(例:返してほしい構文の種類)だけ。 レスポンスでは、トークン列とともに、複数の「span」を返すようにしています。

リクエスト例:
{ "text": "I found a book that I had lost yesterday.", "options": {"include_dep": true} }

レスポンス例(イメージ):
{ "tokens":[...], "spans":[{"type":"RELATIVE_CLAUSE","start":4,"end":9}, ...] }
NLP / SPACY

spaCyの依存木から「構文ブロック」を切り出す

spaCyは単語ごとの依存関係(nsubj, dobj, relcl, advcl など)を出してくれるので、 それをもとに「どこからどこまでがthat節か」「どこまでが分詞構文か」をスパンとして抽出します。 例えば、RELCL(関係節)を根に持つ部分木をたどって、その最小・最大インデックスをブロックとして扱う、という方針です。

1. spaCyで依存解析
2. 特定の依存ラベルを根に持つsubtreeを走査
3. subtree内の最小・最大トークンインデックス = 構文ブロックの範囲
ANDROID / UI

構文種類ごとの色分けとタップでのポップアップ解説

Android側では、構文ブロックの種類に応じてSpanStyleを重ねています。 that節なら淡い青、関係代名詞節なら緑、分詞構文ならオレンジ、といった具合です。 ブロックをタップすると、その構文の日本語解説や自分で書いたメモをポップアップで表示できます。

・Text + AnnotatedString + SpanStyle
・OffsetMappingでトークンインデックス→文字オフセットに変換
・クリック位置から所属ブロックを逆引きしてポップアップ表示
LOCAL-FIRST

ローカルネットワーク完結の「自分専用英語解析環境」

Englishingは、クラウドの巨大モデルではなく、あえてローカルのPythonサーバーを前提にしています。 これによって、機密性の高い英文(論文草稿や企業資料など)も安心して解析できるほか、 自分でルールベースの構文ブロック追加やカスタム辞書を入れたりと、研究環境としての拡張性も確保しています。

・Pythonサーバー: localhost:8000 などで稼働
・Android: Wi-Fi経由で同一ネットワークのPCにアクセス
・API仕様を変えればspaCy以外の解析エンジンにも差し替え可能

実験・結果・課題

構文色分けの見やすさ検証

大学の英語教科書やニュース記事の一部を入力し、 どの程度「一目で構造がわかるか」を自分で試しました。 that節や関係代名詞節が複数ネストしている文では、色の重なり方が重要になることがわかりました。

構文色分け前の英文
(a) 色分けなし(プレーンテキスト)
構文色分け後の英文
(b) 構文ごとに色分けした表示

現在の課題

現在は「構文色分け」自体は動作しているものの、 spaCyの解析結果が必ずしも学習参考書の解説と一致するとは限らない、という課題があります。 また、複数文をまとめて解析する際のUI(段落単位での折りたたみなど)もまだ整っていません。

解析結果と「人間の感覚」のズレへの対応が未完 段落単位・長文用のUI改善が必要

動画リンク

英文を入力して解析ボタンを押すと、構文ブロックが色付きで浮かび上がるまでの操作を収録したデモ動画です。

英文入力 → 構文解析 → 色分け表示の流れ

まだできていない部分と今後

「読む」「覚える」「話す」をつなぐ英語環境へ

Englishingは今のところ「読む」支援が中心ですが、 将来的には、構文ブロックと単語帳・音声練習をリンクさせて、 一つのアプリの中で「読む→覚える→話す」まで回せる環境にしたいと考えています。

  • 短期: spaCyベースの解析を安定させ、よく使う構文(that節・関係代名詞・分詞構文・仮定法など)のプリセット色分けを整える。
  • 中期: GPT APIなども組み合わせ、「このブロックが文全体で果たしている役割」を自然文でコメントとして表示する機能。
  • 長期: 音読・シャドーイングアプリや、単語・熟語リストと連携し、学習ログを一元管理できる英語学習環境へ発展。

これからの改善点と開発計画

NLP精度・UI・学習導線の3つの軸で改善していきます。

  • NLP: spaCyのカスタムルール追加、ルールベース構文検出(so ... that構文など)の実装。
  • UI: 長文時のスクロール・折りたたみ、構文別フィルタ(例:that節だけをハイライト)を追加。
  • 学習導線: よく間違える構文ブロックを自動で集計し、復習用のミニテストを生成。
17
18
19
20
21
22
23
24
25
26
27
28
29
30
構文ブロック抽出ルールの整備
長文用UI(折りたたみ・フィルタ)の実装
よく間違える構文の集計と復習機能

このプロジェクトを通して

感じていること

数式やプログラムの世界に比べると、言語はどうしても「あいまい」な部分が多くて、 解析結果も「絶対にこれが正しい」とは言い切れません。 それでも、構文を一度可視化してしまうと、 自分がどこで詰まっているのかがはっきり見えるようになりました。

今の自分へのメモ

  • ・完璧な構文解析を目指すより、「学習に役立つ誤差」を許容する設計にすること。
  • ・解析精度よりも、「読みたい英文をどんどん投げ込めるUX」を大事にすること。

リファレンス & リンク

リファレンス

  • spaCy Documentation(Tokenization, POS Tagging, Dependency Parsing)
  • FastAPI / Flask Documentation(REST API設計)
  • Jetpack Compose Text / AnnotatedString / SpanStyle
  • 英語長文読解の構文解説書(that節・分詞構文・関係代名詞など)

リンク