- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
例如,给定以下字符串:
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?
在未检测到语言的情况下返回一个可选字符串。
因此适当的结果是:
let englishDetectedLanguage = detectedLanguage(textEN) // => English
let spanishDetectedLanguage = detectedLanguage(textES) // => Spanish
let arabicDetectedLanguage = detectedLanguage(textAR) // => Arabic
let germanDetectedLanguage = detectedLanguage(textDE) // => German
有没有简单的方法来实现它?
最佳答案
您可以使用 NLLanguageRecognizer 来实现它,如:
import NaturalLanguage
func detectedLanguage(for string: String) -> String? {
let recognizer = NLLanguageRecognizer()
recognizer.processString(string)
guard let languageCode = recognizer.dominantLanguage?.rawValue else { return nil }
let detectedLanguage = Locale.current.localizedString(forIdentifier: languageCode)
return detectedLanguage
}
您可以使用 NSLinguisticTagger 来实现它,如:
func detectedLanguage<T: StringProtocol>(for string: T) -> String? {
let recognizer = NLLanguageRecognizer()
recognizer.processString(String(string))
guard let languageCode = recognizer.dominantLanguage?.rawValue else { return nil }
let detectedLanguage = Locale.current.localizedString(forIdentifier: languageCode)
return detectedLanguage
}
首先,你应该知道你问的主要是关于的世界Natural language processing (NLP) .
由于 NLP 不仅仅是文本语言检测,因此答案的其余部分不会包含具体的 NLP 信息。
显然,实现这样的功能并不容易,尤其是当开始关心过程的细节时,例如拆分成句子甚至单词,然后识别名称和标点符号等......我打赌你会想“多么痛苦的过程!我自己做这件事甚至不合逻辑”;幸运的是,iOS 确实支持 NLP(实际上,NLP API 可用于所有 Apple 平台,而不仅仅是 iOS),使您的目标易于实现。您将使用的核心组件是 NSLinguisticTagger
:
Analyze natural language text to tag part of speech and lexical class, identify names, perform lemmatization, and determine the language and script.
NSLinguisticTagger
provides a uniform interface to a variety of natural language processing functionality with support for many different languages and scripts. You can use this class to segment natural language text into paragraphs, sentences, or words, and tag information about those segments, such as part of speech, lexical class, lemma, script, and language.
如类文档中所述,您正在寻找的方法 - 在确定主要语言和正字法部分 - 是 dominantLanguage(for:)
:
Returns the dominant language for the specified string.
.
.
Return Value
The BCP-47 tag identifying the dominant language of the string, or the tag "und" if a specific language cannot be determined.
您可能会注意到 NSLinguisticTagger
从 iOS 5 开始就存在了。但是,仅支持 dominantLanguage(for:)
方法iOS 11 及更高版本,那是因为它是在 Core ML Framework 之上开发的:
. . .
Core ML is the foundation for domain-specific frameworks and functionality. Core ML supports Vision for image analysis, Foundation for natural language processing (for example, the
NSLinguisticTagger
class), and GameplayKit for evaluating learned decision trees. Core ML itself builds on top of low-level primitives like Accelerate and BNNS, as well as Metal Performance Shaders.
基于通过传递“The quick brown fox jumps over the lazy dog”调用 dominantLanguage(for:)
的返回值:
NSLinguisticTagger.dominantLanguage(for: "The quick brown fox jumps over the lazy dog")
将是“en”可选字符串。但是,到目前为止,这不是所需的输出,期望的是获得“英语”!好吧,这正是您通过调用 localizedString(forLanguageCode:)
应该得到的结果。方法来自 Locale构造并传递获取的语言代码:
Locale.current.localizedString(forIdentifier: "en") // English
如“快速解答”代码片段中所述,该函数将是:
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 englishDetectedLanguage = detectedLanguage(textEN) // => English
let spanishDetectedLanguage = detectedLanguage(textES) // => Spanish
let arabicDetectedLanguage = detectedLanguage(textAR) // => Arabic
let germanDetectedLanguage = detectedLanguage(textDE) // => German
注意:
仍然存在无法获取给定字符串的语言名称的情况,例如:
let textUND = "SdsOE"
let undefinedDetectedLanguage = detectedLanguage(textUND) // => Unknown language
或者它甚至可以是nil
:
let rubbish = "000747322"
let rubbishDetectedLanguage = detectedLanguage(rubbish) // => nil
仍然觉得提供有用的输出是一个不错的结果...
关于 NSLinguisticTagger:
尽管我不会深入研究 NSLinguisticTagger
的用法,但我想指出其中有几个非常酷的功能,而不仅仅是简单地检测给定文本的语言;作为一个非常简单的示例:在枚举标签时使用引理 在使用Information retrieval 时非常有用。 ,因为您可以识别“驾驶”一词传递“驾驶”一词。
Apple 视频 session :
NSLinguisticTagger
工作原理的更多信息:Natural Language Processing and your Apps .此外,为了熟悉 CoreML:
关于ios - 如何检测 iOS 中的文本(字符串)语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47890747/
表架构 DROP TABLE bla; CREATE TABLE bla (id INTEGER, city INTEGER, year_ INTEGER, month_ INTEGER, val I
我需要拆分字符串/或从具有以下结构的字符串中获取更容易的子字符串。 字符串将来自 window.location.pathname 或 window.location.href,看起来像 text/n
每当将对象添加到数组中时,我都会尝试更新 TextView ,并在 TextView 中显示该文本,如下所示: "object 1" "object 2" 问题是,每次将新对象添加到数组时,它都会覆盖
我目前正在寻找使用 Java 读取网站可见文本并将其存储为纯文本字符串的方法。 换句话说,我想转换成这样: Hello stupid World进入“ Hello World ” 或者类似的东西 Un
我正在尝试以文本和 HTML 格式发送电子邮件,但无法正确发送正确的 header 。特别是,我想设置 Content-Type header ,但我找不到如何为 html 和文本部分单独设置它。 这
我尝试了上面的代码,但我无法绑定(bind)文本,我怎样才能将资源内部文本 bloc
我刚刚完成了 Space Shooter 教程,由于没有 GUIText 对象,所以我创建了 UI.Text 对象并进行了相应的编码。它在统一播放器中有效,但在构建 Web 应用程序后无效。我花了一段
我有这个代码: - (IBAction)setButtonPressed:(id)sender { NSUserDefaults *sharedDefaults = [[NSUserDefau
抱歉标题含糊不清,但我想不出我想在标题中做什么。无论如何,对于图像上的文本,我使用了 JLabel 文本并将其添加到图标中。 JLabel icon = new JLabel(new Imag
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我在将 Twitter 嵌入到我从 HTML 5 转换的 wordpress 运行网站时遇到问题。 我遇到的问题是推文不是我的自定义字体... 这是我无法使用任何 css 定位的 HTML 代码,我正
我正在尝试找到解决由于使用以下形式的代码而导致的冗余字符串连接问题的最佳方法: logger.debug("Entering loop, arg is: " + arg) // @1 在大多数情况下,
我写了这个测试 @Test public void removeRequestTextFromRouteError() throws Exception { String input = "F
我目前正在创建一个正则表达式来拆分所有匹配以下格式的字符串:&[文本],并且需要获取文本。字符串可能类似于:something &[text] &[text] everything &[text] 等
有没有办法将标题文本从一个词变形为另一个词,同时保留两个词中使用的字母?我看过的许多 css 文本动画大多是视觉的,很少有旋转整个单词的。 我想要做的是从一个词过渡,例如“BEACH”到“CHANGE
总结matplotlib绘图如何设置坐标轴刻度大小和刻度。 上代码: ?
我在容器 (1) 中创建了容器 (2)。你能帮忙如何向容器(1)添加文本吗?下面是我的代码 return Scaffold( body: Padding( padding: c
我似乎找不到任何人或任何人这样做过。我试图限制我们使用的图像数量,并想创建一个带有渐变作为其“颜色”的文本,并在其周围设置渐变轮廓/描边 到目前为止,我还没有看到任何将两者结合在一起的东西。 我可以自
我正在为视频游戏暗黑破坏神 2 使用 discord.py 构建一个不和谐机器人。其中一项功能要求机器人从暗黑破坏神 2 屏幕截图中提取项目的名称和属性。我目前正在为此使用 pytesseract,但
我很难弄清楚如何旋转 strip.text theme 中的属性来自 ggplot2 .我使用的是 R 版本 3.4.2 和 ggplot2 版本 2.2.1。 以下是 MWE 的数据。 > dput
我是一名优秀的程序员,十分优秀!