Swift version: 5.6
Foundation has a built-in class to parse strings of text, and it includes some useful options to extra names of people, places, organizations, and more.
To try it out, consider this string:
let text = "Apple Computer was established in Cupertino by Steve Jobs, Steve Wozniak, and Ronald Wayne."
That contains a company name, a place name, and three names of people all in one, and we can use NSLinguisticTagger
to pull them all out.
First you create a linguistic tagger and tell it to look for the names of things inside that text string:
let tagger = NSLinguisticTagger(tagSchemes: [.nameType], options: 0)
tagger.string = text
Next you create the range to scan. This is done using the older NSRange
type, like this:
let range = NSRange(location: 0, length: text.utf16.count)
Third, you tell NSLinguisticTagger
what it should look for and how it should scan. One useful option here is .joinNames
, which means it will return “Steve Jobs” as a single name rather than as two individual names:
let options: NSLinguisticTagger.Options = [.omitPunctuation, .omitWhitespace, .joinNames]
let tags: [NSLinguisticTag] = [.personalName, .placeName, .organizationName]
Finally, you tell NSLinguisticTagger
to enumerate the tags in the input string, filter out any that aren’t in the tags
array we’re looking for, convert the NSRange
back to a Swift range, then print out each match:
tagger.enumerateTags(in: range, unit: .word, scheme: .nameType, options: options) { tag, tokenRange, stop in
if let tag = tag, tags.contains(tag) {
if let range = Range(tokenRange, in: text) {
let name = text[range]
print("\(name): \(tag)")
}
}
}
That will find the company, organization, and three people names in our string – nice!
SPONSORED Fernando's book will guide you in fixing bugs in three real, open-source, downloadable apps from the App Store. Learn applied programming fundamentals by refactoring real code from published apps. Hacking with Swift readers get a $10 discount!
Sponsor Hacking with Swift and reach the world's largest Swift community!
Available from iOS 5.0
This is part of the Swift Knowledge Base, a free, searchable collection of solutions for common iOS questions.
Link copied to your pasteboard.