如何用swift对NSCountedSet中的单词进行拼写和排序



我试图用这段代码从字符串中获得最多重复的单词。

let text = """
aa bb aa bb aa bb cc dd dd cc zz zz cc dd zz
"""
let words = text.unicodeScalars.split(omittingEmptySubsequences: true, whereSeparator: { !CharacterSet.alphanumerics.contains($0) })
.map { String($0) }
let wordSet = NSCountedSet(array: words)
let sorted = wordSet.sorted { wordSet.count(for: $0) > wordSet.count(for: $1) }
print(sorted.prefix(3))

结果是

[cc,dd,aa]

目前,它放置所有单词,甚至是一个字符。

我要做的是,

  1. 将包含多个字符的单词放入NSCountedSet
  2. 若NSCountedSet中的单词计数相同,请按字母顺序进行排序。(所需结果为aa、cc、dd)

如果可能的话。。

  1. 从字符串中省略词性,如"and,a how,of,to,it,in on,who"。。。。等等

让我们考虑一下这个字符串:

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))

要获得最频繁的单词,使用Heap(或Trie)数据结构会更有效,而不必对每个单词进行散列,按频率对它们进行排序,然后加前缀。这应该是一个有趣的练习。

最新更新