让我们考虑这个字符串:
let text = """
She was young the way an actual young person is young.
"""
您可以使用语言标记器:
import NaturalLanguage
let options = NSLinguisticTagger.Options.omitWhitespace.rawValue
let tagger = NSLinguisticTagger(tagSchemes: NSLinguisticTagger.availableTagSchemes(forLanguage: "en"), options: Int(options))
要计算每个单词的多重性,我将使用字典:
var dict = [String : Int]()
让我们定义可接受的语言标签(您可以根据自己的喜好更改这些标签):
let acceptedtags: Set = ["Verb", "Noun", "Adjective"]
现在让我们使用语言标记器解析字符串:
let range = NSRange(location: 0, length: text.utf16.count)
tagger.string = text
tagger.enumerateTags(
in: range,
scheme: .nameTypeOrLexicalClass,
options: NSLinguisticTagger.Options(rawValue: options),
using: { tag, tokenRange, sentenceRange, stop in
guard let range = Range(tokenRange, in: text)
else { return }
let token = String(text[range]).lowercased()
if let tagValue = tag?.rawValue,
acceptedtags.contains(tagValue)
{
dict[token, default: 0] += 1
}
// print(String(describing: tag) + ": \(token)")
})
现在dict
有了所需的单词及其多样性
print("dict =", dict)
如您所见,字典是一个未排序的集合。现在让我们介绍一些法律和秩序:
let ordered = dict.sorted {
($0.value, $1.key) > ($1.value, $0.key)
}
现在让我们只获取密钥:
let mostFrequent = ordered.map { $0.key }
并打印三个最常用的词:
print("top three =", mostFrequent.prefix(3))
要获得最常见的单词,使用堆(或 Trie)数据结构会更有效,而不是必须对每个单词进行散列,按频率对它们进行排序,然后添加前缀。这应该是一个有趣的练习。