Библиотека PHP / Класс для подсчета слов на разных языках? - PullRequest
11 голосов
/ 29 мая 2010

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

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

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

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 17 июня 2010

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

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

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

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

count(preg_split('~[\p{Z}\p{P}]+~u', $string, null, PREG_SPLIT_NO_EMPTY));
0 голосов
/ 30 мая 2010

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

<?
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.');
 ?>
...