El detector de lenguaje eficiente ( Nito-ELD o ELD ) es un software de detección de lenguaje natural rápido y preciso, escrito 100% en PHP, con una velocidad comparable a los detectores rápidos compilados en C++ y una precisión dentro del rango de los mejores detectores hasta la fecha.
No tiene dependencias, fácil instalación, todo lo que se necesita es PHP con la extensión mb .
ELD también está disponible (versiones desactualizadas) en Javascript y Python.
Instalación
como usar
Puntos de referencia
Bases de datos
Pruebas
Idiomas
Cambios de ELD v2 a v3:
detect()->language ahora devuelve la cadena
'und'
para indeterminado en lugar deNULL
Las bases de datos no son compatibles y son más grandes, mediana v2 ≈ pequeña v3
Se elimina la función DynamicLangSubset().
La función cleanText() ahora se llama enableTextCleanup()
$ compositor requiere nitotm/detector-de-lenguaje-eficiente
--prefer-dist
omitirá tests/ , misc/ & benchmark/ , o usará --prefer-source
para incluir todo
Instale nitotm/efficient-language-detector:dev-main
para probar los últimos cambios inestables
Alternativamente, descargar/clonar los archivos puede funcionar bien.
(Solo una pequeña instalación de base de datos en construcción)
Se recomienda utilizar OPcache, especialmente para bases de datos más grandes, para reducir los tiempos de carga.
Necesitamos configurar opcache.interned_strings_buffer
y opcache.memory_consumption
lo suficientemente altos para cada base de datos.
Valor recomendado entre paréntesis. Consulte Bases de datos para obtener más información.
configuración de php.ini | Pequeño | Medio | Grande | extragrande |
---|---|---|---|---|
memory_limit | >= 128 | >= 340 | >= 1060 | >= 2200 |
opcache.interned... | >= 8 (16) | >= 16 (32) | >= 60 (70) | >= 116 (128) |
opcache.memory | >= 64 (128) | >= 128 (230) | >= 360 (450) | >= 750 (820) |
detect()
espera una cadena UTF-8 y devuelve un objeto con una propiedad language
, que contiene un código ISO 639-1 (u otro formato seleccionado), o 'und'
para un idioma indeterminado.
// require_once 'manual_loader.php'; Para cargar ELD sin autocargador. Actualizar path.use NitotmEld{LanguageDetector, EldDataFile, EldFormat};// LanguageDetector(databaseFile: ?string, outputFormat: ?string)$eld = new LanguageDetector(EldDataFile::SMALL, EldFormat::ISO639_1);// Archivos de base de datos: ' pequeño', 'mediano', 'grande', 'extragrande'. Verifique los requisitos de memoria// Formatos: 'ISO639_1', 'ISO639_2T', 'ISO639_1_BCP47', 'ISO639_2T_BCP47' y 'FULL_TEXT'// Las constantes no son obligatorias, LanguageDetector('small', 'ISO639_1'); también funcionará$eld->detect('Hola, ¿cómo te llamas?');// object( language => string, scores() => array, isReliable() => bool )// ( language => 'es', puntuaciones() => ['es' => 0.25, 'nl' => 0.05], isReliable() => true )$eld->detect('Hola, ¿cómo te llamas?') ->idioma;// 'es'
Llamar langSubset()
una vez establecerá el subconjunto. La primera llamada lleva más tiempo ya que crea una nueva base de datos; si guarda el archivo de la base de datos (predeterminado), se cargará la próxima vez que hagamos el mismo subconjunto.
Para utilizar un subconjunto sin gastos generales adicionales, la forma correcta es crear una instancia del detector con el archivo guardado y devuelto por langSubset()
. Consulte los idiomas disponibles a continuación.
// Siempre acepta códigos ISO 639-1, así como el formato de salida seleccionado si es diferente.// langSubset(languages: [], save: true, encode: true); Devolverá el nombre del archivo del subconjunto si se guarda$eld->langSubset(['en', 'es', 'fr', 'it', 'nl', 'de']);// Objeto (éxito => bool, idiomas => ?array, error => ?string, file => ?string )// ( éxito => true, idiomas => ['en', 'es'...], error => NULL, file => ' small_6_mfss...' )// para eliminar el subconjunto$eld->langSubset();// La mejor y más rápida manera de usar un subconjunto es cargarlo como una base de datos predeterminada$eld_subset = new NitotmEldLanguageDetector('small_6_mfss5z1t' );
// si enableTextCleanup(True), detect() elimina URL, dominios .com, correos electrónicos, alfanuméricos...// No recomendado, ya que las URL y los dominios contienen sugerencias de un idioma, lo que podría ayudar a mejorar la precisión$eld->enableTextCleanup(true ); // El valor predeterminado es falso// Si es necesario, podemos obtener información de la instancia de ELD: idiomas, tipo de base de datos, etc.$eld->info();
Comparé ELD con una variedad diferente de detectores, ya que no hay muchos en PHP.
URL | Versión | Idioma |
---|---|---|
https://github.com/nitotm/ficient-language-detector/ | 3.0.0 | PHP |
https://github.com/pemistahl/lingua-py | 2.0.2 | Pitón |
https://github.com/facebookresearch/fastText | 0.9.2 | C++ |
https://github.com/CLD2Owners/cld2 | 21 de agosto de 2015 | C++ |
https://github.com/patrickschur/language-detection | 5.3.0 | PHP |
https://github.com/wooorm/franc | 7.2.0 | JavaScript |
Puntos de referencia:
Tatoeba : 20 MB , frases cortas de Tatoeba, 50 idiomas admitidos por todos los contendientes, hasta 10.000 líneas cada uno.
Para Tatoeba, limité todos los detectores al subconjunto de 50 idiomas, para que la comparación fuera lo más justa posible.
Además, Tatoeba no forma parte del conjunto de datos de entrenamiento de ELD (ni de ajuste), pero sí para texto rápido.
Prueba ELD : 10 MB , oraciones de los 60 idiomas admitidos por ELD, 1000 líneas cada una. Extraído de los 60 GB de datos de entrenamiento de ELD.
Oraciones : 8 MB , oraciones del punto de referencia Lingua , menos los idiomas no compatibles y el yoruba que tenía caracteres rotos.
Pares de palabras 1,5 MB y palabras individuales 870 KB , también de Lingua, los mismos 53 idiomas.
Lingua participa con 54 idiomas, el franco con 58 y patrickschur con 54.
fasttext no tiene una opción de subconjunto incorporada, por lo que para mostrar su precisión y velocidad potencial hice dos puntos de referencia, fasttext-all no está limitado por ningún subconjunto en ninguna prueba
* CLD2 de Google también carece de la opción de subconjunto, y es difícil crear un subconjunto incluso con su opción bestEffort = True
, ya que normalmente devuelve solo un idioma, por lo que tiene una desventaja comparativa.
El tiempo se normaliza: (líneas totales * tiempo) / líneas procesadas
Pequeño | Medio | Grande | extragrande | |
---|---|---|---|---|
Ventajas | Memoria más baja | Equilibrado | Lo más rápido | Más preciso |
Contras | Menos preciso | El más lento (pero rápido) | Alta memoria | Memoria más alta |
Tamaño del archivo | 3 megas | 10 megas | 32 megas | 71 megas |
Uso de memoria | 76 megas | 280 megas | 977 megas | 2083 megas |
Uso de memoria en caché | 0,4 MB + OP | 0,4 MB + OP | 0,4 MB + OP | 0,4 MB + OP |
OPcache utiliza memoria | 21 megas | 69 megas | 244MB | 539 megas |
OPcache usado internado | 4 megas | 10 megas | 45 megas | 98 megas |
Tiempo de carga sin caché | 0,14 segundos | 0,5 segundos | 1,5 segundos | 3,4 segundos |
Tiempo de carga en caché | 0,0002 seg | 0,0002 seg | 0,0002 seg | 0,0002 seg |
Configuración (recomendada) | ||||
memory_limit | >= 128 | >= 340 | >= 1060 | >= 2200 |
opcache.interned... * | >= 8 (16) | >= 16 (32) | >= 60 (70) | >= 116 (128) |
opcache.memory | >= 64 (128) | >= 128 (230) | >= 360 (450) | >= 750 (820) |
* Recomiendo usar más que suficiente interned_strings_buffer
ya que un error de desbordamiento del buffer podría retrasar la respuesta del servidor.
Para utilizar todas las bases de datos, opcache.interned_strings_buffer
debe tener un mínimo de 160 MB (170 MB).
Al elegir la cantidad de memoria, tenga en cuenta opcache.memory_consumption
incluye opcache.interned_strings_buffer
.
Si la memoria OPcache es de 230 MB, interned_strings es de 32 MB y la base de datos mediana tiene 69 MB de caché, tenemos un total de (230 -32 -69) = 129 MB de OPcache para todo lo demás.
Además, si va a utilizar un subconjunto de idiomas además de la base de datos principal, o varios subconjuntos, aumente opcache.memory
en consecuencia si desea que se carguen instantáneamente. Para almacenar en caché cómodamente todas las bases de datos predeterminadas, deberá configurarlo en 1200 MB.
Es posible que la instalación predeterminada del compositor no incluya estos archivos. Utilice --prefer-source
para incluirlos.
Para el entorno de desarrollo con el compositor "autoload-dev" (solo raíz), lo siguiente ejecutará las pruebas
nuevo NitotmEldTestsTestsAutoload();
O también puedes ejecutar las pruebas ejecutando el siguiente archivo:
$ php detector-de-lenguaje-eficiente/tests/tests.php # Ruta de actualización
Para ejecutar los puntos de referencia de precisión, ejecute el archivo benchmark/bench.php
.
Estos son los códigos ISO 639-1 que incluyen los 60 idiomas. Más 'und'
para indeterminado
Es el formato de idioma ELD predeterminado. outputFormat: 'ISO639_1'
am, ar, az, be, bg, bn, ca, cs, da, de, el, en, es, et, eu, fa, fi, fr, gu, he, hola, hr, hu, hy, is, it, ja, ka, kn, ko, ku, lo, lt, lv, ml, mr, ms, nl, no, or, pa, pl, pt, ro, ru, sk, sl, sq, sr, sv, ta, te, th, tl, tr, reino unido, ur, vi, yo, zh
Estos son los 60 idiomas admitidos por Nito-ELD . outputFormat: 'FULL_TEXT'
Amárico, árabe, azerí (latín), bielorruso, búlgaro, bengalí, catalán, checo, danés, alemán, griego, inglés, español, estonio, vasco, persa, finlandés, francés, gujarati, hebreo, hindi, croata, húngaro, armenio , islandés, italiano, japonés, georgiano, kannada, coreano, kurdo (árabe), laosiano, lituano, letón, malayalam, marathi, malayo (latino), holandés, noruego, oriya, punjabi, polaco, portugués, rumano, ruso, eslovaco , esloveno, albanés, serbio (cirílico), sueco, tamil, telugu, tailandés, tagalo, turco, ucraniano, urdu, vietnamita, yoruba, chino
Códigos ISO 639-1 con etiqueta de nombre de script IETF BCP 47. outputFormat: 'ISO639_1_BCP47'
am, ar, az-Latn, be, bg, bn, ca, cs, da, de, el, en, es, et, eu, fa, fi, fr, gu, he, hola, hr, hu, hy, is, it, ja, ka, kn, ko, ku-Arab, lo, lt, lv, ml, mr, ms-Latn, nl, no, or, pa, pl, pt, ro, ru, sk, sl, sq, sr-Cyrl, sv, ta, te, th, tl, tr, reino unido, ur, vi, yo, zh
Códigos ISO 639-2/T (que también son válidos 639-3 ) outputFormat: 'ISO639_2T'
. También disponible con BCP 47 ISO639_2T_BCP47
amh, ara, aze, bel, bul, ben, gato, ces, dan, deu, ell, eng, spa, est, eus, fas, aleta, fra, guj, heb, hin, hrv, hun, hye, isl, ita, jpn, kat, kan, kor, kur, lao, lit, lav, mal, mar, msa, nld, nor, ori, pan, pol, por, ron, rus, slk, slv, sqi, srp, swe, tam, tel, tha, tgl, tur, ukr, urd, vie, yor, zho
Si desea donar para mejoras de código abierto, contratarme para modificaciones privadas, solicitar capacitación sobre conjuntos de datos alternativos o contactarme, utilice el siguiente enlace: https://linktr.ee/nitotm