Saltar al contenido

Detectar idioma de string en PHP

El tutorial o código que encontrarás en este artículo es la resolución más fácil y efectiva que encontramos a esta duda o problema.

Solución:

He usado el paquete pera Text_LanguageDetect con algunos resultados razonables. Es muy fácil de usar y tiene una modesta base de datos de 52 idiomas. La desventaja es que no detecta los idiomas de Asia oriental.

require_once 'Text/LanguageDetect.php';
$l = new Text_LanguageDetect();
$result = $l->detect($text, 4);
if (PEAR::isError($result)) 
    echo $result->getMessage();
 else 
    print_r($result);

resultados en:

Array
(
    [german] => 0.407037037037
    [dutch] => 0.288065843621
    [english] => 0.283333333333
    [danish] => 0.234526748971
)

No puede detectar el idioma a partir del tipo de carácter. Y no hay formas infalibles de hacer esto.

Con cualquier método, solo estás haciendo una conjetura educada. Hay disponibles algunos artículos relacionados con las matemáticas por ahí.

Sé que esta es una publicación anterior, pero esto es lo que desarrollé después de no encontrar ninguna solución viable.

  • otras sugerencias son demasiado pesadas y engorrosas para mi situación
  • yo apoyo un número finito de idiomas en mi sitio web (en este momento dos: ‘en’ y ‘de’ – pero la solución se generaliza para más).
  • Necesito una conjetura plausible sobre el idioma de un mensaje generado por el usuario stringy tengo una alternativa (la configuración de idioma del usuario).
  • Entonces quiero una solución con mínimo false positivos – pero no te preocupes tanto por false negativos.

La solución usa las 20 palabras más comunes en un idioma, cuenta las ocurrencias de aquellas en el pajar. Luego, solo compara los recuentos del primer y segundo idioma más contados. Si el segundo lugar es menos del 10% del ganador, el ganador se lo lleva todo.

Código – ¡Cualquier sugerencia para mejorar la velocidad es más que bienvenida!

    function getTextLanguage($text, $default) 
      $supported_languages = array(
          'en',
          'de',
      );
      // German word list
      // from http://wortschatz.uni-leipzig.de/Papers/top100de.txt
      $wordList['de'] = array ('der', 'die', 'und', 'in', 'den', 'von', 
          'zu', 'das', 'mit', 'sich', 'des', 'auf', 'für', 'ist', 'im', 
          'dem', 'nicht', 'ein', 'Die', 'eine');
      // English word list
      // from http://en.wikipedia.org/wiki/Most_common_words_in_English
      $wordList['en'] = array ('the', 'be', 'to', 'of', 'and', 'a', 'in', 
          'that', 'have', 'I', 'it', 'for', 'not', 'on', 'with', 'he', 
          'as', 'you', 'do', 'at');
      // French word list
      // from https://1000mostcommonwords.com/1000-most-common-french-words/
      $wordList['fr'] = array ('comme', 'que',  'tait',  'pour',  'sur',  'sont',  'avec',
                         'tre',  'un',  'ce',  'par',  'mais',  'que',  'est',
                         'il',  'eu',  'la', 'et', 'dans');

      // Spanish word list
      // from https://spanishforyourjob.com/commonwords/
      $wordList['es'] = array ('que', 'no', 'a', 'la', 'el', 'es', 'y',
                         'en', 'lo', 'un', 'por', 'qu', 'si', 'una',
                         'los', 'con', 'para', 'est', 'eso', 'las');
      // clean out the input string - note we don't have any non-ASCII 
      // characters in the word lists... change this if it is not the 
      // case in your language wordlists!
      $text = preg_replace("/[^A-Za-z]/", ' ', $text);
      // count the occurrences of the most frequent words
      foreach ($supported_languages as $language) 
        $counter[$language]=0;
      
      for ($i = 0; $i < 20; $i++) 
        foreach ($supported_languages as $language) 
          $counter[$language] = $counter[$language] + 
            // I believe this is way faster than fancy RegEx solutions
            substr_count($text, ' ' .$wordList[$language][$i] . ' ');;
        
      
      // get max counter value
      // from http://stackoverflow.com/a/1461363
      $max = max($counter);
      $maxs = array_keys($counter, $max);
      // if there are two winners - fall back to default!
      if (count($maxs) == 1) 
        $winner = $maxs[0];
        $second = 0;
        // get runner-up (second place)
        foreach ($supported_languages as $language) 
          if ($language <> $winner) 
            if ($counter[$language]>$second) 
              $second = $counter[$language];
            
          
        
        // apply arbitrary threshold of 10%
        if (($second / $max) < 0.1) 
          return $winner;
         
      
      return $default;
    

valoraciones y comentarios

Si conservas alguna desconfianza y forma de reaccionar nuestro enunciado eres capaz de añadir una explicación y con mucho gusto lo observaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *