我需要从句子中获取人名.
示例:My Name is David Bonds and i live in new york.我想提取名称David Bonds.
My Name is肯定会在每一句话中.但在名称之后它可以包含句子的其余部分或者可能没有任何内容.从这个答案我能够达到目的My Name is.但它将打印出所有句子的其余部分.我想确保它只会抓取next two words.
if let range = conversation.range(of: "My Name is") {
let name = conversation.substring(from: range.upperBound).trimmingCharacters(in: .whitespacesAndNewlines)
print(name)
}
Run Code Online (Sandbox Code Playgroud)
现在几乎是时候使用Swift 4,iOS 11,使用起来NSLinguisticTagger更容易一些.
因此,为了将来参考,您可以使用NSLinguisticTagger从句子中提取名称.这不依赖于命名令牌后面的名称或两个单词的名称.
这是来自Xcode 9 Playground
import UIKit
let sentence = "My Name is David Bonds and I live in new york."
// Create the tagger's options and language scheme
let options: NSLinguisticTagger.Options = [.omitWhitespace, .omitPunctuation, .joinNames]
let schemes = NSLinguisticTagger.availableTagSchemes(forLanguage: "en")
// Create a tagger
let tagger = NSLinguisticTagger(tagSchemes: schemes, options: Int(options.rawValue))
tagger.string = sentence
let range = NSRange(location: 0, length: sentence.count)
// Enumerate the found tags. In this case print a name if it is found.
tagger.enumerateTags(in: range, unit: .word, scheme: .nameType, options: options) { (tag, tokenRange, _) in
guard let tag = tag, tag == .personalName else { return }
let name = (sentence as NSString).substring(with: tokenRange)
print(name) // -> Prints "David Bonds" to the console.
}
Run Code Online (Sandbox Code Playgroud)