Ahm*_*d F 10 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 den faulen Hund"
Run Code Online (Sandbox Code Playgroud)
我想检测每个声明的字符串中使用的语言.
我们假设已实现函数的签名是:
func detectedLangauge<T: StringProtocol>(_ forString: T) -> String?
Run Code Online (Sandbox Code Playgroud)
如果没有检测到语言,则返回可选字符串.
因此,适当的结果将是:
let englishDetectedLangauge = detectedLangauge(textEN) // => English
let spanishDetectedLangauge = detectedLangauge(textES) // => Spanish
let arabicDetectedLangauge = detectedLangauge(textAR) // => Arabic
let germanDetectedLangauge = detectedLangauge(textDE) // => German
Run Code Online (Sandbox Code Playgroud)
有一个简单的方法来实现它吗?
Ahm*_*d F 20
从iOS 11+开始,您可以使用NSLinguisticTagger实现它.实现如下所需的功能:
import NaturalLanguage
func detectedLangauge(for string: String) -> String? {
let recognizer = NLLanguageRecognizer()
recognizer.processString(string)
guard let languageCode = recognizer.dominantLanguage?.rawValue else { return nil }
let detectedLangauge = Locale.current.localizedString(forIdentifier: languageCode)
return detectedLangauge
}
Run Code Online (Sandbox Code Playgroud)
应该达到你所要求的.
首先,你应该知道你在问什么主要涉及自然语言处理(NLP)的世界.
由于NLP不仅仅是文本语言检测,因此答案的其余部分将不包含特定的NLP信息.
显然,实现这样的功能并不是那么容易,特别是在开始关注过程的细节时,例如分成句子甚至是单词,在识别名称和标点符号之后......我打赌你会想到"什么一个痛苦的过程!我自己做这件事并不合乎逻辑"; 幸运的是,iOS 确实支持NLP(实际上,NLP API可用于所有Apple平台,而不仅仅是iOS),以实现您希望易于实现的目标.您将使用的核心组件是NSLinguisticTagger:
分析自然语言文本以标记词性和词汇类,识别名称,执行词形还原,并确定语言和脚本.
NSLinguisticTagger为各种自然语言处理功能提供统一的接口,支持许多不同的语言和脚本.您可以使用此类将自然语言文本分段为段落,句子或单词,并标记有关这些段的信息,例如词性,词汇类,引理,脚本和语言.
正如课程文档中所提到的,您正在寻找的方法 - 在确定主导语言和正字法部分 - 是dominantLanguage(for:):
返回指定字符串的主要语言.
.
.
回报价值
的BCP-47标签标识字符串的主导语言,或者标签"UND"如果不能确定特定的语言.
您可能会注意到,NSLinguisticTagger自从回到iOS 5后它就存在了.但是,dominantLanguage(for:)方法仅支持iOS 11及更高版本,因为它是在Core ML Framework之上开发的:
...
Core ML是特定于域的框架和功能的基础.Core ML支持用于图像分析的Vision,用于自然语言处理的Foundation (例如,
NSLinguisticTagger类),以及用于评估学习的决策树的GameplayKit.Core ML本身建立在低级原语之上,如Accelerate和BNNS,以及Metal Performance Shaders.
基于dominantLanguage(for:)通过传递"快速棕色狐狸跳过懒狗"的呼叫返回值:
func detectedLangauge<T: StringProtocol>(for string: T) -> String? {
let recognizer = NLLanguageRecognizer()
recognizer.processString(String(string))
guard let languageCode = recognizer.dominantLanguage?.rawValue else { return nil }
let detectedLangauge = Locale.current.localizedString(forIdentifier: languageCode)
return detectedLangauge
}
Run Code Online (Sandbox Code Playgroud)
将是"en"可选字符串.然而,到目前为止,这不是理想的输出,期望是获得"英语"!好吧,这正是你应该通过localizedString(forLanguageCode:)从Locale Structure 调用方法并传递获得的语言代码得到的:
NSLinguisticTagger.dominantLanguage(for: "The quick brown fox jumps over the lazy dog")
Run Code Online (Sandbox Code Playgroud)
正如"快速回答"代码段中所述,该函数将是:
Locale.current.localizedString(forIdentifier: "en") // English
Run Code Online (Sandbox Code Playgroud)
输出:
这将是预期的:
func detectedLangauge<T: StringProtocol>(_ forString: T) -> String? {
guard let languageCode = NSLinguisticTagger.dominantLanguage(for: String(forString)) else {
return nil
}
let detectedLangauge = Locale.current.localizedString(forIdentifier: languageCode)
return detectedLangauge
}
Run Code Online (Sandbox Code Playgroud)
注意:
仍然没有获得给定字符串的语言名称,例如:
let englishDetectedLangauge = detectedLangauge(textEN) // => English
let spanishDetectedLangauge = detectedLangauge(textES) // => Spanish
let arabicDetectedLangauge = detectedLangauge(textAR) // => Arabic
let germanDetectedLangauge = detectedLangauge(textDE) // => German
Run Code Online (Sandbox Code Playgroud)
或者甚至可以nil:
let textUND = "SdsOE"
let undefinedDetectedLanguage = detectedLangauge(textUND) // => Unknown language
Run Code Online (Sandbox Code Playgroud)
仍然发现提供有用的输出是一个不错的结果......
虽然我不打算深入NSLinguisticTagger使用,但我想指出,它中存在一些非常酷的功能,而不仅仅是检测给定文本的语言; 作为一个非常简单的例子:在使用信息检索时,在枚举标签时使用引理会非常有用,因为您可以识别"驱动"这个词传递"驱动"字.
Apple视频会话:
NSLinguisticTagger工作原理:自然语言处理和您的应用程序.另外,为了熟悉CoreML:
| 归档时间: |
|
| 查看次数: |
3297 次 |
| 最近记录: |