
Sua tarefa é simples: diz em qual idioma algum texto está escrito. Isso é muito útil como uma etapa de pré -processamento para dados linguísticos em aplicativos de processamento de linguagem natural, como classificação de texto e verificação de ortografia. Outros casos de uso, por exemplo, podem incluir o roteamento de e-mails para o departamento de atendimento ao cliente localizado geograficamente, com base nos e-mails dos idiomas.
A detecção de idiomas geralmente é feita como parte de grandes estruturas de aprendizado de máquina ou aplicativos de processamento de linguagem natural. Nos casos em que você não precisa da funcionalidade completa desses sistemas ou não deseja aprender as cordas dessas, uma pequena biblioteca flexível é útil.
Até agora, a única outra biblioteca abrangente de código aberto do ecossistema Go para esta tarefa é o que é o que é o que é o que Infelizmente, ele tem duas grandes desvantagens:
A Lingua pretende eliminar esses problemas. Ela quase não precisa de nenhuma configuração e produz resultados bastante precisos em texto longo e curto, mesmo em palavras e frases únicas. Ela se baseia nos métodos baseados em regras e estatísticos, mas não usa nenhum dicionário de palavras. Ela também não precisa de uma conexão com nenhuma API ou serviço externo. Depois que a biblioteca for baixada, ela pode ser usada completamente offline.
Comparado a outras bibliotecas de detecção de idiomas, o foco da Lingua está na qualidade da quantidade , ou seja, obtendo a detecção correta para um pequeno conjunto de idiomas antes de adicionar novos. Atualmente, os 75 idiomas a seguir são suportados:
A Lingua é capaz de relatar estatísticas de precisão para alguns dados de teste em pacote disponíveis para cada idioma suportado. Os dados do teste para cada idioma são divididos em três partes:
Os modelos de idiomas e os dados de teste foram criados a partir de documentos separados do Wortschatz Corpora oferecido pela Universidade de Leipzig, Alemanha. Os dados se arrastaram em vários sites de notícias foram usados para treinamento, cada corpus compreendendo um milhão de sentenças. Para testes, os corpora feitos de sites escolhidos arbitrariamente foram usados, cada um compreendendo dez mil frases. De cada corpus de teste, foi extraído um subconjunto aleatório de 1000 palavras, 1000 pares de palavras e 1000 frases, respectivamente.
Dados os dados de teste gerados, comparei os resultados de detecção da língua e do Whatlanggo , executando os dados dos 75 idiomas suportados pela Lingua . Além disso, adicionei o CLD3 do Google à comparação com a ajuda das ligações GOCLD3. Os idiomas que não são suportados pelo CLD3 ou Whatlanggo são simplesmente ignorados durante o processo de detecção.
Cada uma das seções a seguir contém duas parcelas. O gráfico de barras mostra os resultados detalhados da precisão para cada linguagem suportada. O gráfico da caixa ilustra as distribuições dos valores de precisão para cada classificador. As próprias caixas representam as áreas em que os 50 % do meio dos dados estão dentro. Dentro das caixas coloridas, as linhas horizontais marcam a mediana das distribuições.
A tabela abaixo mostra estatísticas detalhadas para cada idioma e classificador, incluindo média, mediana e desvio padrão.
| Linguagem | Média | Palavras únicas | Pares de palavras | Frases | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Língua (Modo de alta precisão) | Língua (Modo de baixa precisão) | CLD3 | WhatLang | Língua (Modo de alta precisão) | Língua (Modo de baixa precisão) | CLD3 | WhatLang | Língua (Modo de alta precisão) | Língua (Modo de baixa precisão) | CLD3 | WhatLang | Língua (Modo de alta precisão) | Língua (Modo de baixa precisão) | CLD3 | WhatLang | |
| afrikaans | 79 | 64 | 55 | 51 | 58 | 38 | 22 | 21 | 81 | 62 | 46 | 39 | 97 | 93 | 98 | 92 |
| albanês | 88 | 80 | 55 | - | 69 | 54 | 18 | - | 95 | 86 | 48 | - | 100 | 99 | 98 | - |
| árabe | 98 | 94 | 90 | 89 | 96 | 88 | 79 | 77 | 99 | 96 | 92 | 91 | 100 | 99 | 100 | 99 |
| Armênio | 100 | 100 | 99 | - | 100 | 100 | 100 | - | 100 | 100 | 100 | - | 100 | 100 | 97 | - |
| Azerbaijão | 90 | 82 | 81 | 64 | 77 | 71 | 62 | 45 | 92 | 78 | 82 | 58 | 99 | 96 | 99 | 91 |
| Basco | 84 | 75 | 62 | - | 71 | 56 | 33 | - | 87 | 76 | 62 | - | 93 | 92 | 92 | - |
| Bielorrusso | 97 | 92 | 84 | 81 | 92 | 80 | 67 | 64 | 99 | 95 | 86 | 80 | 100 | 100 | 100 | 98 |
| bengali | 100 | 100 | 99 | 100 | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 |
| Bokmal | 58 | 50 | - | 34 | 39 | 27 | - | 15 | 59 | 47 | - | 28 | 77 | 75 | - | 60 |
| Bósnia | 35 | 29 | 33 | - | 29 | 23 | 19 | - | 35 | 29 | 28 | - | 41 | 36 | 52 | - |
| búlgaro | 87 | 78 | 70 | 61 | 70 | 56 | 45 | 37 | 91 | 81 | 66 | 57 | 99 | 96 | 98 | 89 |
| catalão | 70 | 58 | 48 | - | 51 | 33 | 19 | - | 74 | 60 | 42 | - | 87 | 82 | 84 | - |
| chinês | 100 | 100 | 92 | 100 | 100 | 100 | 92 | 100 | 100 | 100 | 83 | 100 | 100 | 100 | 100 | 100 |
| croata | 73 | 60 | 42 | 55 | 53 | 36 | 26 | 28 | 74 | 57 | 42 | 44 | 90 | 86 | 58 | 91 |
| Tcheco | 80 | 71 | 64 | 50 | 66 | 54 | 39 | 31 | 84 | 72 | 65 | 46 | 91 | 87 | 88 | 71 |
| dinamarquês | 81 | 70 | 58 | 47 | 61 | 45 | 26 | 24 | 84 | 70 | 54 | 38 | 98 | 95 | 95 | 79 |
| Holandês | 77 | 64 | 58 | 47 | 55 | 36 | 29 | 22 | 81 | 61 | 47 | 36 | 96 | 94 | 97 | 82 |
| Inglês | 81 | 63 | 54 | 49 | 55 | 29 | 22 | 17 | 89 | 62 | 44 | 35 | 99 | 97 | 97 | 94 |
| esperanto | 84 | 66 | 57 | 52 | 67 | 44 | 22 | 25 | 85 | 61 | 51 | 45 | 98 | 93 | 98 | 88 |
| estoniano | 92 | 83 | 70 | 61 | 80 | 62 | 41 | 36 | 96 | 88 | 69 | 53 | 100 | 99 | 99 | 94 |
| finlandês | 96 | 91 | 80 | 71 | 90 | 77 | 58 | 45 | 98 | 95 | 84 | 70 | 100 | 100 | 99 | 98 |
| Francês | 89 | 77 | 55 | 64 | 74 | 52 | 22 | 37 | 94 | 83 | 49 | 59 | 99 | 98 | 94 | 97 |
| Ganda | 91 | 84 | - | - | 79 | 65 | - | - | 95 | 87 | - | - | 100 | 100 | - | - |
| Georgiano | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 96 | 100 |
| Alemão | 89 | 80 | 66 | 65 | 74 | 57 | 40 | 38 | 94 | 84 | 62 | 60 | 100 | 99 | 98 | 97 |
| grego | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| Gujarati | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| hebraico | 100 | 100 | - | 90 | 100 | 100 | - | 76 | 100 | 100 | - | 94 | 100 | 100 | - | 99 |
| hindi | 73 | 33 | 58 | 52 | 61 | 11 | 34 | 27 | 64 | 20 | 45 | 40 | 95 | 67 | 95 | 88 |
| húngaro | 95 | 90 | 76 | 62 | 87 | 77 | 53 | 37 | 98 | 94 | 76 | 53 | 100 | 100 | 99 | 95 |
| islandês | 93 | 88 | 71 | - | 83 | 72 | 42 | - | 97 | 92 | 70 | - | 100 | 99 | 99 | - |
| indonésio | 61 | 47 | 46 | 67 | 39 | 25 | 26 | 39 | 61 | 46 | 45 | 66 | 83 | 71 | 66 | 95 |
| irlandês | 91 | 85 | 67 | - | 82 | 70 | 42 | - | 94 | 90 | 66 | - | 96 | 95 | 94 | - |
| italiano | 87 | 71 | 62 | 56 | 69 | 42 | 31 | 25 | 92 | 74 | 57 | 47 | 100 | 98 | 98 | 96 |
| japonês | 100 | 100 | 98 | 99 | 100 | 100 | 97 | 100 | 100 | 100 | 96 | 100 | 100 | 100 | 100 | 97 |
| Cazaque | 92 | 90 | 82 | - | 80 | 78 | 62 | - | 96 | 93 | 83 | - | 99 | 99 | 99 | - |
| coreano | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 100 |
| Latim | 87 | 73 | 62 | - | 72 | 49 | 44 | - | 93 | 76 | 58 | - | 97 | 94 | 83 | - |
| letão | 93 | 87 | 75 | 59 | 85 | 75 | 51 | 36 | 97 | 90 | 77 | 54 | 99 | 97 | 98 | 87 |
| lituano | 95 | 87 | 72 | 62 | 86 | 76 | 42 | 38 | 98 | 89 | 75 | 56 | 100 | 98 | 99 | 92 |
| Macedônio | 84 | 72 | 60 | 62 | 66 | 52 | 30 | 39 | 86 | 70 | 54 | 55 | 99 | 95 | 97 | 94 |
| malaio | 31 | 31 | 22 | - | 26 | 22 | 11 | - | 38 | 36 | 22 | - | 28 | 35 | 34 | - |
| maori | 91 | 82 | 52 | - | 82 | 62 | 22 | - | 92 | 87 | 43 | - | 99 | 98 | 91 | - |
| Marathi | 85 | 39 | 84 | 73 | 74 | 16 | 69 | 52 | 85 | 30 | 84 | 74 | 96 | 72 | 98 | 93 |
| mongol | 97 | 95 | 83 | - | 93 | 89 | 63 | - | 99 | 98 | 87 | - | 99 | 99 | 99 | - |
| Nynorsk | 66 | 52 | - | 34 | 41 | 25 | - | 10 | 66 | 49 | - | 24 | 91 | 81 | - | 69 |
| persa | 90 | 80 | 76 | 70 | 78 | 62 | 57 | 46 | 94 | 80 | 70 | 66 | 100 | 98 | 99 | 99 |
| polonês | 95 | 90 | 77 | 66 | 85 | 77 | 51 | 45 | 98 | 93 | 80 | 59 | 100 | 99 | 99 | 94 |
| Português | 81 | 69 | 53 | 57 | 59 | 42 | 21 | 26 | 85 | 70 | 40 | 48 | 99 | 95 | 97 | 96 |
| Punjabi | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| romeno | 87 | 72 | 53 | 59 | 69 | 49 | 24 | 34 | 92 | 74 | 48 | 52 | 99 | 94 | 88 | 90 |
| russo | 90 | 78 | 71 | 53 | 76 | 59 | 48 | 40 | 95 | 84 | 72 | 52 | 98 | 92 | 93 | 68 |
| sérvio | 88 | 78 | 78 | 57 | 74 | 62 | 63 | 34 | 90 | 80 | 75 | 51 | 99 | 91 | 95 | 86 |
| Shona | 91 | 81 | 76 | 68 | 78 | 56 | 51 | 44 | 96 | 86 | 79 | 65 | 100 | 100 | 99 | 95 |
| Eslovaco | 84 | 75 | 63 | - | 64 | 49 | 32 | - | 90 | 78 | 61 | - | 99 | 97 | 96 | - |
| Esloveno | 82 | 67 | 63 | 48 | 61 | 39 | 29 | 25 | 87 | 68 | 60 | 38 | 99 | 93 | 99 | 81 |
| Somali | 92 | 85 | 69 | 68 | 82 | 64 | 38 | 38 | 96 | 90 | 70 | 66 | 100 | 100 | 100 | 99 |
| Sotho | 86 | 72 | 49 | - | 67 | 43 | 15 | - | 90 | 75 | 33 | - | 100 | 97 | 98 | - |
| Espanhol | 70 | 56 | 48 | 48 | 44 | 26 | 16 | 19 | 69 | 49 | 32 | 33 | 97 | 94 | 96 | 93 |
| Suaíli | 81 | 70 | 57 | - | 60 | 43 | 25 | - | 84 | 68 | 49 | - | 98 | 97 | 98 | - |
| sueco | 84 | 72 | 61 | 49 | 64 | 46 | 30 | 24 | 88 | 76 | 56 | 40 | 99 | 94 | 96 | 83 |
| Tagalog | 78 | 66 | - | 52 | 52 | 36 | - | 23 | 83 | 67 | - | 43 | 98 | 96 | - | 90 |
| tâmil | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| Telugu | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| Tailandês | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 99 |
| Tsonga | 84 | 72 | - | - | 66 | 46 | - | - | 89 | 73 | - | - | 98 | 97 | - | - |
| Tswana | 84 | 71 | - | - | 65 | 44 | - | - | 88 | 73 | - | - | 99 | 96 | - | - |
| turco | 94 | 87 | 69 | 54 | 84 | 71 | 41 | 26 | 98 | 91 | 70 | 44 | 100 | 100 | 97 | 92 |
| ucraniano | 92 | 86 | 81 | 72 | 84 | 75 | 62 | 53 | 97 | 92 | 83 | 71 | 95 | 93 | 98 | 93 |
| urdu | 91 | 80 | 61 | 57 | 80 | 65 | 39 | 31 | 94 | 78 | 53 | 46 | 98 | 96 | 92 | 94 |
| vietnamita | 91 | 87 | 66 | 73 | 79 | 76 | 26 | 36 | 94 | 87 | 74 | 85 | 99 | 98 | 99 | 97 |
| galês | 91 | 82 | 69 | - | 78 | 61 | 43 | - | 96 | 87 | 66 | - | 99 | 99 | 98 | - |
| Xhosa | 82 | 69 | 66 | - | 64 | 45 | 40 | - | 85 | 67 | 65 | - | 98 | 94 | 92 | - |
| Ioruba | 74 | 62 | 15 | 22 | 50 | 33 | 5 | 11 | 77 | 61 | 11 | 14 | 96 | 92 | 28 | 41 |
| zulu | 81 | 70 | 63 | 70 | 62 | 45 | 35 | 44 | 83 | 72 | 63 | 68 | 97 | 94 | 92 | 98 |
| Significar | 86 | 77 | 69 | 67 | 74 | 61 | 48 | 48 | 89 | 78 | 67 | 63 | 96 | 93 | 93 | 91 |
| Mediana | 89.0 | 80.0 | 68.0 | 62.0 | 74.0 | 57.0 | 41.0 | 38.0 | 94.0 | 81.0 | 66.0 | 57.0 | 99.0 | 97.0 | 98.0 | 94.0 |
| Desvio padrão | 13.08 | 17.29 | 19.04 | 20.22 | 18.41 | 24.9 | 27.86 | 29.28 | 13.12 | 18.93 | 21.83 | 24.22 | 11.05 | 11.91 | 13.95 | 11.24 |
Todo detector de idiomas usa um modelo probabilístico de N-Gram treinado na distribuição de caracteres em algum corpus de treinamento. A maioria das bibliotecas usa apenas n-gramas de tamanho 3 (trigramas), o que é satisfatório para detectar a linguagem de fragmentos de texto mais longos que consistem em múltiplas frases. Para frases curtas ou palavras únicas, no entanto, os trigramas não são suficientes. Quanto mais curto o texto de entrada, menos n-gramas estiverem disponíveis. As probabilidades estimadas a partir de poucos gramas N não são confiáveis. É por isso que a Lingua faz uso de n-gramas de tamanhos 1 até 5, o que resulta em uma previsão muito mais precisa do idioma correto.
Uma segunda diferença importante é que a Lingua não usa apenas um modelo estatístico, mas também um mecanismo baseado em regras. Este mecanismo primeiro determina o alfabeto do texto de entrada e procura caracteres que sejam exclusivos em um ou mais idiomas. Se exatamente um idioma puder ser escolhido de maneira confiável dessa maneira, o modelo estatístico não será mais necessário. De qualquer forma, o mecanismo baseado em regras filtra idiomas que não satisfazem as condições do texto de entrada. Somente então, em um segundo passo, o modelo probabilístico de N-Gram é levado em consideração. Isso faz sentido porque carregar menos modelos de linguagem significa menos consumo de memória e melhor desempenho de tempo de execução.
Em geral, é sempre uma boa idéia restringir o conjunto de idiomas a serem considerados no processo de classificação usando os respectivos métodos da API. Se você souber de antemão que certos idiomas nunca ocorrem em um texto de entrada, não deixe que eles participem do processo de classificação. O mecanismo de filtragem do mecanismo baseado em regras é bastante bom, no entanto, a filtragem com base no seu próprio conhecimento do texto de entrada é sempre preferível.
Se você deseja reproduzir os resultados da precisão acima, pode gerar os relatórios de teste para os classificadores e para todos os idiomas fazendo:
cd cmd
go run accuracy_reporter.go
Para que o GOCLD3 seja executado com sucesso, você precisa instalar a versão exata 3.17.3 dos buffers de protocolo do Google, o que é um pouco infeliz. Para cada detector e idioma, um arquivo de relatório de teste é então gravado em /accuracy-reports . Como exemplo, aqui está a saída atual do relatório da Lingua German:
##### German #####
>>> Accuracy on average: 89.23%
>> Detection of 1000 single words (average length: 9 chars)
Accuracy: 73.90%
Erroneously classified as Dutch: 2.30%, Danish: 2.10%, English: 2.00%, Latin: 1.90%, Bokmal: 1.60%, Basque: 1.20%, French: 1.20%, Italian: 1.20%, Esperanto: 1.10%, Swedish: 1.00%, Afrikaans: 0.80%, Tsonga: 0.70%, Nynorsk: 0.60%, Portuguese: 0.60%, Yoruba: 0.60%, Finnish: 0.50%, Sotho: 0.50%, Welsh: 0.50%, Estonian: 0.40%, Irish: 0.40%, Polish: 0.40%, Spanish: 0.40%, Swahili: 0.40%, Tswana: 0.40%, Bosnian: 0.30%, Icelandic: 0.30%, Tagalog: 0.30%, Albanian: 0.20%, Catalan: 0.20%, Croatian: 0.20%, Indonesian: 0.20%, Lithuanian: 0.20%, Maori: 0.20%, Romanian: 0.20%, Xhosa: 0.20%, Zulu: 0.20%, Latvian: 0.10%, Malay: 0.10%, Slovak: 0.10%, Slovene: 0.10%, Somali: 0.10%, Turkish: 0.10%
>> Detection of 1000 word pairs (average length: 18 chars)
Accuracy: 94.10%
Erroneously classified as Dutch: 0.90%, Latin: 0.80%, English: 0.70%, Swedish: 0.60%, Danish: 0.50%, French: 0.40%, Bokmal: 0.30%, Irish: 0.20%, Tagalog: 0.20%, Afrikaans: 0.10%, Esperanto: 0.10%, Estonian: 0.10%, Finnish: 0.10%, Italian: 0.10%, Maori: 0.10%, Nynorsk: 0.10%, Somali: 0.10%, Swahili: 0.10%, Tsonga: 0.10%, Turkish: 0.10%, Welsh: 0.10%, Zulu: 0.10%
>> Detection of 1000 sentences (average length: 111 chars)
Accuracy: 99.70%
Erroneously classified as Dutch: 0.20%, Latin: 0.10%
go get github.com/pemistahl/lingua-go
A lingua requer pelo menos a versão 1.18 GO.
git clone https://github.com/pemistahl/lingua-go.git
cd lingua-go
go build
O código -fonte é acompanhado por um extenso conjunto de testes de unidade. Para executar os testes, basta dizer:
go test
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
if language , exists := detector . DetectLanguageOf ( "languages are awesome" ); exists {
fmt . Println ( language )
}
// Output: English
}Por padrão, a Lingua retorna o idioma mais provável para um determinado texto de entrada. No entanto, existem certas palavras que são as mesmas em mais de um idioma. A palavra prólogo , por exemplo, é uma palavra válida em inglês e francês. A LINGINE geraria inglês ou francês, o que pode estar errado no contexto especificado. Para casos como esse, é possível especificar uma distância relativa mínima que as probabilidades logaritmizadas e resumidas para cada idioma possível precisam satisfazer. Pode ser declarado da seguinte maneira:
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
WithMinimumRelativeDistance ( 0.9 ).
Build ()
language , exists := detector . DetectLanguageOf ( "languages are awesome" )
fmt . Println ( language )
fmt . Println ( exists )
// Output:
// Unknown
// false
} Esteja ciente de que a distância entre as probabilidades do idioma depende do comprimento do texto de entrada. Quanto mais tempo o texto de entrada, maior a distância entre os idiomas. Portanto, se você deseja classificar frases de texto muito curtas, não defina a distância relativa mínima muito alta. Caso contrário, Unknown será devolvido na maioria das vezes, como no exemplo acima. Esse é o valor de retorno para os casos em que a detecção de idioma não é possível de maneira confiável. Esse valor não deve ser incluído no conjunto de linguagens de entrada ao criar o detector de idiomas. Se você o incluir, ele será automaticamente removido do conjunto de linguagens de entrada.
Saber sobre o idioma mais provável é bom, mas quão confiável é a probabilidade calculada? E quão menos prováveis são os outros idiomas examinados em comparação com o mais provável? Essas perguntas também podem ser respondidas:
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
confidenceValues := detector . ComputeLanguageConfidenceValues ( "languages are awesome" )
for _ , elem := range confidenceValues {
fmt . Printf ( "%s: %.2f n " , elem . Language (), elem . Value ())
}
// Output:
// English: 0.93
// French: 0.04
// German: 0.02
// Spanish: 0.01
} No exemplo acima, uma fatia de ConfidenceValue é retornada contendo todos os idiomas possíveis classificados por seu valor de confiança na ordem descendente. Cada valor é uma probabilidade entre 0,0 e 1,0. As probabilidades de todos os idiomas somarão para 1.0. Se o idioma for identificado sem ambiguidade pelo mecanismo de regra, o valor 1.0 sempre será retornado para esse idioma. Os outros idiomas receberão um valor de 0,0.
Há também um método para retornar o valor de confiança apenas para um idioma específico:
confidence := detector . ComputeLanguageConfidence ( "languages are awesome" , lingua . French )
fmt . Printf ( "%.2f" , confidence )
// Output:
// 0.04O valor que esse método calcula é um número entre 0,0 e 1,0. Se o idioma for identificado sem ambiguidade pelo mecanismo de regra, o valor 1.0 sempre será retornado. Se o idioma fornecido não for suportado por esta instância do detector, o valor 0.0 sempre será retornado.
Por padrão, a Lingua usa o carregamento preguiçoso para carregar apenas os modelos de idiomas sob demanda que são considerados relevantes pelo mecanismo de filtro baseado em regras. Para serviços da Web, por exemplo, é bastante benéfico pré -carregar todos os modelos de idiomas na memória para evitar latência inesperada enquanto aguarda a resposta do serviço. Se você deseja ativar o modo de carregamento ansioso, pode fazer assim:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithPreloadedLanguageModels ().
Build () Múltiplas instâncias do LanguageDetector compartilham os mesmos modelos de idiomas na memória que são acessados de forma assíncrona pelas instâncias.
A alta precisão de detecção da Lingua tem o custo de ser notavelmente mais lento do que outros detectores de idiomas. Os grandes modelos de linguagem também consomem quantidades significativas de memória. Esses requisitos podem não ser viáveis para os sistemas com poucos recursos. Se você deseja classificar principalmente textos longos ou precisar economizar recursos, pode permitir um modo de baixa precisão que carregue apenas um pequeno subconjunto dos modelos de idiomas na memória:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithLowAccuracyMode ().
Build ()A desvantagem dessa abordagem é que a precisão da detecção para textos curtos que consistem em menos de 120 caracteres cairão significativamente. No entanto, a precisão da detecção para textos com mais de 120 caracteres permanecerá principalmente não afetada.
No modo de alta precisão (o padrão), o detector de idiomas consome aproximadamente 1.800 MB de memória se todos os modelos de idiomas forem carregados. No modo de baixa precisão, o consumo de memória é reduzido para aproximadamente 110 MB. O objetivo é reduzir ainda mais o consumo de memória em lançamentos posteriores.
Uma alternativa para uma pegada de memória menor e um desempenho mais rápido é reduzir o conjunto de idiomas ao criar o detector de idiomas. Na maioria dos casos, não é aconselhável construir o detector a partir de todos os idiomas suportados. Quando você tem conhecimento sobre os textos que deseja classificar, quase sempre pode descartar certos idiomas como impossíveis ou improváveis.
Em contraste com a maioria dos outros detectores de idiomas, a Lingua é capaz de detectar vários idiomas em textos de língua mista. Esse recurso pode produzir resultados bastante razoáveis, mas ainda está em um estado experimental e, portanto, o resultado da detecção é altamente dependente do texto de entrada. Funciona melhor no modo de alta precisão com várias palavras longas para cada idioma. Quanto mais curtas forem as frases e suas palavras, menos precisas são os resultados. Reduzir o conjunto de idiomas ao criar o detector de idiomas também pode melhorar a precisão dessa tarefa se os idiomas que ocorrem no texto forem iguais aos idiomas suportados pela respectiva instância do detector de idiomas.
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
sentence := "Parlez-vous français? " +
"Ich spreche Französisch nur ein bisschen. " +
"A little bit is better than nothing."
for _ , result := range detector . DetectMultipleLanguagesOf ( sentence ) {
fmt . Printf ( "%s: '%s' n " , result . Language (), sentence [ result . StartIndex (): result . EndIndex ()])
}
// Output:
// French: 'Parlez-vous français? '
// German: 'Ich spreche Französisch nur ein bisschen. '
// English: 'A little bit is better than nothing.'
} No exemplo acima, uma fatia de DetectionResult é retornada. Cada entrada na fatia descreve uma seção de texto contígua de língua única, fornecendo índices de início e final da respectiva substring.
Pode haver tarefas de classificação em que você sabe com antecedência que seus dados de idioma definitivamente não estão escritos em latim, por exemplo. A precisão da detecção pode se tornar melhor nesses casos se você excluir determinados idiomas do processo de decisão ou apenas incluir explicitamente idiomas relevantes:
// Include all languages available in the library.
lingua . NewLanguageDetectorBuilder (). FromAllLanguages ()
// Include only languages that are not yet extinct (= currently excludes Latin).
lingua . NewLanguageDetectorBuilder (). FromAllSpokenLanguages ()
// Include only languages written with Cyrillic script.
lingua . NewLanguageDetectorBuilder (). FromAllLanguagesWithCyrillicScript ()
// Exclude only the Spanish language from the decision algorithm.
lingua . NewLanguageDetectorBuilder (). FromAllLanguagesWithout ( lingua . Spanish )
// Only decide between English and German.
lingua . NewLanguageDetectorBuilder (). FromLanguages ( lingua . English , lingua . German )
// Select languages by ISO 639-1 code.
lingua . NewLanguageDetectorBuilder (). FromIsoCodes639_1 ( lingua . EN , lingua . DE )
// Select languages by ISO 639-3 code.
lingua . NewLanguageDetectorBuilder (). FromIsoCodes639_3 ( lingua . ENG , lingua . DEU )Dê uma olhada nos problemas planejados.
Quaisquer contribuições para a Lingua são muito apreciadas. Leia as instruções sobre CONTRIBUTING.md sobre como adicionar novos idiomas à biblioteca.