Detectar idioma da string em PHP

Em PHP, existe uma maneira de detectar o idioma de uma string? Suponha que a string esteja no formato UTF-8.

Não é possível detectar o idioma a partir do tipo de caractere. E não há maneiras infalíveis de fazer isso.

Com qualquer método, você está apenas fazendo um palpite educado. Existem alguns artigos relacionados com matemática lá fora.

Usei o pacote Text_LanguageDetect pear com alguns resultados razoáveis. É morto simples de usar e possui um modesto database de 52 idiomas. A desvantagem não é uma detecção das línguas do Leste Asiático.

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); } 

resulta em:

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

Você poderia fazer isso inteiramente lado do cliente com a AJAX Language API da Google (agora extinta).

Com a AJAX Language API, você pode traduzir e detectar o idioma de blocos de texto dentro de uma página usando somente Javascript. Além disso, você pode ativar a transliteração em qualquer campo de texto ou área de texto em sua página da web. Por exemplo, se você estivesse transliterando para Hindi, esta API permitirá que os usuários escrevam fonéticamente as palavras Hindi usando o inglês e que aparecem no script Hindi.

Você pode detectar automaticamente o idioma de uma string

 var text = "¿Dónde está el baño?"; google.language.detect(text, function(result) { if (!result.error) { var language = 'unknown'; for (l in google.language.Languages) { if (google.language.Languages[l] == result.language) { language = l; break; } } var container = document.getElementById("detection"); container.innerHTML = text + " is: " + language + ""; } }); 

E traduzir qualquer string escrita em um dos idiomas suportados (também extinto)

 google.language.translate("Hello world", "en", "es", function(result) { if (!result.error) { var container = document.getElementById("translation"); container.innerHTML = result.translation; } }); 

Eu sei que esta é uma publicação antiga, mas aqui é o que desenvolvi depois de não encontrar uma solução viável.

  • Outras sugestões são muito pesadas e muito pesadas para a minha situação
  • Eu apoio um número finito de idiomas no meu site (no momento dois : ‘en’ e ‘de’ – mas a solução é generalizada para mais).
  • Eu preciso de um argumento plausível sobre o idioma de uma string gerada pelo usuário, e eu tenho um retorno (a configuração de idioma do usuário).
  • Então eu quero uma solução com falsos positivos mínimos – mas não me importo tanto com falsos negativos .

A solução usa as 20 palavras mais comuns em um idioma, conta as ocorrências daquelas no palheiro. Então, ele apenas compara as contagens do primeiro e segundo idiomas mais contados. Se o número de subcampeão for inferior a 10% do vencedor, o vencedor aceita tudo.

Código – Todas as sugestões de melhoria de velocidade são mais do que bem-vindas!

  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'); // 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; } 

Como o Google Translate API está encerrando como um serviço gratuito, você pode tentar esta alternativa gratuita, que é um substituto para a Google Translate API:

http://detectlanguage.com

você pode usar a API do serviço Lnag ID http://langid.net/identify-language-from-api.html

Você provavelmente pode usar a Google Translate API para detectar o idioma e traduzi-lo, se necessário.

Eu tentei a biblioteca Text_LanguageDetect e os resultados que recebi não foram muito bons (por exemplo, o texto “teste” foi identificado como estoniano e não inglês).

Posso recomendar que você tente a Yandex Translate API, que é GRATUITA para 1 milhão de caracteres por 24 horas e até 10 milhões de caracteres por mês. Ele suporta (de acordo com a documentação) mais de 60 idiomas.

 code == 200) { if (strlen($outputJson->lang) > 0) { return $outputJson->lang; } } } return "unknown"; } function translateText($text, $targetLang) { $baseUrl = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=YOUR_API_KEY"; $url = $baseUrl . "&text=" . urlencode($text) . "&lang=" . urlencode($targetLang); $ch = curl_init($url); curl_setopt($ch, CURLOPT_CAINFO, YOUR_CERT_PEM_FILE_LOCATION); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $output = curl_exec($ch); if ($output) { $outputJson = json_decode($output); if ($outputJson->code == 200) { if (count($outputJson->text) > 0 && strlen($outputJson->text[0]) > 0) { return $outputJson->text[0]; } } } return $text; } header("content-type: text/html; charset=UTF-8"); echo identifyLanguage("エクスペリエンス"); echo "
"; echo translateText("エクスペリエンス", "en"); echo "
"; echo translateText("エクスペリエンス", "es"); echo "
"; echo translateText("エクスペリエンス", "zh"); echo "
"; echo translateText("エクスペリエンス", "he"); echo "
"; echo translateText("エクスペリエンス", "ja"); echo "
"; ?>

Uma abordagem pode ser quebrar a cadeia de input em palavras e, em seguida, procurar essas palavras em um dictionary em inglês para ver quantos estão presentes. Esta abordagem tem algumas limitações:

  • Os nomes próprios podem não ser bem tratados
  • erros de ortografia podem interromper suas pesquisas
  • abreviaturas como “lol” ou “b4” não estarão necessariamente no dictionary

Talvez envie a string para este adivinho de linguagem:

http://www.xrce.xerox.com/competencies/content-analysis/tools/guesser

Eu tomaria documentos de vários idiomas e os faria referência ao Unicode. Você poderia então usar algum raciocínio bayesiano para determinar qual idioma é apenas os caracteres unicode usados. Isso separaria o francês do inglês ou do russo.

Não tenho certeza exatamente sobre o que mais poderia ser feito, exceto a pesquisa nas palavras em dictionarys de idioma para determinar o idioma (usando uma abordagem probabilística semelhante).

Você pode ver como detectar o idioma de uma string em php usando o pacote Text_LanguageDetect Pear ou fazer o download para usá-lo separadamente, como uma biblioteca php normal.

Você pode implementar um módulo do Apache Tika com Java, inserir os resultados em um arquivo txt, um DB, etc e depois ler do arquivo, db, seja o que for com o php. Se você não tem muito conteúdo, você pode usar a API do Google, embora tenha em mente que suas chamadas serão limitadas e você só pode enviar um número restrito de caracteres para a API. No momento da escrita, terminei de testar a versão 1 (o que acabou por não ser tão preciso) e a versão dos laboratórios 2 (eu abandonei depois de ler que há um limite de 100.000 caracteres por dia) da API.

tente usar ascii codificar. Eu uso esse código para determinar ru \ en línguas no meu projeto de bot social

 function language($string) { $ru = array("208","209","208176","208177","208178","208179","208180","208181","209145","208182","208183","208184","208185","208186","208187","208188","208189","208190","208191","209128","209129","209130","209131","209132","209133","209134","209135","209136","209137","209138","209139","209140","209141","209142","209143"); $en = array("97","98","99","100","101","102","103","104","105","106","107","108","109","110","111","112","113","114","115","116","117","118","119","120","121","122"); $htmlcharacters = array("<", ">", "&", "<", ">", "&"); $string = str_replace($htmlcharacters, "", $string); //Strip out the slashes $string = stripslashes($string); $badthings = array("=", "#", "~", "!", "?", ".", ",", "<", ">", "/", ";", ":", '"', "'", "[", "]", "{", "}", "@", "$", "%", "^", "&", "*", "(", ")", "-", "_", "+", "|", "`"); $string = str_replace($badthings, "", $string); $string = mb_strtolower($string); $msgarray = explode(" ", $string); $words = count($msgarray); $letters = str_split($msgarray[0]); $letters = ToAscii($letters[0]); $brackets = array("[",",","]"); $letters = str_replace($brackets, "", $letters); if (in_array($letters, $ru)) { $result = 'Русский' ; //russian } elseif (in_array($letters, $en)) { $result = 'Английский'; //english } else { $result = 'ошибка' . $letters; //error }} return $result; 

O pacote Text_LanguageDetect pear produziu resultados terríveis: “apartamentos de luxo no centro da cidade” são detectados como portugueses …

Google API ainda é a melhor solução, eles dão 300 $ de crédito grátis e avisam antes de cobrar qualquer coisa

Abaixo está uma function super simples que usa files_get_contents para baixar o lang detectado pela API, portanto, não é necessário baixar ou instalar bibliotecas, etc.

 function guess_lang($str) { $str = str_replace(" ", "%20", $str); $content = file_get_contents("https://translation.googleapis.com/language/translate/v2/detect?key=YOUR_API_KEY&q=".$str); $lang = (json_decode($content, true)); if(isset($lang)) return $lang["data"]["detections"][0][0]["language"]; } 

Executar:

 echo guess_lang("luxury apartments downtown montreal"); // returns "en" 

Você pode obter sua chave da Google Translate API aqui: https://console.cloud.google.com/apis/library/translate.googleapis.com/

Este é um exemplo simples para frases curtas para você ir. Para aplicativos mais complexos você quer restringir sua chave API e usar a biblioteca, obviamente.

    Intereting Posts