導入
Web開発において、文字列を「単語」や「文」ごとに分割したい場面は多々あります。特に日本語などの非空白言語では、スペースで区切ることができないため、これまでは正規表現を用いた複雑な処理が必要でした。しかし、現在では Intl.Segmenter を使うことで、ブラウザ標準の強力なエンジンを用いて、言語に応じた正確なテキスト分割が簡単に実現できます。これにより、意図しない場所での単語の分断を防ぎ、より自然なUI構築が可能になります。
基礎知識
Intl.Segmenter は、JavaScriptの国際化対応APIの一部です。このAPIの最大の特徴は、Unicodeの「UAX #29(Unicode Text Segmentation)」という国際標準規格に基づいている点です。
主な分割単位には以下の3種類があります。
・grapheme: 文字(書記素)単位。絵文字の結合なども考慮されます。
・word: 単語単位。日本語の形態素解析に近い挙動をします。
・sentence: 文単位。句読点などを基準に分割します。
実装/解決策
Intl.Segmenterを使用するには、まずコンストラクタで言語(locale)と分割単位(granularity)を指定してインスタンスを作成します。次に、そのインスタンスの segment() メソッドに分割したい文字列を渡すだけです。戻り値はイテラブルなオブジェクトであり、各セグメントには「分割されたテキスト」と「その位置情報」が含まれます。
サンプルプログラム
以下のコードは、日本語の文章を単語単位で分割し、コンソールに表示する実用的な例です。
// 日本語向けに「単語」単位で分割する設定を作成
const segmenter = new Intl.Segmenter('ja-JP', { granularity: 'word' });
const text = "私はフロントエンドエンジニアです。";
// segmentメソッドでテキストを解析
const segments = segmenter.segment(text);
// 各セグメントをループで処理
for (const segment of segments) {
// segment.segment: 分割された文字列
// segment.index: 文字列内の開始位置
// segment.isWordLike: 単語として意味を持つか(記号などはfalseになる)
console.log(`単語: ${segment.segment}, 位置: ${segment.index}, 意味を持つか: ${segment.isWordLike}`);
}
応用・注意点
1. ブラウザ対応状況: Intl.Segmenterは主要なモダンブラウザでサポートされていますが、古いブラウザやIEでは動作しません。必要に応じてポリフィルを検討してください。
2. パフォーマンス: テキストの解析はブラウザのネイティブエンジンで行われるため非常に高速ですが、極端に長いテキストを一括処理するとメインスレッドをブロックする可能性があります。大量のテキストを扱う際はWeb Workerの利用を検討しましょう。
3. 精度の限界: 辞書ベースの高度な形態素解析(MeCabなど)と比較すると、特定の専門用語の分割精度が劣る場合があります。あくまで「言語ごとの一般的なルールに基づく分割」であることを理解して活用してください。