
Seine Aufgabe ist einfach: Sie sagt Ihnen, in welcher Sprache ein Text geschrieben ist. Dies ist sehr nützlich als Vorverarbeitungsschritt für sprachliche Daten in Anwendungen für natürliche Sprachverarbeitung wie Textklassifizierung und Zauberprüfung. Andere Anwendungsfälle umfassen beispielsweise möglicherweise das Routing von E-Mails an die richtige geografisch gelegene Kundendienstabteilung, die auf den Sprachen der E-Mails basiert.
Die Spracherkennung erfolgt häufig als Teil großer maschineller Lernrahmen oder Anwendungen für natürliche Sprachverarbeitung. In Fällen, in denen Sie nicht die vollwertige Funktionalität dieser Systeme benötigen oder die Seile dieser Seile nicht lernen möchten, ist eine kleine flexible Bibliothek nützlich.
Bisher ist die einzige andere umfassende Open -Source -Bibliothek im Go -Ökosystem für diese Aufgabe Whatlanggo . Leider hat es zwei wichtige Nachteile:
Lingua zielt darauf ab, diese Probleme zu beseitigen. Sie benötigt fast keine Konfiguration und liefert selbst für einzelne Wörter und Phrasen ziemlich genaue Ergebnisse. Sie stützt sich sowohl auf regelbasierte als auch auf statistische Methoden, verwendet jedoch keine Wörterbücher von Wörtern. Sie benötigt weder eine Verbindung zu einer externen API noch zu einer Dienstleistung. Sobald die Bibliothek heruntergeladen wurde, kann sie offline vollständig verwendet werden.
Im Vergleich zu anderen Spracherkennungsbibliotheken liegt der Schwerpunkt von Lingua auf Qualität über Quantität , dh das Erkennung richtig für eine kleine Reihe von Sprachen, bevor sie neue hinzufügen. Derzeit werden die folgenden 75 Sprachen unterstützt:
Lingua kann Genauigkeitsstatistiken für einige gebündelte Testdaten melden, die für jede unterstützte Sprache verfügbar sind. Die Testdaten für jede Sprache sind in drei Teile aufgeteilt:
Sowohl die Sprachmodelle als auch die Testdaten wurden aus getrennten Dokumenten der von der Leipzig University, Deutschland angebotenen Wortschatz -Korpora erstellt. Daten, die aus verschiedenen Nachrichten -Websites gekrabbt wurden, wurden für das Training verwendet, wobei jedes Korpus eine Million Sätze umfasst. Zum Testen wurden Korpora aus willkürlich ausgewählten Websites verwendet, die jeweils zehntausend Sätze umfassen. Aus jedem Testkorpus wurde eine zufällige, unsortierte Untergruppe von 1000 einzelnen Wörtern, 1000 Wortpaaren bzw. 1000 Sätze extrahiert.
Angesichts der generierten Testdaten habe ich die Erkennungsergebnisse von Lingua und Whatlanggo verglichen, die über die Daten der unterstützten 75 Sprachen von Lingua laufen. Darüber hinaus habe ich mit Hilfe der GOCLD3 -Bindungen den CLD3 von Google zum Vergleich hinzugefügt. Sprachen, die nicht von CLD3 oder Whatlanggo unterstützt werden, werden während des Erkennungsprozesses einfach ignoriert.
Jeder der folgenden Abschnitte enthält zwei Diagramme. Die Bar -Diagramm zeigt die detaillierten Genauigkeitsergebnisse für jede unterstützte Sprache. Das Box -Diagramm zeigt die Verteilungen der Genauigkeitswerte für jeden Klassifikator. Die Boxen selbst repräsentieren die Bereiche, in denen die mittleren 50 % der Daten liegen. Innerhalb der farbigen Kisten markieren die horizontalen Linien den Median der Verteilungen.
Die folgende Tabelle zeigt detaillierte Statistiken für jede Sprache und jeden Klassifikator, einschließlich Mittelwert, Median und Standardabweichung.
| Sprache | Durchschnitt | Einzelne Wörter | Wortpaare | Sätze | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| LINuA (hoher Genauigkeitsmodus) | LINuA (niedriger Genauigkeitsmodus) | CLD3 | Whatlang | LINuA (hoher Genauigkeitsmodus) | LINuA (niedriger Genauigkeitsmodus) | CLD3 | Whatlang | LINuA (hoher Genauigkeitsmodus) | LINuA (niedriger Genauigkeitsmodus) | CLD3 | Whatlang | LINuA (hoher Genauigkeitsmodus) | LINuA (niedriger Genauigkeitsmodus) | CLD3 | Whatlang | |
| Afrikaans | 79 | 64 | 55 | 51 | 58 | 38 | 22 | 21 | 81 | 62 | 46 | 39 | 97 | 93 | 98 | 92 |
| albanisch | 88 | 80 | 55 | - - | 69 | 54 | 18 | - - | 95 | 86 | 48 | - - | 100 | 99 | 98 | - - |
| Arabisch | 98 | 94 | 90 | 89 | 96 | 88 | 79 | 77 | 99 | 96 | 92 | 91 | 100 | 99 | 100 | 99 |
| Armenisch | 100 | 100 | 99 | - - | 100 | 100 | 100 | - - | 100 | 100 | 100 | - - | 100 | 100 | 97 | - - |
| Aserbaidschani | 90 | 82 | 81 | 64 | 77 | 71 | 62 | 45 | 92 | 78 | 82 | 58 | 99 | 96 | 99 | 91 |
| baskisch | 84 | 75 | 62 | - - | 71 | 56 | 33 | - - | 87 | 76 | 62 | - - | 93 | 92 | 92 | - - |
| Weißrussland | 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 |
| bosnisch | 35 | 29 | 33 | - - | 29 | 23 | 19 | - - | 35 | 29 | 28 | - - | 41 | 36 | 52 | - - |
| bulgarisch | 87 | 78 | 70 | 61 | 70 | 56 | 45 | 37 | 91 | 81 | 66 | 57 | 99 | 96 | 98 | 89 |
| katalanisch | 70 | 58 | 48 | - - | 51 | 33 | 19 | - - | 74 | 60 | 42 | - - | 87 | 82 | 84 | - - |
| chinesisch | 100 | 100 | 92 | 100 | 100 | 100 | 92 | 100 | 100 | 100 | 83 | 100 | 100 | 100 | 100 | 100 |
| kroatisch | 73 | 60 | 42 | 55 | 53 | 36 | 26 | 28 | 74 | 57 | 42 | 44 | 90 | 86 | 58 | 91 |
| tschechisch | 80 | 71 | 64 | 50 | 66 | 54 | 39 | 31 | 84 | 72 | 65 | 46 | 91 | 87 | 88 | 71 |
| dänisch | 81 | 70 | 58 | 47 | 61 | 45 | 26 | 24 | 84 | 70 | 54 | 38 | 98 | 95 | 95 | 79 |
| Niederländisch | 77 | 64 | 58 | 47 | 55 | 36 | 29 | 22 | 81 | 61 | 47 | 36 | 96 | 94 | 97 | 82 |
| Englisch | 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 |
| estnisch | 92 | 83 | 70 | 61 | 80 | 62 | 41 | 36 | 96 | 88 | 69 | 53 | 100 | 99 | 99 | 94 |
| finnisch | 96 | 91 | 80 | 71 | 90 | 77 | 58 | 45 | 98 | 95 | 84 | 70 | 100 | 100 | 99 | 98 |
| Französisch | 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 | - - | - - |
| georgisch | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 96 | 100 |
| Deutsch | 89 | 80 | 66 | 65 | 74 | 57 | 40 | 38 | 94 | 84 | 62 | 60 | 100 | 99 | 98 | 97 |
| griechisch | 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 |
| hebräisch | 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 |
| ungarisch | 95 | 90 | 76 | 62 | 87 | 77 | 53 | 37 | 98 | 94 | 76 | 53 | 100 | 100 | 99 | 95 |
| isländisch | 93 | 88 | 71 | - - | 83 | 72 | 42 | - - | 97 | 92 | 70 | - - | 100 | 99 | 99 | - - |
| Indonesisch | 61 | 47 | 46 | 67 | 39 | 25 | 26 | 39 | 61 | 46 | 45 | 66 | 83 | 71 | 66 | 95 |
| irisch | 91 | 85 | 67 | - - | 82 | 70 | 42 | - - | 94 | 90 | 66 | - - | 96 | 95 | 94 | - - |
| Italienisch | 87 | 71 | 62 | 56 | 69 | 42 | 31 | 25 | 92 | 74 | 57 | 47 | 100 | 98 | 98 | 96 |
| japanisch | 100 | 100 | 98 | 99 | 100 | 100 | 97 | 100 | 100 | 100 | 96 | 100 | 100 | 100 | 100 | 97 |
| Kasachisch | 92 | 90 | 82 | - - | 80 | 78 | 62 | - - | 96 | 93 | 83 | - - | 99 | 99 | 99 | - - |
| Koreanisch | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 100 |
| lateinisch | 87 | 73 | 62 | - - | 72 | 49 | 44 | - - | 93 | 76 | 58 | - - | 97 | 94 | 83 | - - |
| lettisch | 93 | 87 | 75 | 59 | 85 | 75 | 51 | 36 | 97 | 90 | 77 | 54 | 99 | 97 | 98 | 87 |
| litauisch | 95 | 87 | 72 | 62 | 86 | 76 | 42 | 38 | 98 | 89 | 75 | 56 | 100 | 98 | 99 | 92 |
| mazedonisch | 84 | 72 | 60 | 62 | 66 | 52 | 30 | 39 | 86 | 70 | 54 | 55 | 99 | 95 | 97 | 94 |
| malaiisch | 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 |
| mongolisch | 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 |
| persisch | 90 | 80 | 76 | 70 | 78 | 62 | 57 | 46 | 94 | 80 | 70 | 66 | 100 | 98 | 99 | 99 |
| Polieren | 95 | 90 | 77 | 66 | 85 | 77 | 51 | 45 | 98 | 93 | 80 | 59 | 100 | 99 | 99 | 94 |
| Portugiesisch | 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 |
| rumänisch | 87 | 72 | 53 | 59 | 69 | 49 | 24 | 34 | 92 | 74 | 48 | 52 | 99 | 94 | 88 | 90 |
| Russisch | 90 | 78 | 71 | 53 | 76 | 59 | 48 | 40 | 95 | 84 | 72 | 52 | 98 | 92 | 93 | 68 |
| serbisch | 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 |
| slowakisch | 84 | 75 | 63 | - - | 64 | 49 | 32 | - - | 90 | 78 | 61 | - - | 99 | 97 | 96 | - - |
| Slowene | 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 | - - |
| Spanisch | 70 | 56 | 48 | 48 | 44 | 26 | 16 | 19 | 69 | 49 | 32 | 33 | 97 | 94 | 96 | 93 |
| Swahili | 81 | 70 | 57 | - - | 60 | 43 | 25 | - - | 84 | 68 | 49 | - - | 98 | 97 | 98 | - - |
| Schwedisch | 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 |
| Tamil | 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 |
| Thai | 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 | - - | - - |
| Türkisch | 94 | 87 | 69 | 54 | 84 | 71 | 41 | 26 | 98 | 91 | 70 | 44 | 100 | 100 | 97 | 92 |
| ukrainisch | 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 |
| Vietnamesisch | 91 | 87 | 66 | 73 | 79 | 76 | 26 | 36 | 94 | 87 | 74 | 85 | 99 | 98 | 99 | 97 |
| Walisisch | 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 | - - |
| Yoruba | 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 |
| Bedeuten | 86 | 77 | 69 | 67 | 74 | 61 | 48 | 48 | 89 | 78 | 67 | 63 | 96 | 93 | 93 | 91 |
| Mittlere | 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 |
| Standardabweichung | 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 |
Jeder Sprachdetektor verwendet ein probabilistisches N-Gramm-Modell, das auf der Charakterverteilung in einigen Trainingskorpus geschult ist. Die meisten Bibliotheken verwenden nur N-Gramm von Größe 3 (Trigramm), was für die Erkennung der Sprache längerer Textfragmente, die aus mehreren Sätzen bestehen, zufriedenstellend ist. Für kurze Phrasen oder einzelne Wörter reichen Trigramme jedoch nicht aus. Je kürzer der Eingangstext ist, desto weniger N-Gramm sind verfügbar. Die aus so wenigen N-Gramm geschätzten Wahrscheinlichkeiten sind nicht zuverlässig. Aus diesem Grund nutzt Lingua N-Gramm von Größen 1 bis zu 5, was zu einer viel genaueren Vorhersage der richtigen Sprache führt.
Ein zweiter wichtiger Unterschied besteht darin, dass Lingua nicht nur ein solches statistisches Modell, sondern auch einen regelbasierten Motor verwendet. Diese Engine bestimmt zunächst das Alphabet des Eingabentextes und sucht nach Zeichen, die in einer oder mehreren Sprachen eindeutig sind. Wenn genau eine Sprache auf diese Weise zuverlässig ausgewählt werden kann, ist das statistische Modell nicht mehr erforderlich. In jedem Fall filtert die regelbasierte Engine Sprachen heraus, die die Bedingungen des Eingabetxtes nicht erfüllen. Nur dann wird in einem zweiten Schritt das probabilistische n-Gramm-Modell berücksichtigt. Dies ist sinnvoll, da das Laden weniger Sprachmodelle weniger Speicherverbrauch und eine bessere Laufzeitleistung bedeutet.
Im Allgemeinen ist es immer eine gute Idee, die Sprachenmenge einzuschränken, die im Klassifizierungsprozess anhand der jeweiligen API -Methoden berücksichtigt werden soll. Wenn Sie vorher wissen, dass bestimmte Sprachen niemals in einem Eingabetxt auftreten dürfen, lassen Sie diese nicht am Klassifizierungsprozess teilnehmen. Der Filtermechanismus der regelbasierten Engine ist ziemlich gut. Die Filterung auf der Grundlage Ihrer eigenen Kenntnis des Eingabetxtes ist jedoch immer vorzuziehen.
Wenn Sie die oben genannten Genauigkeitsergebnisse reproduzieren möchten, können Sie die Testberichte selbst für beide Klassifikatoren und alle Sprachen erstellen, indem Sie:
cd cmd
go run accuracy_reporter.go
Damit GoCLD3 erfolgreich ausgeführt werden kann, müssen Sie die exakten Version 3.17.3 von Googles Protokollpuffern installieren, was etwas unglücklich ist. Für jeden Detektor und jede Sprache wird dann eine Testberichtdatei in /accuracy-reports geschrieben. Als Beispiel finden Sie hier die aktuelle Ausgabe des Lingua Deutschen Berichts:
##### 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
Lingua erfordert mindestens GO Version 1.18.
git clone https://github.com/pemistahl/lingua-go.git
cd lingua-go
go build
Der Quellcode wird von einer umfangreichen Unit -Testsuite begleitet. Um die Tests durchzuführen, sagen Sie einfach:
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
}Standardmäßig gibt Lingua die wahrscheinlichste Sprache für einen bestimmten Eingangstext zurück. Es gibt jedoch bestimmte Wörter, die in mehr als einer Sprache gleich geschrieben werden. Das Wort Prolog ist zum Beispiel sowohl ein gültiges englisches als auch ein französisches Wort. Lingua würde entweder Englisch oder Französisch ausgeben, was im gegebenen Kontext falsch sein könnte. In solchen Fällen ist es möglich, einen minimalen relativen Abstand anzugeben, den die Logarithmus für jede mögliche Sprache erfüllen muss. Es kann auf folgende Weise angegeben werden:
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
} Beachten Sie, dass der Abstand zwischen den Sprachwahrscheinlichkeiten von der Länge des Eingabetxtes abhängt. Je länger der Eingangstext, desto größer ist der Abstand zwischen den Sprachen. Wenn Sie also sehr kurze Textphrasen klassifizieren möchten, setzen Sie den minimalen relativen Abstand nicht zu hoch. Andernfalls wird Unknown die meiste Zeit wie im obigen Beispiel zurückgegeben. Dies ist der Rückgabewert für Fälle, in denen die Spracherkennung nicht zuverlässig möglich ist. Dieser Wert soll beim Erstellen des Sprachdetektors nicht in den Satz Eingabessprachen aufgenommen werden. Wenn Sie es einschließen, wird es automatisch aus dem Satz der Eingabessprachen entfernt.
Es ist schön, über die wahrscheinlichste Sprache zu wissen, aber wie zuverlässig ist die berechnete Wahrscheinlichkeit? Und wie weniger wahrscheinlich sind die anderen untersuchten Sprachen im Vergleich zum wahrscheinlichsten? Diese Fragen können ebenfalls beantwortet werden:
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
} Im obigen Beispiel wird ein Stück ConfidenceValue zurückgegeben, das alle möglichen Sprachen enthält, die nach ihrem Vertrauenswert in absteigender Reihenfolge sortiert sind. Jeder Wert ist eine Wahrscheinlichkeit zwischen 0,0 und 1,0. Die Wahrscheinlichkeiten aller Sprachen summieren sich auf 1,0. Wenn die Sprache eindeutig durch die Regel -Engine identifiziert wird, wird der Wert 1.0 für diese Sprache immer zurückgegeben. Die anderen Sprachen erhalten einen Wert von 0,0.
Es gibt auch eine Methode, um den Konfidenzwert nur für eine bestimmte Sprache zurückzugeben:
confidence := detector . ComputeLanguageConfidence ( "languages are awesome" , lingua . French )
fmt . Printf ( "%.2f" , confidence )
// Output:
// 0.04Der Wert, den diese Methode berechnet, ist eine Zahl zwischen 0,0 und 1,0. Wenn die Sprache eindeutig durch die Regelmotor identifiziert wird, wird der Wert 1.0 immer zurückgegeben. Wenn die angegebene Sprache von dieser Detektorinstanz nicht unterstützt wird, wird der Wert 0,0 immer zurückgegeben.
Standardmäßig lädt Lingua nur diese Sprachmodelle auf Bedarf, die von der regelbasierten Filtermotor als relevant werden. Für Webdienste ist es beispielsweise ziemlich vorteilhaft, alle Sprachmodelle in das Gedächtnis zu bringen, um unerwartete Latenz zu vermeiden und gleichzeitig auf die Serviceantwort zu warten. Wenn Sie den eifrigen Ladenmodus aktivieren möchten, können Sie dies so tun:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithPreloadedLanguageModels ().
Build () Mehrere Instanzen von LanguageDetector teilen die gleichen Sprachmodelle im Speicher, auf die von den Instanzen asynchron zugegriffen werden.
Die hohe Erkennungsgenauigkeit von Lingua ergibt sich zu den Kosten, die merklich langsamer sind als andere Sprachdetektoren. Die großen Sprachmodelle verbrauchen auch erhebliche Mengen an Gedächtnis. Diese Anforderungen sind möglicherweise nicht möglich für Systeme, die nur geringe Ressourcen betreiben. Wenn Sie meistens lange Texte klassifizieren oder Ressourcen sparen müssen, können Sie einen geringen Genauigkeitsmodus aktivieren, in dem nur eine kleine Teilmenge der Sprachmodelle in den Speicher geladen werden:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithLowAccuracyMode ().
Build ()Der Nachteil dieses Ansatzes ist, dass die Erkennungsgenauigkeit für kurze Texte, die aus weniger als 120 Zeichen bestehen, erheblich sinken wird. Die Erkennungsgenauigkeit für Texte, die länger als 120 Zeichen sind, bleiben jedoch größtenteils unberührt.
Im hohen Genauigkeitsmodus (standardmäßig) verbraucht der Sprachdetektor ungefähr 1.800 MB Speicher, wenn alle Sprachmodelle geladen werden. Im niedrigen Genauigkeitsmodus wird der Speicherverbrauch auf ungefähr 110 MB reduziert. Ziel ist es, den Speicherverbrauch in späteren Veröffentlichungen weiter zu reduzieren.
Eine Alternative für einen kleineren Speicherpflichtigen und eine schnellere Leistung besteht darin, die Sprachenmenge beim Erstellen des Sprachdetektors zu reduzieren. In den meisten Fällen ist es nicht ratsam, den Detektor aus allen unterstützten Sprachen aufzubauen. Wenn Sie Kenntnisse über die Texte haben, die Sie klassifizieren möchten, können Sie fast immer bestimmte Sprachen als unmöglich oder unwahrscheinlich ausschließen.
Im Gegensatz zu den meisten anderen Sprachdetektoren kann Lingua mehrere Sprachen in gemischten Texten erkennen. Diese Funktion kann zu vernünftigen Ergebnissen führen, aber es befindet sich immer noch in einem experimentellen Zustand, und daher ist das Erkennungsergebnis in hohem Maße vom Eingangstext abhängig. Es funktioniert am besten im Hochschulmodus mit mehreren langen Wörtern für jede Sprache. Je kürzer die Phrasen und ihre Wörter sind, desto weniger genau sind die Ergebnisse. Durch die Reduzierung der Sprachenmenge beim Erstellen des Sprachdetektors kann auch die Genauigkeit für diese Aufgabe verbessert werden, wenn die im Text auftretenden Sprachen den Sprachen entsprechen, die von der jeweiligen Sprachdetektorinstanz unterstützt werden.
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.'
} Im obigen Beispiel wird ein Stück DetectionResult zurückgegeben. Jeder Eintrag in der Scheibe beschreibt einen zusammenhängenden Texte-Abschnitt mit einer Sprache, der Start- und Endindizes der jeweiligen Substring bereitstellt.
Es könnte Klassifizierungsaufgaben geben, bei denen Sie vorher wissen, dass Ihre Sprachdaten beispielsweise in Latein definitiv nicht geschrieben sind. Die Erkennungsgenauigkeit kann in solchen Fällen besser werden, wenn Sie bestimmte Sprachen aus dem Entscheidungsprozess ausschließen oder nur explizit relevante Sprachen enthalten:
// 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 )Schauen Sie sich die geplanten Probleme an.
Alle Beiträge zu Lingua werden sehr geschätzt. Bitte lesen Sie die Anweisungen für CONTRIBUTING.md , wie Sie der Bibliothek neue Sprachen hinzufügen können.