
它的任務很簡單:它告訴您某些文本寫在哪種語言中。這是自然語言處理應用程序(例如文本分類和拼寫檢查)中語言數據的預處理步驟非常有用的。例如,其他用例可能包括基於電子郵件的語言將電子郵件路由到正確的地理位置客戶服務部門。
語言檢測通常是大型機器學習框架或自然語言處理應用程序的一部分。如果您不需要這些系統的全面功能或不想學習這些系統的繩索,那麼一個小的靈活庫就派上用場了。
到目前為止,該任務的GO生態系統中唯一的其他全面開源庫是Whatlanggo 。不幸的是,它有兩個主要缺點:
通用旨在消除這些問題。她幾乎不需要任何配置,即使在單個單詞和短語上,也可以在短文本和短文本上產生相當準確的結果。她借鑒了基於規則的和統計方法,但不使用任何單詞字典。她也不需要與任何外部API或服務的連接。庫下載後,可以完全離線使用。
與其他語言檢測庫相比,通用庫的重點是質量而不是數量,也就是說,在添加新語言之前,首先要為一小部分語言進行檢測。目前,支持以下75種語言:
通用語言能夠為每種受支持的語言可用的一些捆綁測試數據報告準確性統計信息。每種語言的測試數據分為三個部分:
語言模型和測試數據都是從德國萊比錫大學提供的磨砂機構的單獨文檔創建的。來自各種新聞網站的數據已被用於培訓,每個語料庫包括一百萬個句子。為了進行測試,已經使用了任意選擇的網站的語料庫,每個網站包括一萬個句子。從每個測試語料庫中,分別提取了1000個單詞,1000個單詞和1000個句子的隨機未分類子集。
鑑於生成的測試數據,我比較了語言和Whatlanggo在語言支持的75種語言中運行的檢測結果。此外,我在GOCLD3綁定的幫助下將Google的CLD3添加到了比較中。在檢測過程中, CLD3或Whatlanggo不支持的語言被忽略了。
以下每個部分都包含兩個圖。條圖顯示了每種受支持語言的詳細準確性結果。框圖說明了每個分類器的精度值的分佈。盒子本身代表了中間數據中的50%所在的區域。在彩色框中,水平線標記了分佈的中位數。
下表顯示了每種語言和分類器的詳細統計信息,包括均值,中值和標準偏差。
| 語言 | 平均的 | 單詞 | 單詞對 | 句子 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 語言 (高精度模式) | 語言 (精確模式低) | CLD3 | Whatlang | 語言 (高精度模式) | 語言 (精確模式低) | CLD3 | Whatlang | 語言 (高精度模式) | 語言 (精確模式低) | CLD3 | Whatlang | 語言 (高精度模式) | 語言 (精確模式低) | CLD3 | Whatlang | |
| 南非荷蘭語 | 79 | 64 | 55 | 51 | 58 | 38 | 22 | 21 | 81 | 62 | 46 | 39 | 97 | 93 | 98 | 92 |
| 阿爾巴尼亞人 | 88 | 80 | 55 | - | 69 | 54 | 18 | - | 95 | 86 | 48 | - | 100 | 99 | 98 | - |
| 阿拉伯 | 98 | 94 | 90 | 89 | 96 | 88 | 79 | 77 | 99 | 96 | 92 | 91 | 100 | 99 | 100 | 99 |
| 亞美尼亞人 | 100 | 100 | 99 | - | 100 | 100 | 100 | - | 100 | 100 | 100 | - | 100 | 100 | 97 | - |
| 亞塞拜然 | 90 | 82 | 81 | 64 | 77 | 71 | 62 | 45 | 92 | 78 | 82 | 58 | 99 | 96 | 99 | 91 |
| 巴斯克 | 84 | 75 | 62 | - | 71 | 56 | 33 | - | 87 | 76 | 62 | - | 93 | 92 | 92 | - |
| 白俄羅斯人 | 97 | 92 | 84 | 81 | 92 | 80 | 67 | 64 | 99 | 95 | 86 | 80 | 100 | 100 | 100 | 98 |
| 孟加拉 | 100 | 100 | 99 | 100 | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 |
| 博克馬爾 | 58 | 50 | - | 34 | 39 | 27 | - | 15 | 59 | 47 | - | 28 | 77 | 75 | - | 60 |
| 波斯尼亞 | 35 | 29 | 33 | - | 29 | 23 | 19 | - | 35 | 29 | 28 | - | 41 | 36 | 52 | - |
| 保加利亞語 | 87 | 78 | 70 | 61 | 70 | 56 | 45 | 37 | 91 | 81 | 66 | 57 | 99 | 96 | 98 | 89 |
| 加泰羅尼亞 | 70 | 58 | 48 | - | 51 | 33 | 19 | - | 74 | 60 | 42 | - | 87 | 82 | 84 | - |
| 中國人 | 100 | 100 | 92 | 100 | 100 | 100 | 92 | 100 | 100 | 100 | 83 | 100 | 100 | 100 | 100 | 100 |
| 克羅地亞人 | 73 | 60 | 42 | 55 | 53 | 36 | 26 | 28 | 74 | 57 | 42 | 44 | 90 | 86 | 58 | 91 |
| 捷克 | 80 | 71 | 64 | 50 | 66 | 54 | 39 | 31 | 84 | 72 | 65 | 46 | 91 | 87 | 88 | 71 |
| 丹麥語 | 81 | 70 | 58 | 47 | 61 | 45 | 26 | 24 | 84 | 70 | 54 | 38 | 98 | 95 | 95 | 79 |
| 荷蘭 | 77 | 64 | 58 | 47 | 55 | 36 | 29 | 22 | 81 | 61 | 47 | 36 | 96 | 94 | 97 | 82 |
| 英語 | 81 | 63 | 54 | 49 | 55 | 29 | 22 | 17 | 89 | 62 | 44 | 35 | 99 | 97 | 97 | 94 |
| 世界語 | 84 | 66 | 57 | 52 | 67 | 44 | 22 | 25 | 85 | 61 | 51 | 45 | 98 | 93 | 98 | 88 |
| 愛沙尼亞人 | 92 | 83 | 70 | 61 | 80 | 62 | 41 | 36 | 96 | 88 | 69 | 53 | 100 | 99 | 99 | 94 |
| 芬蘭 | 96 | 91 | 80 | 71 | 90 | 77 | 58 | 45 | 98 | 95 | 84 | 70 | 100 | 100 | 99 | 98 |
| 法語 | 89 | 77 | 55 | 64 | 74 | 52 | 22 | 37 | 94 | 83 | 49 | 59 | 99 | 98 | 94 | 97 |
| 甘達 | 91 | 84 | - | - | 79 | 65 | - | - | 95 | 87 | - | - | 100 | 100 | - | - |
| 格魯吉亞人 | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 96 | 100 |
| 德語 | 89 | 80 | 66 | 65 | 74 | 57 | 40 | 38 | 94 | 84 | 62 | 60 | 100 | 99 | 98 | 97 |
| 希臘語 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| 古吉拉特語 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| 希伯來語 | 100 | 100 | - | 90 | 100 | 100 | - | 76 | 100 | 100 | - | 94 | 100 | 100 | - | 99 |
| 印地語 | 73 | 33 | 58 | 52 | 61 | 11 | 34 | 27 | 64 | 20 | 45 | 40 | 95 | 67 | 95 | 88 |
| 匈牙利 | 95 | 90 | 76 | 62 | 87 | 77 | 53 | 37 | 98 | 94 | 76 | 53 | 100 | 100 | 99 | 95 |
| 冰島 | 93 | 88 | 71 | - | 83 | 72 | 42 | - | 97 | 92 | 70 | - | 100 | 99 | 99 | - |
| 印度尼西亞 | 61 | 47 | 46 | 67 | 39 | 25 | 26 | 39 | 61 | 46 | 45 | 66 | 83 | 71 | 66 | 95 |
| 愛爾蘭人 | 91 | 85 | 67 | - | 82 | 70 | 42 | - | 94 | 90 | 66 | - | 96 | 95 | 94 | - |
| 意大利人 | 87 | 71 | 62 | 56 | 69 | 42 | 31 | 25 | 92 | 74 | 57 | 47 | 100 | 98 | 98 | 96 |
| 日本人 | 100 | 100 | 98 | 99 | 100 | 100 | 97 | 100 | 100 | 100 | 96 | 100 | 100 | 100 | 100 | 97 |
| 哈薩克 | 92 | 90 | 82 | - | 80 | 78 | 62 | - | 96 | 93 | 83 | - | 99 | 99 | 99 | - |
| 韓國人 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 100 |
| 拉丁 | 87 | 73 | 62 | - | 72 | 49 | 44 | - | 93 | 76 | 58 | - | 97 | 94 | 83 | - |
| 拉脫維亞 | 93 | 87 | 75 | 59 | 85 | 75 | 51 | 36 | 97 | 90 | 77 | 54 | 99 | 97 | 98 | 87 |
| 立陶宛語 | 95 | 87 | 72 | 62 | 86 | 76 | 42 | 38 | 98 | 89 | 75 | 56 | 100 | 98 | 99 | 92 |
| 馬其頓 | 84 | 72 | 60 | 62 | 66 | 52 | 30 | 39 | 86 | 70 | 54 | 55 | 99 | 95 | 97 | 94 |
| 馬來語 | 31 | 31 | 22 | - | 26 | 22 | 11 | - | 38 | 36 | 22 | - | 28 | 35 | 34 | - |
| 毛利人 | 91 | 82 | 52 | - | 82 | 62 | 22 | - | 92 | 87 | 43 | - | 99 | 98 | 91 | - |
| 馬拉地語 | 85 | 39 | 84 | 73 | 74 | 16 | 69 | 52 | 85 | 30 | 84 | 74 | 96 | 72 | 98 | 93 |
| 蒙 | 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 |
| 波斯語 | 90 | 80 | 76 | 70 | 78 | 62 | 57 | 46 | 94 | 80 | 70 | 66 | 100 | 98 | 99 | 99 |
| 拋光 | 95 | 90 | 77 | 66 | 85 | 77 | 51 | 45 | 98 | 93 | 80 | 59 | 100 | 99 | 99 | 94 |
| 葡萄牙語 | 81 | 69 | 53 | 57 | 59 | 42 | 21 | 26 | 85 | 70 | 40 | 48 | 99 | 95 | 97 | 96 |
| 旁遮普 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| 羅馬尼亞人 | 87 | 72 | 53 | 59 | 69 | 49 | 24 | 34 | 92 | 74 | 48 | 52 | 99 | 94 | 88 | 90 |
| 俄語 | 90 | 78 | 71 | 53 | 76 | 59 | 48 | 40 | 95 | 84 | 72 | 52 | 98 | 92 | 93 | 68 |
| 塞爾維亞 | 88 | 78 | 78 | 57 | 74 | 62 | 63 | 34 | 90 | 80 | 75 | 51 | 99 | 91 | 95 | 86 |
| 肖納 | 91 | 81 | 76 | 68 | 78 | 56 | 51 | 44 | 96 | 86 | 79 | 65 | 100 | 100 | 99 | 95 |
| 斯洛伐克 | 84 | 75 | 63 | - | 64 | 49 | 32 | - | 90 | 78 | 61 | - | 99 | 97 | 96 | - |
| 斯洛維尼亞 | 82 | 67 | 63 | 48 | 61 | 39 | 29 | 25 | 87 | 68 | 60 | 38 | 99 | 93 | 99 | 81 |
| 索馬利亞 | 92 | 85 | 69 | 68 | 82 | 64 | 38 | 38 | 96 | 90 | 70 | 66 | 100 | 100 | 100 | 99 |
| 索托 | 86 | 72 | 49 | - | 67 | 43 | 15 | - | 90 | 75 | 33 | - | 100 | 97 | 98 | - |
| 西班牙語 | 70 | 56 | 48 | 48 | 44 | 26 | 16 | 19 | 69 | 49 | 32 | 33 | 97 | 94 | 96 | 93 |
| 斯瓦希里語 | 81 | 70 | 57 | - | 60 | 43 | 25 | - | 84 | 68 | 49 | - | 98 | 97 | 98 | - |
| 瑞典 | 84 | 72 | 61 | 49 | 64 | 46 | 30 | 24 | 88 | 76 | 56 | 40 | 99 | 94 | 96 | 83 |
| 他加祿語 | 78 | 66 | - | 52 | 52 | 36 | - | 23 | 83 | 67 | - | 43 | 98 | 96 | - | 90 |
| 泰米爾人 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| 泰盧固語 | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| 泰國 | 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 | - | - |
| 土耳其 | 94 | 87 | 69 | 54 | 84 | 71 | 41 | 26 | 98 | 91 | 70 | 44 | 100 | 100 | 97 | 92 |
| 烏克蘭 | 92 | 86 | 81 | 72 | 84 | 75 | 62 | 53 | 97 | 92 | 83 | 71 | 95 | 93 | 98 | 93 |
| 烏爾都語 | 91 | 80 | 61 | 57 | 80 | 65 | 39 | 31 | 94 | 78 | 53 | 46 | 98 | 96 | 92 | 94 |
| 越南人 | 91 | 87 | 66 | 73 | 79 | 76 | 26 | 36 | 94 | 87 | 74 | 85 | 99 | 98 | 99 | 97 |
| 威爾士語 | 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 | - |
| 約魯巴 | 74 | 62 | 15 | 22 | 50 | 33 | 5 | 11 | 77 | 61 | 11 | 14 | 96 | 92 | 28 | 41 |
| 祖魯 | 81 | 70 | 63 | 70 | 62 | 45 | 35 | 44 | 83 | 72 | 63 | 68 | 97 | 94 | 92 | 98 |
| 意思是 | 86 | 77 | 69 | 67 | 74 | 61 | 48 | 48 | 89 | 78 | 67 | 63 | 96 | 93 | 93 | 91 |
| 中位數 | 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 |
| 標準偏差 | 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 |
每個語言檢測器都使用對某些培訓語料庫中字符分佈訓練的概率N-Gram模型。大多數庫僅使用尺寸3的n-grams(Trigrams),這對於檢測由多個句子組成的較長文本片段的語言令人滿意。但是,對於簡短的短語或單詞,Trigram還不夠。輸入文本越短,n-gram的可用性越少。從如此少數的n-gram估計的概率是不可靠的。這就是為什麼語言利用尺寸1最多5的n-grams的原因,從而可以更準確地預測正確的語言。
第二個重要區別是語言不僅使用這種統計模型,還使用基於規則的引擎。該引擎首先確定輸入文本的字母,並蒐索一種或多種語言獨特的字符。如果完全可以可靠地選擇一種語言,則不再需要統計模型。無論如何,基於規則的引擎會過濾出不滿足輸入文本條件的語言。僅在第二步中,考慮了概率的n-gram模型。這是有道理的,因為加載更少的語言模型意味著更少的內存消耗和更好的運行時性能。
通常,最好使用相應的API方法限制在分類過程中考慮要考慮的語言集。如果您事先知道某些語言永遠不會在輸入文本中出現,請不要讓這些語言參加分類過程。基於規則的引擎的過濾機制非常好,但是,根據您對輸入文本的了解,過濾總是最好的。
如果要復制上述準確性結果,則可以通過以下方式為分類器和所有語言生成測試報告:
cd cmd
go run accuracy_reporter.go
要使GOCLD3成功運行,您需要安裝Google協議緩衝區的確切版本3.17.3,這有點不幸。對於每個檢測器和語言,然後將測試報告文件寫入/accuracy-reports中。例如,這是德語報告的當前輸出:
##### 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
語言至少需要GO版本1.18。
git clone https://github.com/pemistahl/lingua-go.git
cd lingua-go
go build
源代碼伴隨著廣泛的單元測試套件。要運行測試,請簡單地說:
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
}默認情況下,語言返回給定輸入文本的最可能的語言。但是,某些單詞在多種語言中拼寫相同。例如, Prologue一詞既是有效的英語和法語單詞。語言將輸出英語或法語,這在給定的情況下可能是錯誤的。對於這樣的情況,可以指定對數化的最小相對距離,並概括了每種可能的語言必須滿足的概率。可以通過以下方式說明:
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
}請注意,語言概率之間的距離取決於輸入文本的長度。輸入文本越長,語言之間的距離就越大。因此,如果您想對非常短的文本短語進行分類,請不要將最小相對距離設置為太高。否則,大多數情況下將返回Unknown ,如上面的示例。這是語言檢測不太可能可靠的情況的返回值。構建語言檢測器時,此值並不意味著包含在輸入語言集中。如果包含在內,它將自動從輸入語言集中刪除。
了解最可能的語言很不錯,但是計算的可能性有多可靠?與最可能的語言相比,其他研究的語言的可能性較小?這些問題也可以回答:
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
}在上面的示例中,返回了一個ConfidenceValue ,其中包含所有可能的語言,這些語言是按降序順序排列的所有可能的語言。每個值都是0.0到1.0之間的概率。所有語言的概率將總計為1.0。如果該語言由規則引擎明確識別,則該語言的值1.0將始終返回此語言。其他語言將獲得0.0的值。
還有一種僅返回一種特定語言的置信值的方法:
confidence := detector . ComputeLanguageConfidence ( "languages are awesome" , lingua . French )
fmt . Printf ( "%.2f" , confidence )
// Output:
// 0.04該方法計算的值為0.0和1.0之間的數字。如果該語言是由規則引擎明確識別的,則值1.0將始終返回。如果此檢測器實例不支持給定的語言,則始終將返回值0.0。
默認情況下,語言僅使用懶惰加載來按需加載這些語言模型,這些模型被基於規則的濾波器引擎認為相關。例如,對於Web服務,將所有語言模型預加載到內存是相當有益的,以避免在等待服務響應時出乎意料的延遲。如果要啟用急切的加載模式,則可以這樣做:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithPreloadedLanguageModels ().
Build () LanguageDetector的多個實例在內存中共享相同的語言模型,這些模型可通過實例異步訪問。
語言的高檢測準確性是比其他語言探測器明顯慢的成本。大語言模型還消耗了大量的記憶。對於資源低下的系統,這些要求可能是不可行的。如果您想將大部分文本分類或需要節省資源,則可以啟用低精度模式,該模式僅將一小部分語言模型加載到內存中:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithLowAccuracyMode ().
Build ()這種方法的缺點是,由少於120個字符組成的短文本的檢測準確性將大大下降。但是,超過120個字符的文本的檢測準確性將主要不受影響。
在高精度模式下(默認),如果加載了所有語言模型,則語言檢測器將消耗約1800 MB的內存。在低精度模式下,記憶消耗減少到約110 MB。目的是進一步減少以後版本的記憶消耗。
較小的內存足跡和更快的性能的替代方法是減少構建語言檢測器時的語言集。在大多數情況下,不建議從所有受支持的語言中構建檢測器。當您了解要分類的文本時,幾乎總是可以將某些語言排除為不可能或不可能發生的語言。
與大多數其他語言探測器相反,語言能夠在混合語言文本中檢測多種語言。此功能可以產生相當合理的結果,但仍處於實驗狀態,因此檢測結果高度取決於輸入文本。它在高準確模式下使用多個語言的多個長詞最佳。短語及其單詞越短,結果越少。如果文本中出現的語言等於相應的語言檢測器實例,則減少語言檢測器時還可以提高此任務的準確性。
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.'
}在上面的示例中,返回了一片DetectionResult 。切片中的每個條目都描述了一個連續的單語言文本部分,提供了相應的子字符串的啟動和最終索引。
例如,您可能會事先知道您的語言數據絕對不是用拉丁語編寫的。如果您將某些語言排除在決策過程中,或者只是明確包含相關語言,則檢測準確性可以變得更好。
// 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 )看看計劃中的問題。
對語言的任何貢獻都非常感謝。請閱讀有關如何在庫中添加新語言的CONTRIBUTING.md中的說明。