こんにちは!今回は、形態素解析を使ったアプリを作った際の経験をここに綴っていこうと思います
はじめに...
今回のプロジェクトでは、「日本語文章から意味のある単語を取り出す」ことが必要なものでした
以前、形態素解析はさらっとやってみた経験があったので、今回もなんとなく理解できるかなと思っていたのですが、想像以上に複雑で日本語処理の奥深さ・難しさを強く感じました
※プロジェクト自体は AI を活用しながら実装していたため、大きく詰まることはありませんでしたが、
自分の知識として理解したいと思い、改めて「形態素解析」について整理してみることにしました。
日本語の自由記述ならではの難しさ
日本語は英語と違って
- 単語の区切りが明示できない
- 文脈によっては意味が変わってくる
という特徴を持っています
英語ではできる「文字間の空白で文章を分解する」という方法では、
文章の内容を正しく分解することができない。(ここが本当に辛い)
そのため、日本語の場合は以下の対応が求められます
- 文章が「何について書かれているか」を知る
- 特徴的な単語を抽出する
想像以上に大変だったポイント①:欲しい単語粒度が一定ではない
形態素解析を使えば単語は分割されますが、
その分割結果が常に “欲しい形” になるとは限らないことに気づきました。
例えば、
| 単語 | 荒い粒度 | 細かい粒度 |
| 「吾輩は猫である」 | 吾輩は/猫で/ある | 吾輩/は/猫/で/ある |
| 「まりも」 | まりも | まり/も |
| 「アプリ開発」 | アプリ開発 | アプリ/開発 |
1語として扱いたい場面もあれば、
分解した方が都合が良い場面もあります。
解析結果としては正しくても、
要件に合わない分割結果になることがあるため、
そのまま使えないケースが多くありました。
想像以上に大変だったポイント②:意味抽出には後処理が不可欠
案件の目的は「文章を分解すること」ではなく「文章の意味を捉えること」 でした。
しかし、解析結果には
は / が / を / に
する / ある / いる
といった単語も大量に含まれます。
これらは文法的には重要ですが、内容把握という観点ではノイズになってきます
そのため、
- 名詞のみを対象にする
- ストップワードを定義する又はストップワードをユーザーに入力してもらう
など、形態素解析後の設計と調整が重要な作業となりました
想像以上に大変だったポイント③:ライブラリは要件を理解してくれない
形態素解析ライブラリ自体は非常に高機能ですが、
- 専門用語
- 新しい技術名
については、期待通りに処理されないことも多くあります
「ライブラリを使えば要件が自動的に満たされる」わけではなく、
要件を満たすために、解析結果をどう扱うかは実装した人次第だと感じました
実装を通して学んだこと
日本語処理は、さまざまな文法が密に関わって一文を作るので複雑な設計が必要でした
正しい解析結果 ≠ 目的に合った結果 となることが多くそれに合うように調整を考える必要がありました。何気なく普段使っているAIも日本語処理を難なくこなしていると思うと、本当にすごいことだと実感しました
おわりに
今回の開発では、
「形態素解析を使う」という技術要件があったからこそ、
日本語処理の難しさと向き合うことになりました。
AIと一緒に実装したとはいえ、エラーチェックやテストは人間が行うので、思い通りにいかない場面や
要件にあっているかを確認しながら開発を進めていく部分は実務に近い学びになったと感じています。これから日本語処理に取り組む人の参考になれば嬉しいです。