Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在iOS中检测文本(字符串)语言?_Ios_Swift_Nslinguistictagger - Fatal编程技术网

如何在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
    工作原理的更多信息:
另外,为了熟悉CoreML:


您可以使用NSLinguistics Tagger的tagAt方法。它支持iOS 5及更高版本

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)
}