Detector de linguagem eficiente ( Nito-ELD ou ELD ) é um software de detecção de linguagem natural rápido e preciso, escrito 100% em PHP, com velocidade comparável a detectores rápidos compilados em C++ e precisão dentro da faixa dos melhores detectores até o momento.
Não possui dependências, é de fácil instalação, bastando apenas PHP com extensão mb .
ELD também está disponível (versões desatualizadas) em Javascript e Python.
Instalação
Como usar
Referências
Bancos de dados
Teste
Idiomas
Mudanças do ELD v2 para v3:
detect()->idioma agora retorna string
'und'
para indeterminado em vez deNULL
Os bancos de dados não são compatíveis e maiores, médios v2 ≈ pequenos v3
A função dynamicLangSubset() foi removida
A função cleanText() agora se chama enableTextCleanup()
$ compositor requer nitotm/detector de linguagem eficiente
--prefer-dist
omitirá testes/ , misc/ & benchmark/ , ou usará --prefer-source
para incluir tudo
Instale nitotm/efficient-language-detector:dev-main
para testar as últimas alterações instáveis
Alternativamente, baixar/clonar os arquivos pode funcionar perfeitamente.
(Apenas instalação de banco de dados pequeno em construção)
Recomenda-se usar OPcache, especialmente para bancos de dados maiores para reduzir o tempo de carregamento.
Precisamos definir opcache.interned_strings_buffer
, opcache.memory_consumption
alto o suficiente para cada banco de dados
Valor recomendado entre parênteses. Verifique os bancos de dados para obter mais informações.
configuração php.ini | Pequeno | Médio | 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 uma string UTF-8 e retorna um objeto com uma propriedade language
, contendo um código ISO 639-1 (ou outro formato selecionado), ou 'und'
para idioma indeterminado.
// require_once 'manual_loader.php'; Para carregar ELD sem autoloader. Atualizar path.use NitotmEld{LanguageDetector, EldDataFile, EldFormat};// LanguageDetector(databaseFile: ?string, outputFormat: ?string)$eld = new LanguageDetector(EldDataFile::SMALL, EldFormat::ISO639_1);// Arquivos de banco de dados: ' pequeno', 'médio', 'grande', 'extragrande'. Verifique os requisitos de memória// Formatos: 'ISO639_1', 'ISO639_2T', 'ISO639_1_BCP47', 'ISO639_2T_BCP47' e 'FULL_TEXT' // Constantes não são obrigatórias, LanguageDetector('small', 'ISO639_1'); também funcionará$eld->detect('Hola, cómo te llamas?');// object( idioma => string, pontuações() => array, isReliable() => bool )// ( idioma => 'es', pontuações() => ['es' => 0,25, 'nl' => 0,05], isReliable() => true )$eld->detect('Olá, como você chama?') ->idioma;// 'es'
Chamar langSubset()
uma vez definirá o subconjunto. A primeira chamada demora mais, pois cria um novo banco de dados, se salvar o arquivo do banco de dados (padrão), ele será carregado na próxima vez que fizermos o mesmo subconjunto.
Para usar um subconjunto sem sobrecarga adicional, a maneira correta é instanciar o detector com o arquivo salvo e retornado por langSubset()
. Verifique os idiomas disponíveis abaixo.
// Sempre aceita códigos ISO 639-1, bem como o formato de saída selecionado se for diferente.// langSubset(idiomas: [], save: true, encode: true); Retornará o nome do arquivo do subconjunto se for salvo$eld->langSubset(['en', 'es', 'fr', 'it', 'nl', 'de']);// Object ( sucesso => bool, idiomas => ?array, erro => ?string, arquivo => ?string )// (sucesso => verdadeiro, idiomas => ['en', 'es'...], erro => NULL, arquivo => ' small_6_mfss...' )// para remover o subconjunto$eld->langSubset();// A melhor e mais rápida maneira de usar um subconjunto é carregá-lo como um banco de dados padrão$eld_subset = new NitotmEldLanguageDetector('small_6_mfss5z1t' );
// se enableTextCleanup(True), detect() remove URLs, domínios .com, e-mails, alfanuméricos...// Não recomendado, pois URLs e domínios contêm dicas de um idioma, o que pode ajudar na precisão$eld->enableTextCleanup(true ); // O padrão é false// Se necessário, podemos obter informações da instância ELD: idiomas, tipo de banco de dados, etc.$eld->info();
Comparei o ELD com uma variedade diferente de detectores, pois não existem muitos em PHP.
URL | Versão | Linguagem |
---|---|---|
https://github.com/nitotm/eficiente-linguagem-detector/ | 3.0.0 | PHP |
https://github.com/pemistahl/lingua-py | 2.0.2 | Pitão |
https://github.com/facebookresearch/fastText | 0.9.2 | C++ |
https://github.com/CLD2Owners/cld2 | 21 de agosto de 2015 | C++ |
https://github.com/patrickschur/detecção de idioma | 5.3.0 | PHP |
https://github.com/wooorm/franc | 7.2.0 | JavaScript |
Referências:
Tatoeba : 20 MB , frases curtas de Tatoeba, 50 idiomas suportados por todos os concorrentes, até 10 mil linhas cada.
Para Tatoeba, limitei todos os detectores ao subconjunto de 50 idiomas, tornando a comparação o mais justa possível.
Além disso, Tatoeba não faz parte do conjunto de dados de treinamento ELD (nem de ajuste), mas é para fasttext
Teste ELD : 10MB , frases dos 60 idiomas suportados pelo ELD, 1000 linhas cada. Extraído dos 60 GB de dados de treinamento ELD.
Frases : 8 MB , frases do benchmark Lingua , menos idiomas não suportados e iorubá com caracteres quebrados.
Pares de palavras 1,5 MB e Palavras individuais 870 KB , também do Lingua, mesmos 53 idiomas.
Lingua participa com 54 línguas, Franc com 58, patrickschur com 54.
fasttext não tem uma opção de subconjunto integrada, então para mostrar sua precisão e potencial de velocidade fiz dois benchmarks, fasttext - todos não sendo limitados por nenhum subconjunto em nenhum teste
* O CLD2 do Google também não possui a opção de subconjunto, e é difícil criar um subconjunto mesmo com sua opção bestEffort = True
, pois geralmente retorna apenas um idioma, por isso tem uma desvantagem comparativa.
O tempo é normalizado: (total de linhas * tempo) / linhas processadas
Pequeno | Médio | Grande | Extragrande | |
---|---|---|---|---|
Prós | Memória mais baixa | Equilibrado | Mais rápido | Mais preciso |
Contras | Menos preciso | Mais lento (mas rápido) | Alta memória | Memória mais alta |
Tamanho do arquivo | 3 MB | 10MB | 32 MB | 71 MB |
Uso de memória | 76MB | 280MB | 977MB | 2.083 MB |
Uso de memória em cache | 0,4MB + OP | 0,4MB + OP | 0,4MB + OP | 0,4MB + OP |
Memória usada OPcache | 21MB | 69MB | 244MB | 539MB |
OPcache usado internado | 4MB | 10MB | 45MB | 98MB |
Tempo de carregamento sem cache | 0,14 seg. | 0,5 seg. | 1,5 seg. | 3,4 segundos |
Tempo de carregamento armazenado em cache | 0,0002 segundos | 0,0002 segundos | 0,0002 segundos | 0,0002 segundos |
Configurações (recomendado) | ||||
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) |
* Eu recomendo usar interned_strings_buffer
mais do que suficiente, pois o erro de estouro de buffer pode atrasar a resposta do servidor.
Para usar todos os bancos de dados opcache.interned_strings_buffer
deve ter no mínimo 160MB (170MB).
Ao escolher a quantidade de memória, lembre-se de opcache.memory_consumption
inclui opcache.interned_strings_buffer
.
Se a memória OPcache for 230 MB, internad_strings for 32 MB e o banco de dados médio tiver 69 MB em cache, teremos um total de (230 -32 -69) = 129 MB de OPcache para todo o resto.
Além disso, se você for usar um subconjunto de idiomas além do banco de dados principal, ou vários subconjuntos, aumente opcache.memory
adequadamente se quiser que eles sejam carregados instantaneamente. Para armazenar em cache todos os bancos de dados padrão confortavelmente, você deseja defini-lo em 1200 MB.
A instalação padrão do compositor pode não incluir esses arquivos. Use --prefer-source
para incluí-los.
Para ambiente dev com compositor "autoload-dev" (somente root), o seguinte irá executar os testes
novo NitotmEldTestsTestsAutoload();
Ou você também pode executar os testes executando o seguinte arquivo:
$ php eficiente-linguagem-detector/testes/tests.php # Caminho de atualização
Para executar os benchmarks de precisão, execute o arquivo benchmark/bench.php
.
Estes são os códigos ISO 639-1 que incluem os 60 idiomas. Mais 'und'
para indeterminado
É o formato de idioma ELD padrão. outputFormat: 'ISO639_1'
sou, ar, az, ser, bg, bn, ca, cs, da, de, el, en, es, et, eu, fa, fi, fr, gu, ele, oi, hr, hu, hy, é, isto, ja, ka, kn, ko, ku, lo, lt, lv, ml, mr, ms, nl, não, ou, pa, pl, pt, ro, ru, sk, sl, sq, sr, sv, ta, te, th, tl, tr, reino unido, ur, vi, yo, zh
Estes são os 60 idiomas suportados pelo Nito-ELD . outputFormat: 'FULL_TEXT'
Amárico, árabe, azerbaijano (latim), bielorrusso, búlgaro, bengali, catalão, tcheco, dinamarquês, alemão, grego, inglês, espanhol, estoniano, basco, persa, finlandês, francês, guzerate, hebraico, hindi, croata, húngaro, armênio , islandês, italiano, japonês, georgiano, canarim, coreano, curdo (árabe), laosiano, lituano, letão, malaiala, marata, malaio (latim), holandês, norueguês, oriya, punjabi, polonês, português, romeno, russo, eslovaco , esloveno, albanês, sérvio (cirílico), sueco, tâmil, telugu, tailandês, tagalo, turco, ucraniano, urdu, vietnamita, iorubá, chinês
Códigos ISO 639-1 com etiqueta de nome de script IETF BCP 47. outputFormat: 'ISO639_1_BCP47'
sou, ar, az-Latn, ser, bg, bn, ca, cs, da, de, el, en, es, et, eu, fa, fi, fr, gu, ele, oi, hr, hu, hy, é, isso, ja, ka, kn, ko, ku-árabe, lo, lt, lv, ml, mr, ms-Latn, nl, não, ou, 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 também são válidos 639-3 ) outputFormat: 'ISO639_2T'
. Também disponível com BCP 47 ISO639_2T_BCP47
amh, ara, aze, bel, bul, ben, cat, ces, dan, deu, ell, eng, spa, est, eus, fas, fin, 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
Se você deseja doar para melhorias de código aberto, contratar-me para modificações privadas, solicitar treinamento alternativo em conjuntos de dados ou entrar em contato comigo, use o seguinte link: https://linktr.ee/nitotm