2017-08-24 3 views
1

Ich brauche Namen von einem Satz zu bekommen.Einen Namen aus einem Satz extrahieren

Beispiel: My Name is David Bonds and i live in new york. und ich möchte Name David Bonds extrahieren.

My Name is wird definitiv in jedem Satz sein. aber nach dem Namen kann es den Rest des Satzes enthalten oder nichts sein. von diesem answer konnte ich zum Punkt My Name is gelangen. aber es wird Rest des ganzen Satzes ausdrucken. Ich möchte sicherstellen, dass es nur next two words nur greifen wird.

if let range = conversation.range(of: "My Name is") { 
    let name = conversation.substring(from: range.upperBound).trimmingCharacters(in: .whitespacesAndNewlines) 
    print(name) 
} 

Antwort

3

Wenn Sie den Rest des Textes haben, können Sie es durch "" trennen. Dann erste und secont Elemente sind Vor- und Nachname

let array = text.components(separatedBy: " ") 

//first name 
print(array[0]) 

//last name 
print(array[1]) 
1

Verwenden Sie den folgenden Code

let sen = "My Name is David Bonds and i live in new york." 

let arrSen = sen.components(separatedBy: "My Name is ") 
print(arrSen) 

let sen0 = arrSen[1] 

let arrsen0 = sen0.components(separatedBy: " ") 
print("\(arrsen0[0]) \(arrsen0[1])") 

Ausgang:

enter image description here

+0

in meinem Satz kann immer sein wird 'und' Schlüsselwort nicht gurantee dort. –

+0

@ImBatman Überprüfen Sie die aktualisierte Antwort –

+1

@ImBatman Sie sollten den lexikalischen Tagger wie in Abizerns Antwort verwenden. – Fogmeister

2

Man könnte es wie folgt implementieren:

let myString = "My Name is David Bonds and i live in new york." 

// all words after "My Name is" 
let words = String(myString.characters.dropFirst(11)).components(separatedBy: " ") 

let name = words[0] + " " + words[1] 

print(name) // David Bonds 

Als Bemerkung, dropFirst(11) sollte funktioniert gut, wenn Sie ziemlich sicher sind, dass „My Name ist“ vor dem Namen sein sollte, da die Zahl der Zeichen ist 11.

0

Sie können die Präfixzeichenfolge „My entfernen Name ist David "und dann trennen Sie es durch" ".

var sentence = "My Name is David Bonds and" 
let prefix = "My Name is " 

sentence.removeSubrange(sentence.range(of: prefix)!) 
let array = sentence.components(separatedBy: " ") 
print("Name: ", array[0],array[1]) // Name: David Bonds 
0

Je nachdem, wie Sie die Daten wollen:

let string = "My Name is David Bonds and i live in new york." 

let names = string.components(separatedBy: " ")[3...4] 
let name = names.joined(separator: " ") 
6

Es ist fast Zeit für Swift 4, iOS 11, in dem mit NSLinguisticTagger ist ein bisschen einfacher.

So können Sie NSLinguisticTagger für zukünftige Referenz verwenden, um einen Namen aus einem Satz zu extrahieren. Dies hängt nicht vom Namen ab, der einem benannten Token folgt, oder von einem zweistelligen Namen. Diese

ist von einem Xcode 9 Spielplatz

import UIKit 

let sentence = "My Name is David Bonds and I live in new york." 

// Create the tagger's options and language scheme 
let options: NSLinguisticTagger.Options = [.omitWhitespace, .omitPunctuation, .joinNames] 
let schemes = NSLinguisticTagger.availableTagSchemes(forLanguage: "en") 

// Create a tagger 
let tagger = NSLinguisticTagger(tagSchemes: schemes, options: Int(options.rawValue)) 
tagger.string = sentence 
let range = NSRange(location: 0, length: sentence.count) 

// Enumerate the found tags. In this case print a name if it is found. 
tagger.enumerateTags(in: range, unit: .word, scheme: .nameType, options: options) { (tag, tokenRange, _) in 
    guard let tag = tag, tag == .personalName else { return } 
    let name = (sentence as NSString).substring(with: tokenRange) 
    print(name) // -> Prints "David Bonds" to the console. 
} 
+1

Verdammt! Du bist direkt vor mir angekommen. Ich wollte gerade eine ähnliche Antwort schreiben. Beachten Sie, dass dies in iOS 5 und höher möglich ist, aber etwas schwieriger zu verwenden: D – Fogmeister

+2

Weißt du, wie oft das ist mir passiert? Die Sonne scheint manchmal auf jeden :) – Abizern

Verwandte Themen