2014-06-25 5 views
5

단어 줄기를 사용하여 NSLinguisticTagger을 사용하고 있습니다. 나는 한 마디로 줄기 단어를 얻을 수 있지만 한 마디에 줄기 단어를 얻을 수는 없다. iOS에서 단어 줄기 사용 - 단일 단어로 작동하지 않음

다음

은 내가 사용하고있는 코드, 나는대로 올바르게 얻고이를 위해

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); 
    }]; 

입니다 :

i: i 
waited: wait 

그러나 위의 코드는 줄기 단어를 식별하는 데 실패 stmnt = @"waited";

경우 어떤 도움을 크게 환영합니다

답변

4

다음 코드 worke 나를 위해 D,

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

언어에 해당 단어가 포함되어 있지 않으면 악의적 인 액세스 권한을 제공합니다. 예를 들어 'abcd'로 시도해보십시오. 나는 그것을 신속히 사용하려고 노력하고있다. 어떤 생각? –

+0

나쁜 접근 권한을 부여합니다. 내가 뭘 잘못하고 있는지 모르겠다. – Vojto

+0

https://stackoverflow.com/questions/48768919/device-vs-simulator-linguistic-schemes 여기에서 도움을 주시겠습니까? 같은 장치가 작동하지 않는 물리적 장치 : \ –

2

허용 대답은 그것을 필요로하는 사람들을 위해 스위프트로 변환 :

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

NSRange에서 Range 오류로 변환 할 수 없으므로 문자열을 NSString (NSString으로 "nsstmt : NSString = stmt")으로 변환하고 nsstmt를 사용하여 모든 것을 실행했습니다. 더 좋은 방법이 있는지 확실하지 않습니다. – Soferio

+0

'String' 메쏘드를 사용할 때 한 마디로 형태소 분석이 실패하는 것을 확인할 수 있습니다 만,'NSString'에 해당하는 것을 사용하여 예상 한대로 작동합니다. 기괴한! 또한 블록 기반'enumerateTags (in : scheme : options : using :)'에서 오류를 얻지 만'linguisticTags (in :)'대안이 예상대로 작동합니다. – MathewS

+0

https://stackoverflow.com/questions/48768919/device-vs-simulator-linguistic-schemes 여기에서 도움을받을 수 있습니까? 동일한 장치가 작동하지 않는 물리적 장치 : \ –

0

의 역할을 결정하기에 충분한 정보가 없기 때문에 그것은, 하나의 단어가 작동하지 않습니다 문장에서.

우리의 경우에, 사용자가 우리의 자연어 파서에 한 단어를 입력 할 때, 우리는 이것이 사물의 명칭, 따라서 명사라고 가정합니다.

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

가 그럼 그냥 평소와 같이 NSLinguisticTagger를 통해 실행

그래서 우리는 단지가 입력 한 단어가 명사과 같이 있음을 암시 것 문장을 구성.

+0

https://stackoverflow.com/questions/48768919/device-vs-simulator-linguistic-schemes 여기서 도움을받을 수 있습니까? 동일한 장치가 작동하지 않는 물리적 장치 : \ –