menggunakan javascript, bagaimana cara menghitung campuran karakter Asia dan kata-kata bahasa Inggris

Saya perlu mengambil serangkaian karakter campuran Asia (untuk saat ini, asumsikan hanya kanji Cina atau kanji/hiragana/katakana Jepang) dan "Alfanumerik" (yaitu, Enlgish, Prancis), dan menghitungnya dengan cara berikut:

1) hitung setiap KARAKTER Asia sebagai 1; 2) hitung setiap KATA Alfanumerik sebagai 1;

beberapa contoh:

株式会社Perusahaanku = 4 karakter + 1 kata = 5 total 株式会社マイコ = 7 karakter


satu-satunya ide saya sejauh ini adalah menggunakan:

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

dan kemudian periksa setiap elemen untuk melihat apakah isinya alfanumerik (jadi hitung sebagai 1) atau tidak (jadi ambil panjang arraynya). Tapi menurut saya itu sama sekali tidak pintar dan teks yang dihitung mungkin mencapai 10.000 kata, jadi tidak terlalu cepat.

Ide ide?


person user224513    schedule 23.02.2010    source sumber
comment
Anda tidak dapat membedakan karakter Asia dari karakter multibyte lainnya.   -  person shinkou    schedule 23.02.2010
comment
Tentu kamu bisa. Bagaimanapun, mereka memiliki nilai yang berbeda.   -  person Annabelle    schedule 23.02.2010
comment
Terima kasih semuanya. Kami sebenarnya memilih: var charArray=val.match(/\w+|[^.,0-9, ゙, ゚ ]/g); alert(charArray.panjang); Kami tidak tertarik dengan jumlah kata dalam bahasa Asia, kami memerlukan jumlah karakter ditambah jumlah kata alfanumerik. Menurut saya, kita perlu menambahkan beberapa kode pengecualian, tetapi ini adalah awal yang baik.   -  person user224513    schedule 24.02.2010


Jawaban (3)


Sayangnya RegExp JavaScript tidak mendukung kelas karakter Unicode; \w hanya berlaku untuk karakter ASCII (modulo beberapa bug browser).

Anda dapat menggunakan karakter Unicode dalam grup, sehingga Anda dapat melakukannya jika Anda dapat mengisolasi setiap kumpulan karakter yang Anda minati sebagai suatu rentang. misalnya.:

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;

(Ini mencoba memberikan penghitungan 'kata' yang lebih realistis untuk bahasa Jepang, menghitung setiap rangkaian satu jenis kana sebagai sebuah kata. Tentu saja itu masih kurang tepat, tetapi mungkin lebih mendekati daripada memperlakukan setiap suku kata sebagai satu kata.)

Tentunya masih banyak lagi karakter yang harus dipertanggungjawabkan jika ingin ‘melakukannya dengan benar’. Semoga saja Anda tidak memiliki karakter di luar bidang dasar multibahasa!

person bobince    schedule 23.02.2010

Anda dapat mengulangi setiap karakter dalam teks, memeriksa masing-masing karakter untuk mencari jeda kata. Contoh berikut melakukan hal ini, menghitung setiap ideograf China/Jepang/Korea (CJK) sebagai satu kata, dan memperlakukan semua string alfanumerik sebagai kata tunggal.

Beberapa catatan tentang implementasi saya:

  1. Mungkin tidak menangani karakter beraksen dengan benar. Mereka mungkin akan memicu jeda kata. Anda dapat memodifikasi wordBreakRegEx untuk memperbaikinya.

  2. cjkRegEx tidak menyertakan beberapa rentang titik kode yang lebih esoteris, karena memerlukan 5 digit hex untuk referensi dan mesin regex JavaScript sepertinya tidak mengizinkan Anda melakukan itu. Namun Anda mungkin tidak perlu mengkhawatirkan hal ini, karena menurut saya sebagian besar font tidak menyertakannya.

  3. Saya sengaja tidak memasukkan Hiragana dan Katakana Jepang dari cjkRegEx, karena saya tidak yakin bagaimana Anda ingin menanganinya. Bergantung pada jenis teks yang Anda hadapi, mungkin lebih masuk akal untuk memperlakukan rangkaian teks sebagai kata tunggal. Dalam hal ini, Anda perlu menambahkan logika untuk mengenali keberadaan dalam "kata kana" versus "kata alfanumerik". Jika Anda tidak peduli, Anda hanya perlu menambahkan rentang titik kodenya ke cjkRegEx. Tentu saja, Anda dapat mencoba mengenali jeda kata dalam string kana, tetapi hal itu dengan cepat menjadi Sangat Sulit.

Contoh implementasi:

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;
}

Database Unihan sangat membantu untuk mempelajari CJK secara unicode. Tentu saja beranda Unicode memiliki banyak informasi.

person Annabelle    schedule 23.02.2010
comment
Tidak terlalu berguna kecuali misalnya pseudocode. 1) Contoh implementasi tidak memiliki tanda kurung tutup di akhir perulangan for, sehingga merusak seluruhnya. 2) Jika Anda memperbaikinya, kata-kata bahasa Inggris tidak dihitung dengan benar. 3) Kata-kata dalam bahasa Jepang juga tidak dihitung karena penulis mengabaikan Hiragana dan Katakana. - person fotoflo; 22.11.2015

Saya pikir Anda ingin mengulang semua karakter, dan menambah penghitung setiap kali karakter saat ini berada dalam kata yang berbeda (menurut definisi Anda) dari yang sebelumnya.

person Thilo    schedule 23.02.2010