-1

我正在尝试使用此代码从字符串中获取最多重复的单词。

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 '....等
4

1 回答 1

1

让我们考虑这个字符串:

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)数据结构会更有效,而不是必须对每个单词进行散列,按频率对它们进行排序,然后添加前缀。这应该是一个有趣的练习。

于 2020-03-26T15:37:34.540 回答