Определение языка в PHP (UTF-8) - PullRequest
3 голосов
/ 04 февраля 2009

Какие есть фрагменты кода для определения языка фрагмента текста UTF-8? Мне нужно отфильтровать большое количество спама на китайском и арабском языках. Для этого есть расширение PECL, но я хочу сделать это исключительно в коде PHP. Я предполагаю, что мне нужно перебрать строку Unicode с версией ord () для Unicode, а затем создать некую таблицу диапазонов для разных языков.

Ответы [ 4 ]

4 голосов
/ 05 февраля 2009

Передайте текст через Определение языка Google . Вы можете сделать это через AJAX. Вот документация / руководство разработчика . Например:

<html>
  <head>
    <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    <script type="text/javascript">

    google.load("language", "1");

    function initialize() {
      var text = document.getElementById("text").innerHTML;
      google.language.detect(text, function(result) {
        if (!result.error && result.language) {
          google.language.translate(text, result.language, "en",
                                    function(result) {
            var translated = document.getElementById("translation");
            if (result.translation) {
              translated.innerHTML = result.translation;
            }
          });
        }
      });
    }
    google.setOnLoadCallback(initialize);

    </script>
  </head>
  <body>
    <div id="text">你好,很高興見到你。</div>
    <div id="translation"></div>
  </body>
</html>
2 голосов
/ 04 февраля 2009

Вы можете перевести строку UTF-8 в ее кодовые точки Unicode и искать «подозрительные диапазоны».

function utf8ToUnicode($utf8)
{
    if (!is_string($utf8)) {
        return false;
    }
    $unicode  = array();
    $mbbytes  = array();
    $mblength = 1;
    $strlen   = strlen($utf8);

    for ($i = 0; $i < $strlen; $i++) {
        $byte = ord($utf8{$i});
        if ($byte < 128) {
            $unicode[] = $byte;
        } else {
            if (count($mbbytes) == 0) {
                $mblength = ($byte < 224) ? 2 : 3;
            }
            $mbbytes[] = $byte;
            if (count($mbbytes) == $mblength) {
                if ($mblength == 3) {
                    $unicode[] = ($mbbytes[0] & 15) * 4096 + ($mbbytes[1] & 63) * 64 + ($mbbytes[2] & 63);
                } else {
                    $unicode[] = ($mbbytes[0] & 31) * 64 + ($mbbytes[1] & 63);
                }
                $mbbytes = array();
                $mblength = 1;
            }
        }
    }
    return $unicode;
}
0 голосов
/ 09 августа 2016

арабские символы в основном находятся в диапазон Unicode 0600–06FF . Unicode имеет несколько дополнений и т. Д. Для арабского языка. Например, диапазон кода 0750–077F содержит в основном арабские символы, которые используются главным образом в некоторых африканских языках. Диапазон кодов 08A0–08FF охватывает еще несколько букв для африканских языков, для Европы и Центральной Азии языки, пакистанские марки Корана и т. д. Два других диапазона кодов Unicode для арабского языка, FB50 – FDFF и FE70 – FEFF , вероятно, менее важны, если вы уже охватили 0600–06FF.

Символы для Китайский (и японский и корейский) зарегистрированы в другом диапазоне Юникода (с несколькими расширениями). Наиболее важным из них является 4E00–9FD5 . Предполагая, что вам не нужно беспокоиться о японском языке, этого должно быть достаточно для обнаружения сценариев , но если вы хотите проверить расширения, проверьте список кодов Консорциума Unicode .

Так что, если вам нужно отфильтровать только арабские и китайские скрипты и не хотите использовать подход, предложенный troelskn (т.е. использовать списки общих слов для языков, которые вы хотите идентифицировать - это делает не слишком хорошо масштабируется для большого количества языков), достаточно определить диапазон кодов символов на вводе. StackOverflow уже решил ранее заданный вопрос о , как определять диапазоны Unicode в PHP .

0 голосов
/ 04 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...