将文本与 Swift 中的关键字匹配
Matching text to keywords in Swift
假设我正在解析文档并试图通过获取一些关键字并将它们与上述字符串匹配来找到 Test©/Testing© Keyword Finder
。
如果我使用的文档中的每个文本块都是独立且定义明确的,这样就不会混淆 sentence/title 中连接的单词,有没有办法 Swift 将这样的词块与关键字进行比较以找到匹配项?
Levenshtein 距离,又名编辑距离,是衡量两个字符串之间差异的指标。它的实现是:
func levenshteinDist(test: String, key: String) -> Int {
let empty = Array<Int>(repeating:0, count: key.count)
var last = [Int](0...key.count)
for (i, testLetter) in test.enumerated() {
var cur = [i + 1] + empty
for (j, keyLetter) in key.enumerated() {
cur[j + 1] = testLetter == keyLetter ? last[j] : min(last[j], last[j + 1], cur[j]) + 1
}
last = cur
}
return last.last!
}
您可以按如下方式使用:
let test1 = "Test©/Testing© Keyword Finder"
let test2 = "Test© Word Finder"
let test3 = "Number Categorizer"
let test4 = "Alphabet in Order"
let key = "Test Testing Keyword"
print(levenshteinDist(test: test1, key: key)) // 10
print(levenshteinDist(test: test2, key: key)) // 14
print(levenshteinDist(test: test3, key: key)) // 18
print(levenshteinDist(test: test4, key: key)) // 15
print(levenshteinDist(test: key, key: key)) // 0
如您所见,levensthlindist(test: key, key: key)
输出 0
,因为字符串相同。此外,最小输出为 10
并且它对应于预期的测试字符串。
假设我正在解析文档并试图通过获取一些关键字并将它们与上述字符串匹配来找到 Test©/Testing© Keyword Finder
。
如果我使用的文档中的每个文本块都是独立且定义明确的,这样就不会混淆 sentence/title 中连接的单词,有没有办法 Swift 将这样的词块与关键字进行比较以找到匹配项?
Levenshtein 距离,又名编辑距离,是衡量两个字符串之间差异的指标。它的实现是
func levenshteinDist(test: String, key: String) -> Int {
let empty = Array<Int>(repeating:0, count: key.count)
var last = [Int](0...key.count)
for (i, testLetter) in test.enumerated() {
var cur = [i + 1] + empty
for (j, keyLetter) in key.enumerated() {
cur[j + 1] = testLetter == keyLetter ? last[j] : min(last[j], last[j + 1], cur[j]) + 1
}
last = cur
}
return last.last!
}
您可以按如下方式使用:
let test1 = "Test©/Testing© Keyword Finder"
let test2 = "Test© Word Finder"
let test3 = "Number Categorizer"
let test4 = "Alphabet in Order"
let key = "Test Testing Keyword"
print(levenshteinDist(test: test1, key: key)) // 10
print(levenshteinDist(test: test2, key: key)) // 14
print(levenshteinDist(test: test3, key: key)) // 18
print(levenshteinDist(test: test4, key: key)) // 15
print(levenshteinDist(test: key, key: key)) // 0
如您所见,levensthlindist(test: key, key: key)
输出 0
,因为字符串相同。此外,最小输出为 10
并且它对应于预期的测试字符串。