2017-12-06 14 views
0

Lassen Sie uns sagen, dass ich ein Dokument bin Parsen und ich versuche, Test©/Testing© Keyword Finder zu finden, indem sie einige Schlüsselwörter zu nehmen und sie zu den oben genannten String-Matching.Matching Text Schlüsselwörter in Swift

Wenn ich ein Dokument verwende, in dem jeder Textblock getrennt und klar definiert ist, sodass es keine Verwirrung darüber gibt, welche Wörter in einem Satz/Titel verbunden sind, gibt es in Swift einen Weg, solche zu vergleichen ein Wortblock mit Keywords, um eine Übereinstimmung zu finden?

Antwort

2

Die Levenshtein Abstand, auch bekannt als Editierdistanz, ist eine Metrik die Differenz zwischen zwei Zeichenketten für die Messung. Die Umsetzung ist here:

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! 
} 

Sie können es wie folgt:

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 

Wie Sie sehen können, levensthlindist(test: key, key: key) Ausgänge 0, da die Saiten gleich sind. Auch die Mindestleistung ist 10 und entspricht den erwarteten Teststrang.

+0

Vielen Dank! – ch1maera