Swift:如何在句子中搜索关键字

问题描述

我正在尝试快速地在句子中进行关键字搜索

例如给出

关键字= [“黑色”,“袋子”,“爱”,“充满”]

Sentence1 =“房子里有一个装满爱的黑色袋子”

Sentence2 =“我们在商店里。柜台上有一个黑色袋子”

Sentence3 =“今天的海洋美丽而可爱”

我想在每个句子中搜索所有关键字,然后返回包含所有关键字和不包含所有关键字的句子。所以输出应该

句子1:4个关键字 句子2:3个关键字 句子3:无

这是我解决这个问题的尝试

 var RawSentences = ["There is a black bag in a house filled with love","We are in a shop. There is a black bag on the counter"," The ocean is beautiful and lovely today"]

 var keywords = ["black","bag","love","filled"]

 for item in RawSentences {
        var matchkeywords: [String] = []
        
        for kword in keywords{
            
            if item.range(of:kword) != nil {
                print("Yes!!!! \(kword) is in \(generatedString)")
                matchkeywords.append(kword)
            }
        }
         
        print("There are \(String(matchkeywords.count)) keyword in \(item)")
        
       
    }

迅速实施此操作的最佳方法是什么?

解决方法

如果您只想匹配整个单词,则需要使用正则表达式并为关键字添加边界。您还可以使搜索大小写和变音符号不敏感:

let sentences = ["There is a black bag in a house filled with love","We are in a shop. There is a black bag on the counter","The ocean is beautiful and lovely today"]
let keywords = ["black","bag","love","filled"]

var results: [String: [String]] = [:]
for sentence in sentences {
    for keyword in keywords {
        let escapedPattern = NSRegularExpression.escapedPattern(for: keyword)
        let pattern = "\\b\(escapedPattern)\\b"
        if sentence.range(of: pattern,options: [.regularExpression,.caseInsensitive,.diacriticInsensitive]) != nil {
            results[sentence,default: []].append(keyword)
        }
    }
}

print(results)  // ["There is a black bag in a house filled with love": ["black","filled"],"We are in a shop. There is a black bag on the counter": ["black","bag"]]

如果您想知道关键字在句子中的位置,您只需添加找到的范围而不是关键字:

var results: [String:[Range<String.Index>]] = [:]
for sentence in sentences {
   for keyword in keywords {
       let escapedPattern = NSRegularExpression.escapedPattern(for: keyword)
       let pattern = "\\b\(escapedPattern)\\b"
       if let range = sentence.range(of: pattern,.diacriticInsensitive]) {
           results[sentence,default: []].append(range)
       }
   }
}

print(results)  // ["We are in a shop. There is a black bag on the counter": [Range(Swift.String.Index(_rawBits: 1900544)..<Swift.String.Index(_rawBits: 2228224)),Range(Swift.String.Index(_rawBits: 2293760)..<Swift.String.Index(_rawBits: 2490368))],"There is a black bag in a house filled with love": [Range(Swift.String.Index(_rawBits: 720896)..<Swift.String.Index(_rawBits: 1048576)),Range(Swift.String.Index(_rawBits: 1114112)..<Swift.String.Index(_rawBits: 1310720)),Range(Swift.String.Index(_rawBits: 2883584)..<Swift.String.Index(_rawBits: 3145728)),Range(Swift.String.Index(_rawBits: 2097152)..<Swift.String.Index(_rawBits: 2490368))]]