如何在iOS中检测文本(字符串)语言?
例如,给定以下字符串:如何在iOS中检测文本(字符串)语言?,ios,swift,nslinguistictagger,Ios,Swift,Nslinguistictagger,例如,给定以下字符串: let textEN = "The quick brown fox jumps over the lazy dog" let textES = "El zorro marrón rápido salta sobre el perro perezoso" let textAR = "الثعلب البني السريع يقفز فوق الكلب الكسول" let textDE = "Der schnelle braune Fuchs springt über d
let textEN = "The quick brown fox jumps over the lazy dog"
let textES = "El zorro marrón rápido salta sobre el perro perezoso"
let textAR = "الثعلب البني السريع يقفز فوق الكلب الكسول"
let textDE = "Der schnelle braune Fuchs springt über den faulen Hund"
我想检测每种语言中使用的语言
假设已实现函数的签名为:
func detectedLanguage<T: StringProtocol>(_ forString: T) -> String?
是否有一种简单的方法来实现它?最新版本(iOS 12+)
简要地:
您可以通过以下方式实现:
旧版本(iOS 11+) 简要地: 您可以通过以下方式实现: 将是“en”可选字符串。然而,到目前为止,这不是期望的输出,期望的是得到“英语”代替!这正是通过从结构中调用方法并传递得到的语言代码应该得到的:
Locale.current.localizedString(forIdentifier: "en") // English
综合起来:
如“快速回答”代码片段中所述,该函数将是:
let englishDetectedLanguage = detectedLanguage(textEN) // => English
let spanishDetectedLanguage = detectedLanguage(textES) // => Spanish
let arabicDetectedLanguage = detectedLanguage(textAR) // => Arabic
let germanDetectedLanguage = detectedLanguage(textDE) // => German
func detectedLanguage<T: StringProtocol>(_ forString: T) -> String? {
guard let languageCode = NSLinguisticTagger.dominantLanguage(for: String(forString)) else {
return nil
}
let detectedLanguage = Locale.current.localizedString(forIdentifier: languageCode)
return detectedLanguage
}
注意:
仍然存在无法获取给定字符串的语言名称的情况,例如:
let textUND = "SdsOE"
let undefinedDetectedLanguage = detectedLanguage(textUND) // => Unknown language
或者甚至可以是nil
:
let rubbish = "000747322"
let rubbishDetectedLanguage = detectedLanguage(rubbish) // => nil
仍然发现这对于提供有用的输出来说是一个不错的结果
此外: 关于NSLanguagistTagger: 虽然我不打算深入探讨
nslanguarystagger
的用法,但我想指出,它有两个非常酷的特性,不仅仅是检测给定文本的语言;作为一个非常简单的示例:在枚举标记时使用引理在使用时非常有用,因为您将能够识别“driving”一词并传递“drive”一词
官方资源
苹果视频会议:
- 有关自然语言处理和
工作原理的更多信息:nsLinguagistTagger
func detectLanguage<T: StringProtocol>(for text: T) -> String? {
let tagger = NSLinguisticTagger.init(tagSchemes: [.language], options: 0)
tagger.string = String(text)
guard let languageCode = tagger.tag(at: 0, scheme: .language, tokenRange: nil, sentenceRange: nil) else { return nil }
return Locale.current.localizedString(forIdentifier: languageCode)
}
detectLanguage(for: "The quick brown fox jumps over the lazy dog") // English
detectLanguage(for: "El zorro marrón rápido salta sobre el perro perezoso") // Spanish
detectLanguage(for: "الثعلب البني السريع يقفز فوق الكلب الكسول") // Arabic
detectLanguage(for: "Der schnelle braune Fuchs springt über den faulen Hund") // German
func检测语言(对于文本:T)->字符串?{
让tagger=nsLinguagistTagger.init(tagSchemes:[.language],选项:0)
tagger.string=字符串(文本)
guard let languageCode=tagger.tag(at:0,scheme:.language,tokenRange:nil,sentenceRange:nil)else{return nil}
返回Locale.current.localizedString(forIdentifier:languageCode)
}
detectLanguage(用于:“敏捷的棕色狐狸跳过懒惰的狗”)//英语
detectLanguage(代表:“El zorro marrón rápido salta sobre El perro Perezo”)//西班牙语
检测语言(用于:“检测语言”(用于阿拉伯语)
detectLanguage(代表:“施奈尔·布劳恩·福斯·斯普林特·贝尔登·福伦·亨德”)//德语
我尝试了nslanguagestictagger
,输入的文字很短,比如hello
,它总是能识别为意大利语。
幸运的是,苹果最近在iOS 12上增加了可用的版本,而且看起来更准确:D
import NaturalLanguage
if #available(iOS 12.0, *) {
let languageRecognizer = NLLanguageRecognizer()
languageRecognizer.processString(text)
let code = languageRecognizer.dominantLanguage!.rawValue
let language = Locale.current.localizedString(forIdentifier: code)
}
我想你没有找到一个可以在服务器上运行的版本?@Burf2000没有。你应该尝试找到一种与服务器使用的编程语言/框架相关的NLP工作方法。对不起,我应该澄清一下,我指的是运行在Linux上的Swift服务器,因为我相信这个框架不是开源的yet@AhmadF一句话!它无法检测文本(字符串)语言,因此它对我不起作用。请你测试一下这个好吗
detectLanguage(代表:“伊斯兰教”)
@NazmulHasan我将通过添加另一种不同的方法更新我的答案。但是,请记住,伊斯兰教
将被视为“土耳其语”。
let textUND = "SdsOE"
let undefinedDetectedLanguage = detectedLanguage(textUND) // => Unknown language
let rubbish = "000747322"
let rubbishDetectedLanguage = detectedLanguage(rubbish) // => nil
func detectLanguage<T: StringProtocol>(for text: T) -> String? {
let tagger = NSLinguisticTagger.init(tagSchemes: [.language], options: 0)
tagger.string = String(text)
guard let languageCode = tagger.tag(at: 0, scheme: .language, tokenRange: nil, sentenceRange: nil) else { return nil }
return Locale.current.localizedString(forIdentifier: languageCode)
}
detectLanguage(for: "The quick brown fox jumps over the lazy dog") // English
detectLanguage(for: "El zorro marrón rápido salta sobre el perro perezoso") // Spanish
detectLanguage(for: "الثعلب البني السريع يقفز فوق الكلب الكسول") // Arabic
detectLanguage(for: "Der schnelle braune Fuchs springt über den faulen Hund") // German
import NaturalLanguage
if #available(iOS 12.0, *) {
let languageRecognizer = NLLanguageRecognizer()
languageRecognizer.processString(text)
let code = languageRecognizer.dominantLanguage!.rawValue
let language = Locale.current.localizedString(forIdentifier: code)
}