golang自然语言检测支持84种语言的插件库whatlanggo的使用
Golang自然语言检测支持84种语言的插件库whatlanggo的使用
简介
whatlanggo是一个用于Go语言的自然语言检测库,支持84种语言的识别。它具有以下特点:
- 支持84种语言
- 100%使用Go编写
- 无外部依赖
- 快速高效
- 不仅能识别语言,还能识别文字脚本(拉丁文、西里尔文等)
安装
使用以下命令安装whatlanggo:
go get -u github.com/abadojack/whatlanggo
基本用法
下面是一个简单的使用示例:
package main
import (
"fmt"
"github.com/abadojack/whatlanggo"
)
func main() {
// 检测文本语言
info := whatlanggo.Detect("Foje funkcias kaj foje ne funkcias")
// 输出检测结果:语言、脚本和置信度
fmt.Println("Language:", info.Lang.String(), " Script:", whatlanggo.Scripts[info.Script], " Confidence: ", info.Confidence)
}
黑名单和白名单功能
whatlanggo支持通过黑名单和白名单来限制检测的语言范围:
package main
import (
"fmt"
"github.com/abadojack/whatlanggo"
)
func main() {
// 黑名单示例 - 排除意第绪语(Ydd)
options := whatlanggo.Options{
Blacklist: map[whatlanggo.Lang]bool{
whatlanggo.Ydd: true,
},
}
info := whatlanggo.DetectWithOptions("האקדמיה ללשון העברית", options)
fmt.Println("Language:", info.Lang.String(), "Script:", whatlanggo.Scripts[info.Script])
// 白名单示例 - 只检测世界语(Epo)和乌克兰语(Ukr)
options1 := whatlanggo.Options{
Whitelist: map[whatlanggo.Lang]bool{
whatlanggo.Epo: true,
whatlanggo.Ukr: true,
},
}
info = whatlanggo.DetectWithOptions("Mi ne scias", options1)
fmt.Println("Language:", info.Lang.String(), " Script:", whatlanggo.Scripts[info.Script])
}
工作原理
语言识别原理
whatlanggo使用基于三元组语言模型的算法进行语言识别。这种算法是n-gram的一种特殊情况。核心思想来自Cavnar和Trenkle在1994年发表的论文《N-Gram-Based Text Categorization》。
可靠性计算
whatlanggo通过以下因素计算检测结果的可靠性:
- 给定文本中唯一三元组的数量
- 第一候选语言和第二候选语言之间的差异(代码中称为"rate")
这些因素构成了一个二维空间,通过阈值函数将其划分为"可靠"和"不可靠"区域。这个函数是一个双曲线,如下图所示:
系统要求
Go 1.8或更高版本
许可证
MIT许可证
致谢
whatlanggo是基于JavaScript的Franc库(MIT许可证)的衍生作品,由Titus Wormer开发。同时感谢greyblake(Potapov Sergey)创建了whatlang-rs,从中获得了灵感和算法。
更多关于golang自然语言检测支持84种语言的插件库whatlanggo的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang自然语言检测支持84种语言的插件库whatlanggo的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用whatlanggo进行自然语言检测
whatlanggo是一个用Go编写的轻量级自然语言检测库,支持84种语言的识别。它基于n-gram算法和统计方法,具有快速、准确的特点。
安装
go get github.com/abadojack/whatlanggo
基本用法
1. 简单语言检测
package main
import (
"fmt"
"github.com/abadojack/whatlanggo"
)
func main() {
text := "这是一段中文文本"
info := whatlanggo.Detect(text)
fmt.Printf("检测结果:\n")
fmt.Printf("语言: %s\n", info.Lang.String())
fmt.Printf("脚本: %s\n", info.Script.String())
fmt.Printf("置信度: %.2f\n", info.Confidence)
fmt.Printf("是否可靠: %v\n", info.IsReliable())
}
2. 带选项的检测
func detectWithOptions() {
text := "This is a sample text in English with some 中文 mixed in."
// 限制检测的语言范围
options := whatlanggo.Options{
Whitelist: map[whatlanggo.Lang]bool{
whatlanggo.Eng: true,
whatlanggo.Cmn: true,
},
}
info := whatlanggo.DetectWithOptions(text, options)
fmt.Printf("混合文本检测结果: %s (%.2f)\n", info.Lang.String(), info.Confidence)
}
3. 批量检测
func batchDetection() {
texts := []string{
"Bonjour tout le monde", // 法语
"こんにちは世界", // 日语
"Hola mundo", // 西班牙语
"Привет мир", // 俄语
}
for _, text := range texts {
info := whatlanggo.Detect(text)
fmt.Printf("'%s' -> %s (%.2f)\n", text, info.Lang.String(), info.Confidence)
}
}
高级功能
1. 获取所有支持的语言
func listAllLanguages() {
fmt.Println("支持的84种语言:")
for _, lang := range whatlanggo.Langs() {
fmt.Println(lang.String())
}
}
2. 自定义阈值
func detectionWithThreshold() {
text := "This is a very short text"
// 默认最小文本长度是10,可以修改
whatlanggo.MinTextLength = 5
info := whatlanggo.Detect(text)
if info.IsReliable() {
fmt.Printf("检测到语言: %s\n", info.Lang.String())
} else {
fmt.Println("文本太短或不可靠")
}
}
性能优化
对于大量文本检测,可以重用Options对象:
func efficientBatchDetection() {
texts := []string{
"Lorem ipsum dolor sit amet",
"天地玄黄 宇宙洪荒",
"На берегу пустынных волн",
}
// 创建一次Options对象
opts := whatlanggo.Options{
Whitelist: map[whatlanggo.Lang]bool{
whatlanggo.Eng: true,
whatlanggo.Cmn: true,
whatlanggo.Rus: true,
},
}
for _, text := range texts {
info := whatlanggo.DetectWithOptions(text, opts)
fmt.Printf("检测结果: %s\n", info.Lang.String())
}
}
注意事项
- whatlanggo对短文本(少于10个字符)的检测可能不可靠
- 混合语言的文本会返回主要语言的检测结果
- 对于某些相似语言(如塞尔维亚语和克罗地亚语),可能需要更长的文本来区分
- 置信度低于0.5的结果通常不可靠
whatlanggo是一个简单高效的库,适用于大多数语言检测场景。如果需要更高级的功能(如语言概率分布),可以考虑其他更复杂的库。