6

アジア文字 (今のところ、中国語の漢字または日本語の漢字/ひらがな/カタカナのみを想定) と "英数字" (つまり、英語、フランス語) の混合文字列を取得し、次のようにカウントする必要があります。

1) 各アジア文字を 1 としてカウントします。2) 各英数字 WORD を 1 としてカウントします。

いくつかの例:

株式会社myCompany = 4文字 + 1ワード = 合計5文字 株式会社マイコ = 7文字


これまでの私の唯一のアイデアは、使用することです:

var wordArray=val.split(/\w+/);

次に、各要素をチェックして、その内容が英数字であるか (1 として数えます)、そうでないか (配列の長さを取得します) を確認します。しかし、私はそれが本当に非常に賢いとはまったく感じていません。カウントされるテキストは最大 10,000 ワードになる可能性があるため、それほど速くはありません。

アイデア?

4

3 に答える 3

3

残念ながら、JavaScriptRegExpはUnicode文字クラスをサポートしていません。\wASCII文字にのみ適用されます(一部のブラウザのバグを法として)。

ただし、Unicode文字はグループで使用できるため、関心のある文字の各セットを範囲として分離できる場合は、Unicode文字を使用できます。例えば。:

var r= new RegExp(
    '[A-Za-z0-9_\]+|'+                             // ASCII letters (no accents)
    '[\u3040-\u309F]+|'+                           // Hiragana
    '[\u30A0-\u30FF]+|'+                           // Katakana
    '[\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF]',   // Single CJK ideographs
'g');

var nwords= str.match(r).length;

(これは、日本語の「単語」のより現実的な数を与えようとし、1種類のかなの各実行を単語として数えます。もちろん、それはまだ正しくありませんが、各音節を1つの単語として扱うよりもおそらく近いです。)

明らかに、「適切に実行」したい場合は、説明する必要のある文字がもっとたくさんあります。たとえば、基本多言語面の外にキャラクターがいないことを願っています!

于 2010-02-23T02:06:48.173 に答える
-1

テキスト内の各文字を繰り返し処理して、各文字を調べて単語の区切りを探すことができます。次の例では、これを行い、各中国語/日本語/韓国語(CJK)のイデオグラフを単一の単語としてカウントし、すべての英数字の文字列を単一の単語として扱います。

私の実装に関するいくつかのメモ:

  1. アクセント付き文字を正しく処理できない可能性があります。それらはおそらく単語の区切りをトリガーします。これを修正するためにを変更できますwordBreakRegEx

  2. cjkRegEx参照するのに5桁の16進数が必要であり、JavaScriptの正規表現エンジンではそれができないように見えるため、より難解なコードポイント範囲の一部は含まれていません。しかし、ほとんどのフォントにこれらが含まれているとは思わないので、おそらくこれらについて心配する必要はありません。

  3. 日本のひらがなとカタカナはcjkRegEx、どのように処理するかわからないため、意図的に除外しました。扱っているテキストの種類によっては、それらの文字列を単一の単語として扱う方が理にかなっている場合があります。その場合、「英数字の単語」ではなく「カナの単語」にあることを認識するロジックを追加する必要があります。気にしない場合は、コードポイント範囲をに追加するだけですcjkRegEx。もちろん、かな文字列内の単語の区切りを認識しようとすることもできますが、それはすぐに非常に困難になります。

実装例:

function getWordCount(text) {
  // This matches all CJK ideographs.
  var cjkRegEx = /[\u3400-\u4db5\u4e00-\u9fa5\uf900-\ufa2d]/;

  // This matches all characters that "break up" words.
  var wordBreakRegEx = /\W/;

  var wordCount = 0;
  var inWord = false;
  var length = text.length;
  for (var i = 0; i < length; i++) {
    var curChar = text.charAt(i);
    if (cjkRegEx.test(curChar)) {
      // Character is a CJK ideograph.
      // Count it as a word.
      wordCount += inWord ? 2 : 1;
      inWord = false;
    } else if (wordBreakRegEx.test(curChar)) {
      // Character is a "word-breaking" character.
      // If a word was started, increment the word count.
      if (inWord) {
        wordCount += 1;
        inWord = false;
    } else {
      // All other characters are "word" characters.
      // Indicate that a word has begun.
      inWord = true;
    }
  }

  // If the text ended while in a word, make sure to count it.
  if (inWord) {
    wordCount += 1;
  }

  return wordCount;
}

Unihanデータベースは、UnicodeでCJKについて学習するのに非常に役立ちます。もちろん、Unicodeホームページにはたくさんの情報があります。

于 2010-02-23T01:58:29.477 に答える
-2

すべての文字をループし、現在の文字が前の文字とは異なる単語 (定義によると) にあるたびにカウンターを増やしたいと思います。

于 2010-02-23T01:14:15.503 に答える