テキストの単語数をオンラインでカウント
任意のテキストの単語数を即座にカウントします。単語カウントの仕組み、異なる言語での単語境界の処理方法、テキスト処理で使用される一般的な単語分割アルゴリズムを学びます。
Basic Counting
詳細な説明
単語カウントの仕組み
単語カウントは一見シンプルに見えますが、「単語」の定義は意外と微妙です。基本的には、テキストを空白文字の境界で分割し、結果のトークンを数えます。
基本的なアルゴリズム
最も一般的なアプローチは、正規表現を使用して非空白文字のシーケンスにマッチさせます:
function countWords(text) {
const trimmed = text.trim();
if (trimmed.length === 0) return 0;
return trimmed.split(/\s+/).length;
}
これは1つ以上の連続する空白文字(スペース、タブ、改行)で分割し、結果の配列の長さを数えます。空文字列のチェックにより、空白入力に対して1を返すことを防ぎます。
エッジケースの処理
実際のテキストにはいくつかの複雑なケースがあります:
- 複数のスペース —
"hello world"は5単語ではなく2単語として数えるべきです。\s+正規表現が1つ以上の連続する空白文字にマッチすることでこれを処理します。 - 先頭/末尾の空白 — 分割前に入力をトリムすることで、配列の先頭や末尾に空の文字列が発生することを防ぎます。
- ハイフン付きの単語 — "well-known" は1単語か2単語か?ほとんどの単語カウンターはハイフンが空白ではないため1単語として扱います。
- 短縮形 — "don't" や "it's" はアポストロフィが空白文字ではないため、それぞれ1単語として数えられます。
- 数字 — "There are 42 items" は4単語を含みます。空白で囲まれた数字は単語として数えられます。
CJKおよび非ラテン文字
中国語、日本語、韓国語(CJK)テキストでは、単語がスペースで区切られていません。より高度なアプローチとして Intl.Segmenter APIを使用します:
const segmenter = new Intl.Segmenter("ja", { granularity: "word" });
const segments = [...segmenter.segment(text)];
const wordCount = segments.filter(s => s.isWordLike).length;
このAPIは非ラテン文字の単語境界を理解するUnicode対応のセグメンテーションルールを使用します。
Unicodeの単語境界
Unicode標準はUAX #29で単語境界ルールを定義しています。これらのルールは絵文字シーケンス(\u{1F468}\u{200D}\u{1F4BB} は1「単語」)、ゼロ幅接合子、結合文字などの複雑なケースを処理します。現代の単語カウンターは、すべての言語で正確なカウントを行うためにこれらの境界を尊重すべきです。
ユースケース
単語カウントは、記事の長さ要件を満たすライター、エッセイの単語数を確認する学生、コンテンツの長さを最適化するSEO専門家、プラットフォームの制限内で投稿を作成するソーシャルメディアマネージャーにとって不可欠です。ブロガーは通常、SEOに最適化された記事として1,500〜2,500単語を目標にします。