
它的任务很简单:它告诉您某些文本写在哪种语言中。这是自然语言处理应用程序(例如文本分类和拼写检查)中语言数据的预处理步骤非常有用的。例如,其他用例可能包括基于电子邮件的语言将电子邮件路由到正确的地理位置客户服务部门。
语言检测通常是大型机器学习框架或自然语言处理应用程序的一部分。如果您不需要这些系统的全面功能或不想学习这些系统的绳索,那么一个小的灵活库就派上用场了。
到目前为止,该任务的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中的说明。