2010-02-23 6 views
6

Ich muss eine Reihe von gemischten asiatischen Zeichen nehmen (vorerst nur chinesische Kanji oder japanische Kanji/Hiragana/Katakana annehmen) und "Alphanumeric" (dh , Enlgish, Französisch), und zählen Sie es auf folgende Weise:mit Javascript, wie kann ich eine Mischung aus asiatischen Zeichen und englischen Wörtern zählen

1) zählen Sie jeden asiatischen CHARACTER als 1; 2) zähle jedes alphanumerische Wort als 1;

einige Beispiele:

株式会社 myCompany = 4 Zeichen + 1 Wort = 5 Gesamt 株式会社 マ イ コ = 7 Zeichen


meine einzige Idee ist, so weit zu verwenden:

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

und dann überprüfen Sie jedes Element, um zu sehen, ob sein Inhalt alphanumerisch ist (also zählen Sie wie 1) oder nicht (nehmen Sie also die Array-Länge). Aber ich glaube nicht, dass das wirklich sehr schlau ist und der Text, der gezählt wird, könnte bis zu 10.000 Wörter umfassen, also nicht sehr schnell.

Ideen?

+0

Sie können ein asiatisches Zeichen nicht von anderen Multibyte-Zeichen unterscheiden. – shinkou

+2

Sicher kannst du. Sie haben schließlich unterschiedliche Werte. – Annabelle

+1

Danke, alle zusammen. Wir haben uns tatsächlich festgelegt: var charArray = val.match (/ \ w + | [^., \ Uff10- \ uFF19, \ uFF9E, \ uFF9F]/g); Warnung (charArray.length); Wir waren nicht interessiert an der Zählung von asiatischen Wörtern, wir benötigten Anzahl der Zeichen plus Anzahl der alphanumerischen Wörter. Wir müssen ein paar Exclude-Codes hinzufügen, denke ich, aber das ist ein guter Anfang. – user224513

Antwort

-2

Ich denke, Sie möchten alle Zeichen durchlaufen, und erhöhen Sie einen Zähler jedes Mal, wenn das aktuelle Zeichen in einem anderen Wort (gemäß Ihrer Definition) als das vorherige ist.

-1

Sie können über jedes Zeichen im Text iterieren und jedes Wort untersuchen, um nach Wortpausen zu suchen. Im folgenden Beispiel wird jeder chinesische/japanische/koreanische (CJK) Ideograph als einzelnes Wort gezählt und alle alphanumerischen Zeichenfolgen als einzelne Wörter behandelt.

Einige Hinweise auf meine Implementierung: richtig

  1. Es ist wahrscheinlich keine Zeichen mit Akzent behandeln. Sie werden wahrscheinlich Wortbrüche auslösen. Sie können die wordBreakRegEx ändern, um dies zu beheben.

  2. cjkRegEx enthält einige der esoterischen Codepunktbereiche nicht, da sie 5 Hexadezimalziffern benötigen, um darauf zu verweisen, und die Regex-Engine von JavaScript scheint das nicht zuzulassen. Aber Sie müssen sich wahrscheinlich nicht darum kümmern, da ich glaube nicht einmal, dass die meisten Schriften sie enthalten.

  3. Ich habe absichtlich japanische Hiragana und Katakana aus cjkRegEx verlassen, da ich mir nicht sicher bin, wie Sie damit umgehen wollen. Je nachdem, um welchen Text es sich handelt, ist es sinnvoller, Strings als einzelne Wörter zu behandeln. In diesem Fall müssten Sie Logik hinzufügen, um zu erkennen, dass Sie sich in einem "Kana-Wort" gegenüber einem "alphanumerischen Wort" befinden. Wenn es Ihnen egal ist, müssen Sie nur ihre Codepunktbereiche zu cjkRegEx hinzufügen. Natürlich könnten Sie versuchen, Wortumbrüche in Kana-Strings zu erkennen, aber das wird schnell sehr hart.

Beispielimplementierung:

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

Die Unihan Database ist sehr hilfreich für die in Unicode über CJK zu lernen. Natürlich hat auch die Unicode home page viele Informationen.

+0

Nicht sehr nützlich, außer zum Beispiel Pseudocode. 1) In der Beispielimplementierung fehlt eine schließende Klammer am Ende der for-Schleife, die sie vollständig unterbricht. 2) Wenn Sie das beheben, zählen englische Wörter nicht richtig. 3) Es zählt auch keine japanischen Wörter, weil der Autor Hiragana und Katakana weggelassen hat. – fotoflo

3

Leider unterstützt JavaScript RegExp keine Unicode-Zeichenklassen; \w gilt nur für ASCII-Zeichen (modulo einige Browser-Bugs).

Sie können Unicode-Zeichen jedoch in Gruppen verwenden. Sie können dies also tun, wenn Sie jeden Satz von Zeichen, die Sie interessieren, als Bereich isolieren können. zB .:

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; 

(Dies versucht, eine realistischere Zahl ‚Worte‘ für Japanisch zu geben, jeden Lauf einer Art von kana als ein Wort zu zählen. Das ist immer noch nicht richtig, natürlich, aber es ist wahrscheinlich näher als jede Silbe als ein Wort zu behandeln.)

Offensichtlich gibt es viel mehr Zeichen, die berücksichtigt werden müssten, wenn Sie "es richtig tun wollten". Hoffen wir, dass Sie keine Charaktere außerhalb des grundlegenden mehrsprachigen Flugzeugs haben!

Verwandte Themen