如何在UITextView中查找和排序最常用的3个单词?

时间:2017-09-06 13:26:18

标签: ios iphone swift uitextview

我希望在我的UITextView中找到并按数量排序最多传递3个单词。

例如:

"好的好,非常好的好。不幸的是糟糕的坏事。"

必须这样做:

好(5次) 坏(3次) 非常(2次)

我该怎么做? 感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用String.components(separatedBy:)获取textView.text的字词,然后您可以使用NSCountedSet来获取每个字词的数量。

您当然可以调整用作components(separatedBy:)输入的分隔符,以符合您的确切标准。

let textViewText = "good good good very very good good. bad bad unfortunately bad."
//separate the text into words and get rid of the "" results
let words = textViewText.components(separatedBy: [" ","."]).filter({ !$0.isEmpty })
//count the occurrence of each word
let wordCounts = NSCountedSet(array: words)
//sort the words by their counts in a descending order, then take the first three elements
let sortedWords = wordCounts.allObjects.sorted(by: {wordCounts.count(for: $0) > wordCounts.count(for: $1)})[0..<3]
for word in sortedWords {
    print("\(word) \(wordCounts.count(for: word))times")
}

输出:

  

好5次

     

糟糕的3次

     

非常2次

答案 1 :(得分:0)

这是一个单行班,按频率顺序为您提供前3个单词:

let words = "good good good very very good good. bad bad unfortunately bad"

let top3words = Set(words.components(separatedBy:" "))
                .map{($0,words.components(separatedBy:$0).count-1)}
                .sorted{$0.1 > $01.1}[0..<3]

print(top3words)  // [("good", 5), ("bad", 3), ("very", 2)]

它创建一个包含每个不同单词的集合,然后将每个单词与字符串中的出现次数(单词)进行映射。最后,它对count上的(word,count)元组进行排序,并返回前3个元素。

[编辑]上述方法的唯一问题是,尽管它适用于您的示例字符串,但它假定其他字中不包含任何字,并且它们仅用空格分隔。

要做好正确的工作,必须首先在数组中隔离单词,消除任何特殊字符(即非字母)。忽略大写和小写也可能是合适的,但你没有指定,我不想增加复杂性。

以下是对单词数组(由相同字符串生成)使用相同方法的方法:

let wordList  = words.components(separatedBy:CharacterSet.letters.inverted)
                     .filter{!$0.isEmpty}
let top3words = Set(wordList)
                .map{ word in (word, wordList.filter{$0==word}.count) } 
                .sorted{$0.1>$1.1}[0..<3]