2014-06-25 16 views
5

Ich verwende NSLinguisticTagger für Word stemming. Ich bin in der Lage, einen Wortstamm von Wörtern in einem Satz zu erhalten, aber nicht in der Lage, ein Wortstamm für ein einzelnes Wort zu erhalten.Wort stemming in iOS - funktioniert nicht für einzelnes Wort

Es folgt der Code ich verwende,

NSString *stmnt = @"i waited"; 
    NSLinguisticTaggerOptions options = NSLinguisticTaggerOmitWhitespace | NSLinguisticTaggerOmitPunctuation | NSLinguisticTaggerJoinNames; 

    NSLinguisticTagger *tagger = [[NSLinguisticTagger alloc] initWithTagSchemes:@[NSLinguisticTagSchemeLemma] options:options]; 
    tagger.string = stmnt; 
    [tagger enumerateTagsInRange:NSMakeRange(0, [stmnt length]) scheme:NSLinguisticTagSchemeLemma options:options usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) { 
     NSString *token = [stmnt substringWithRange:tokenRange]; 
     NSLog(@"%@: %@", token, tag); 
    }]; 

Dafür ich richtig wie raus bin:

i: i 
waited: wait 

Aber der obige Code nicht Schaft Wort zu identifizieren, wenn stmnt = @"waited";

Jede Hilfe wird sehr geschätzt

Antwort

4

Folgende Code funktioniert d für mich,

NSString *stmt = @"waited"; 
NSRange stringRange = NSMakeRange(0, stmt.length); 
NSDictionary* languageMap = @{@"Latn" : @[@"en"]}; 
[stmt enumerateLinguisticTagsInRange:stringRange 
             scheme:NSLinguisticTagSchemeLemma 
             options:NSLinguisticTaggerOmitWhitespace 
            orthography:[NSOrthography orthographyWithDominantScript:@"Latn" languageMap:languageMap] 
            usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) { 
             // Log info to console for debugging purposes 
             NSString *currentEntity = [stmt substringWithRange:tokenRange]; 
             NSLog(@"%@ is a %@, tokenRange (%d,%d)",currentEntity,tag,tokenRange.length,tokenRange.location); 
            }]; 
+0

Es gibt schlechten Zugang, wenn Sprache dieses Wort nicht enthält. Zum Beispiel versuche es einfach mit 'abcd'. Ich versuche es mit Swift. Irgendeine Idee? –

+0

Gibt mir auch schlechten Zugang. Ich bin mir nicht sicher, was ich falsch mache. – Vojto

+0

https://stackoverflow.com/questions/48768919/device-vs-simulator-linguistic-schemies Gibt es eine Chance, dass Sie hier helfen können? Physische Geräte funktionieren nicht gleich: \ –

2

Die akzeptierte Antwort umgewandelt Swift für diejenigen, die es brauchen:

let stmt = "waited" 
    let options: NSLinguisticTaggerOptions = .OmitWhitespace 
    let stringRange = NSMakeRange(0, stmt.length) 
    let languageMap = ["Latn":["en"]] 
    let orthography = NSOrthography(dominantScript: "Latn", languageMap: languageMap) 

    stmt.enumerateLinguisticTagsInRange(
     stringRange, 
     scheme: NSLinguisticTagSchemeLemma, 
     options: options, 
     orthography: orthography) 
     { (tag, tokenRange, sentenceRange, _) ->() in 
      let currentEntity = stmt.substringWithRange(tokenRange) 
      println(">\(currentEntity):\(tag)") 
    } 
+1

Ich habe ein NSRange, das nicht in Range-Fehler konvertiert werden kann, also habe ich die Zeichenfolge zuerst in NSString umgewandelt ("let nsstmt: NSString = stmt as NSString") und alles mit nsstmt ausgeführt. Nicht sicher, ob es einen besseren Weg gibt. – Soferio

+0

Ich kann bestätigen, dass Stemming für ein einzelnes Wort fehlschlägt, wenn Sie die "String" -Methode verwenden, aber funktioniert wie erwartet (zumindest im Plural, die ich versucht habe) mit der "NSString" -Equivalent. Bizarr! Auch Fehler mit den blockbasierten 'enumerateTags '(in: scheme: options: using:)', aber die' lingfulTags (in:) 'Alternative funktioniert wie erwartet. – MathewS

+0

https://stackoverflow.com/questions/48768919/device-vs-simulator-linguistic-schemies Gibt es eine Chance, dass Sie hier helfen können? Physische Geräte funktionieren nicht gleich: \ –

0

Es funktioniert nicht für einzelnes Wort, weil es nicht genügend Informationen erhalten, seine Rolle zu bestimmen, in dem Satz.

In unserem Fall, wenn Benutzer ein einzelnes Wort in unseren Parser für natürliche Sprache eingeben, nehmen wir an, dass es ein Name einer Sache ist und somit ein Nomen.

So bauen wir nur einen Satz, wo es angedeutet hat, dass das eingegebene Wort ein Substantiv wie so ist:

let str = "please show me \(word)" 

Dann führen Sie einfach es durch NSLinguisticTagger wie gewohnt.

+0

https://stackoverflow.com/questions/48768919/device-vs-simulator-linguistic-schemies Gibt es eine Chance, dass Sie hier helfen können? Physische Geräte funktionieren nicht gleich: \ –