从句子中提取名称

Im *_*man 1 ios swift

我需要从句子中获取人名.

示例: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)

Abi*_*ern 7

现在几乎是时候使用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)

  • 你知道发生了多少次这件事吗?有时太阳照耀着每个人:) (2认同)