использование JavaScript, как я могу считать соединение азиатских символов и английских слов

Я должен взять строку смешанных азиатских символов (на данный момент, предположить только китайское кандзи или японский kanji/hiragana/katakana), и "Алфавитно-цифровой" (т.е. Enlgish, французский язык), и считайте его следующим образом:

1) считайте каждый азиатский СИМВОЛ как 1; 2) считайте каждый Алфавитно-цифровой WORD как 1;

несколько примеров:

 myCompany = 4 символа + 1 слово = 5 общих количеств 株式会社マイコ = 7 символов


моя единственная идея до сих пор состоит в том, чтобы использовать:

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

и затем проверьте каждый элемент, чтобы видеть, является ли его содержание алфавитно-цифровым (так количество как 1) или не (поэтому возьмите длину массива). Но я не чувствую, что это действительно очень умно вообще, и считаемый текст мог бы составить 10,000words, таким образом, не очень быстр.

Идеи?

6
задан Joe Doyle 30 April 2012 в 21:08
поделиться

3 ответа

Вы можете перебирать каждый символ в тексте, рассматривая каждый из них на предмет разрыва слов. Следующий пример делает это, считая каждую китайскую/японскую/корейскую (CJK) идеограмму как одно слово, и рассматривая все буквенно-цифровые строки как отдельные слова.

Некоторые замечания по моей реализации:

  1. Вероятно, она неправильно обрабатывает акцентированные символы. Вероятно, они будут вызывать разрывы слов. Вы можете изменить wordBreakRegEx, чтобы исправить это.

  2. cjkRegEx не включает некоторые из более эзотерических диапазонов кодовых точек, поскольку для ссылки на них требуется 5 шестнадцатеричных цифр, а механизм regex 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 Database очень полезна для изучения CJK в юникоде. Также, конечно, на главной странице Unicode есть много информации.

-1
ответ дан 18 December 2019 в 04:52
поделиться

Можно посмотреть, как Zend Framework реализовал компонент Plugin Loader .

В основном задается путь к месту хранения подключаемых модулей, и загрузчик пытается загрузить первый подключаемый модуль, найденный способом LIFO.

-121--4998113-

В своих тестах вы можете включить в себя интерфейс и имитировать его:

interface IHttpContextValues
{
    string HttpHost { get; }
}

class HttpContextValues : IHttpContextValues
{
    public string HttpHost
    {
        get { return HttpContext.Current.Request.ServerVariables["HTTP_HOST"]; }
    }
}

class BaseController : Controller
{
    public IHttpContextValues HttpContextValues;
    BaseController()
    {
        HttpContextValues = new HttpContextValues();
    }
}

Затем в коде контроллера вместо ControleyContext. Не нужно делать никаких комбинаций о насмешках.

-121--4950402-

К сожалению, JavaScript RegExp не поддерживает классы символов Юникода; \w применяется только к символам ASCII (по модулю некоторые ошибки браузера).

Однако вы можете использовать символы Юникода в группах, чтобы сделать это, если вы можете выделить каждый интересующий вас набор символов как диапазон. например:

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;

(Это пытается дать более реалистичный подсчет "слов" для японского языка, считая каждый прогон одного типа каны как слово. Это все еще не правильно, конечно, но это, вероятно, ближе, чем рассматривать каждый слог как одно слово.)

Очевидно, что есть гораздо больше символов, которые должны быть учтены, если вы хотите "сделать это должным образом". Будем надеяться, что у вас нет символов за пределами базовой многоязычной плоскости, для одного!

3
ответ дан 18 December 2019 в 04:52
поделиться

Я думаю, вы хотите перебрать все символы и увеличивать счетчик каждый раз, когда текущий символ находится в другом слове (согласно ваше определение), чем предыдущее.

-2
ответ дан 18 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: