Библиотека PHP/класс для подсчета слов на разных языках?

Некоторое время в ближайшем будущем мне понадобится выполнить кросс-язычный подсчет слов, или если это невозможно, количество символов в перекрестном языке.

Под словом "счет" подразумевается точное количество слов, содержащихся в данном тексте, с использованием языка текста. Язык текста задается пользователем и будет считаться правильным.

По количеству символов я имею в виду подсчет символов "возможно в слове", содержащихся в данном тексте, с той же информацией о языке, которая описана выше.

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

Мне понравилось бы, если бы мне просто пришлось посмотреть на английский, но мне нужно рассмотреть каждый язык здесь, китайский, корейский, английский, арабский, хинди и т.д.

Я хотел бы знать, есть ли у Qaru какие-либо выводы о том, где начать поиск существующего продукта/метода для этого в PHP, поскольку я - хороший ленивый программист *

Простой тест, показывающий, как str_word_count с set_locale не работает, и функцию из страницы str_word_count php.net.

* http://blogoscoped.com/archive/2005-08-24-n14.html

Ответ 1

Подсчет символов легко:

echo strlen('一个有十的字符的句子'); // 30 (WRONG!)
echo strlen(utf8_decode('一个有十的字符的句子')); // 10

Подсчет слов - это то, где вещи начинают становиться сложными, особенно для китайского, японского и других языков, которые не используют пробелы (или другие общие символы "границы слова" ) в качестве разделителей слов. Я не говорю по-китайски, и я не понимаю, как работает подсчет слов на китайском языке, поэтому вам придется немного меня обучить - что говорит слово на этих языках? Это какой-то конкретный char или набор символов? Я помню, как читал что-то, связанное с тем, как трудно было идентифицировать японские слова в записи T9, но больше не может этого найти.

Следующее должно правильно возвращать количество слов на языках, которые используют пробелы или символы пунктуации в качестве разделителей слов:

count(preg_split('~[\p{Z}\p{P}]+~u', $string, null, PREG_SPLIT_NO_EMPTY));

Ответ 2

Быстрый трюк, если вы хотите только приблизительные и не точные слова

<?php echo count(explode(' ',$string)); ?>

Он работает путем подсчета пробелов на любом языке. Я использовал это для сценария переводчика. Снова это не будет считать точные слова, но даст приблизительные слова в параграфе.

Ответ 3

Ну, попробуйте:

<?
function count_words($str){
     $words = 0;
     $str = eregi_replace(" +", " ", $str);
     $array = explode(" ", $str);
     for($i=0;$i < count($array);$i++)
      {
         if (eregi("[0-9A-Za-zÀ-ÖØ-öø-ÿ]", $array[$i]))
             $words++;
     }
     return $words;
 }
 echo count_words('This is the second one , it will count wrong as well" , it will count 12 instead of 11 because the comma is counted too.');
 ?>