2014-06-25 41 views
5

Tôi đang sử dụng NSLinguisticTagger cho từ gốc. Tôi có thể nhận được một từ gốc của các từ trong một câu, nhưng không thể có được một từ gốc cho một từ duy nhất.Word Steming trong iOS - Không hoạt động với một từ

Sau đây là đoạn code tôi đang sử dụng,

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 với điều này tôi nhận ra một cách chính xác như:

i: i 
waited: wait 

Nhưng đoạn mã trên thất bại trong việc xác định từ gốc nếu stmnt = @"waited";

Bất kỳ trợ giúp nào được đánh giá rất cao

Trả lời

4

Sau mã worke d đối với tôi,

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

Truy cập không tốt nếu ngôn ngữ không chứa từ đó. Ví dụ, chỉ cần thử với 'abcd'. Tôi đang thử nó bằng cách sử dụng nhanh chóng. Bất kỳ ý tưởng? –

+0

Cấp cho tôi quyền truy cập không tốt. Không chắc mình đang làm gì sai. – Vojto

+0

https://stackoverflow.com/questions/48768919/device-vs-simulator-linguistic-schemes Bất kỳ cơ hội nào bạn có thể trợ giúp ở đây? Thiết bị vật lý không hoạt động giống nhau: \ –

2

Câu trả lời được chấp nhận chuyển đổi sang Swift cho những người cần nó:

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

Tôi nhận được một số lỗi NSRange không thể chuyển đổi thành Phạm vi, vì vậy tôi vừa chuyển đổi chuỗi thành NSString trước ("let nsstmt: NSString = stmt as NSString") và chạy mọi thứ bằng nsstmt. Không chắc chắn nếu có một cách tốt hơn. – Soferio

+0

Tôi có thể xác nhận rằng gốc không thành công cho một từ khi sử dụng phương thức 'String', nhưng hoạt động như mong đợi (ít nhất là trên số nhiều tôi đã thử) bằng cách sử dụng' NSString' tương đương. Kỳ lạ! Ngoài ra nhận được các lỗi với khối dựa trên 'enumerateTags (trong: scheme: options: using:)' nhưng 'linguisticTags (in:)' thay thế đang làm việc như mong đợi. – MathewS

+0

https://stackoverflow.com/questions/48768919/device-vs-simulator-linguistic-schemes Bất kỳ cơ hội nào bạn có thể trợ giúp ở đây? Thiết bị vật lý không hoạt động giống nhau: \ –

0

Nó không làm việc cho từ duy nhất, bởi vì không có đủ thông tin để xác định vai trò của nó Trong câu.

Trong trường hợp của chúng tôi, khi người dùng nhập từ đơn vào trình phân tích cú pháp ngôn ngữ tự nhiên của chúng tôi, chúng tôi cho rằng đó là tên của một thứ và do đó là danh từ.

Vì vậy, chúng ta chỉ cần xây dựng một câu mà nó ngụ ý rằng từ cho vào là một danh từ như vậy:

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

Sau đó chỉ cần chạy nó thông qua NSLinguisticTagger như bình thường.

+0

https://stackoverflow.com/questions/48768919/device-vs-simulator-linguistic-schemes Bất kỳ cơ hội nào bạn có thể trợ giúp ở đây? Thiết bị vật lý không hoạt động giống nhau: \ –

Các vấn đề liên quan