una - substring php
Detectar lenguaje de cadena en PHP (15)
En PHP, ¿hay alguna forma de detectar el lenguaje de una cadena? Supongamos que la cadena está en formato UTF-8.
Como Google Translate API se está cerrando como un servicio gratuito, puedes probar esta alternativa gratuita, que es un reemplazo para Google Translate API:
El paquete Text_LanguageDetect pear produjo resultados terribles: "apartamentos de lujo en el centro" se detecta como portugués ...
Google API sigue siendo la mejor solución, dan 300 $ de crédito gratis y advierten antes de cobrarle nada
A continuación se muestra una función muy simple que utiliza file_get_contents para descargar la lang detectada por la API, por lo que no es necesario descargar o 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"];
}
Ejecutar:
echo guess_lang("luxury apartments downtown montreal"); // returns "en"
Puede obtener su clave de API de Google Translate aquí: https://console.cloud.google.com/apis/library/translate.googleapis.com/
Este es un ejemplo simple de frases cortas para que empieces. Para aplicaciones más complejas, querrás restringir tu clave API y usar la biblioteca obviamente.
Intenté con la biblioteca Text_LanguageDetect y los resultados que obtuve no fueron muy buenos (por ejemplo, el texto "prueba" se identificó como estonio y no como inglés).
Puedo recomendarle que pruebe la API de traducción de Yandex, que es GRATUITA para 1 millón de caracteres por 24 horas y hasta 10 millones de caracteres por mes. Es compatible (de acuerdo con la documentación) en más de 60 idiomas.
<?php
function identifyLanguage($text)
{
$baseUrl = "https://translate.yandex.net/api/v1.5/tr.json/detect?key=YOUR_API_KEY";
$url = $baseUrl . "&text=" . urlencode($text);
$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 (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 "<br>";
echo translateText("エクスペリエンス", "en");
echo "<br>";
echo translateText("エクスペリエンス", "es");
echo "<br>";
echo translateText("エクスペリエンス", "zh");
echo "<br>";
echo translateText("エクスペリエンス", "he");
echo "<br>";
echo translateText("エクスペリエンス", "ja");
echo "<br>";
?>
Intenta usar codificación ascii. Yo uso ese código para determinar ru / en languages en mi proyecto 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;
No puedes detectar el idioma del tipo de personaje. Y no hay formas infalibles para hacer esto.
Con cualquier método, solo estás haciendo una conjetura educada. Hay disponibles algunos articles relacionados con matemáticas por ahí
Podría implementar un módulo de Apache Tika con Java, insertar los resultados en un archivo txt, un DB, etc. y luego leer desde el archivo, db, lo que sea con php. Si no tiene tanto contenido, puede usar la API de Google, aunque tenga en cuenta que sus llamadas serán limitadas y que solo puede enviar un número restringido de caracteres a la API. En el momento de escribir esto, había terminado de probar la versión 1 (que resultó no ser tan precisa) y la versión 2 de los laboratorios (la abandoné después de leer que hay un límite de 100.000 caracteres por día) de la API.
Podrías hacer esto completamente del lado del cliente con la API de lenguaje AJAX de Google (ahora desaparecida).
Con la API de idioma de AJAX, puede traducir y detectar el idioma de bloques de texto dentro de una página web utilizando solo Javascript. Además, puede habilitar la transliteración en cualquier campo de texto o área de texto en su página web. Por ejemplo, si estuvieras transliterando al hindi, esta API les permitirá a los usuarios escribir fonéticamente las palabras en hindi utilizando el inglés y hacer que aparezcan en el guión hindi.
Puedes detectar automáticamente el lenguaje de una cuerda
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 + "";
}
});
Y traducir cualquier cadena escrita en uno de los idiomas admitidos (también difunto)
google.language.translate("Hello world", "en", "es", function(result) {
if (!result.error) {
var container = document.getElementById("translation");
container.innerHTML = result.translation;
}
});
Probablemente pueda usar Google Translate API para detectar el idioma y traducirlo si es necesario.
Puede ver cómo detectar el lenguaje de una cadena en php usando el paquete Text_LanguageDetect Pear o descargando para usarlo por separado como una biblioteca php normal.
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 demasiado engorrosas para mi situación
- Admitir un número finito de idiomas en mi sitio web (en este momento dos : ''en'' y ''de'' - pero la solución se generaliza para obtener más información).
- Necesito una suposición plausible sobre el lenguaje de una cadena generada por el usuario, y tengo una alternativa (la configuración de idioma del usuario).
- Así que quiero una solución con un mínimo de falsos positivos , pero no me importan tanto los falsos negativos .
La solución usa las 20 palabras más comunes en un idioma, cuenta las ocurrencias de aquellos en el pajar. Luego solo compara los recuentos del primer y segundo idioma más contados. Si el número de segundo lugar es inferior al 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'');
// 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://.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;
}
Tal vez envíe la cadena a este adivinador de lenguaje:
http://www.xrce.xerox.com/competencies/content-analysis/tools/guesser
Tomaría documentos de varios idiomas y los compararía contra Unicode. A continuación, puede utilizar un razonamiento bayesiano para determinar qué idioma es el solo con los caracteres Unicode utilizados. Esto separaría el francés del inglés o ruso.
No estoy seguro exactamente de qué otra cosa se podría hacer, excepto buscar las palabras en los diccionarios de idiomas para determinar el idioma (utilizando un enfoque probabilístico similar).
Un enfoque podría ser dividir la cadena de entrada en palabras y luego buscar esas palabras en un diccionario de inglés para ver cuántas de ellas están presentes. Este enfoque tiene algunas limitaciones:
- los nombres propios pueden no ser manejados bien
- los errores de ortografía pueden interrumpir sus búsquedas
- abreviaturas como "lol" o "b4" no necesariamente estarán en el diccionario
Utilicé el paquete Text_LanguageDetect pear con algunos resultados razonables. Es muy fácil de usar y tiene una base de datos de 52 idiomas modesta. La desventaja es que no hay detección de idiomas asiáticos orientales.
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
)
puede usar la API del servicio Lnag ID http://langid.net/identify-language-from-api.html