2011-07-28 11 views
9

Necesito una solución (rápida y sucia) para detectar básicamente si un determinado NSString es una palabra "real", es decir, si está en el diccionario. Así que, básicamente, un corrector ortográfico muy simplista. ¿Alguien sabe de alguna manera de hacer esto? Básicamente, o bien necesito un archivo que contenga todas las palabras en el diccionario de inglés (que he buscado, pero no sirvió para nada) o una forma de interactuar con el servicio de revisión ortográfica de iPhones. Por supuesto, me gustaría interactuar con el servicio de revisión ortográfica de iPhones de forma similar a NSSpellChecker en OSX, así que mi aplicación funcionará con otros idiomas, pero en este punto, tomaré lo que pueda.iPhone objetivo-c: detección de una palabra "real"

Por último, aquí hay algo de pseudo-código para ilustrar mejor a mis necesidades:

-(BOOL)isDictionaryWord:(NSString*)word; //returns TRUE when [email protected]"greetings". returns FALSE when [email protected]"slkfjsdkl"; 
+0

¿Por qué no usar n NSSpellChecker? – Goz

+0

@Wolfgang: como NSObject NSString .... – brain

+0

@Wolfgang: NS clases con prefijo están disponibles en iOS, como NSObject, NSNumber, NSString, NSPredicate, NSFetchedController, ... – rckoenes

Respuesta

21

Uso UITextChecker lugar. El siguiente código podría no ser perfecto, pero debería darte una buena idea.

-(BOOL)isDictionaryWord:(NSString*)word { 
    UITextChecker *checker = [[UITextChecker alloc] init]; 
    NSLocale *currentLocale = [NSLocale currentLocale]; 
    NSString *currentLanguage = [currentLocale objectForKey:NSLocaleLanguageCode]; 
    NSRange searchRange = NSMakeRange(0, [word length]); 

    NSRange misspelledRange = [checker rangeOfMisspelledWordInString:word range:searchRange startingAt:0 wrap:NO language:currentLanguage]; 
    return misspelledRange.location == NSNotFound; 
} 
3

Puede hacer que UITextChecker funcione correctamente sin necesidad de agregar un nuevo diccionario.

Uso un proceso de dos pasos porque necesito que el primer paso sea rápido (pero no preciso). Es posible que solo necesite el paso dos, que es el control preciso. Tenga en cuenta que esto hace uso de la función CompletionsForPartialWordRange de UITextChecker, razón por la cual es más precisa que la función MisspelledWord.

// Paso uno: Compruebo rápidamente para ver si una combinación de letras pasa el corrector ortográfico. Esto no es tan preciso, pero es muy rápido, por lo que puedo excluir rápidamente muchas combinaciones de letras (enfoque de fuerza bruta).

UITextChecker *checker; 
NSString *wordToCheck = @"whatever"; // The combination of letters you wish to check 

// Set the range to the length of the word 
NSRange range = NSMakeRange(0, wordToCheck.length - 1); 

NSRange misspelledRange = [checker rangeOfMisspelledWordInString:wordToCheck range: range startingAt:0 wrap:NO language: @"en_US"]; 
BOOL isRealWord = misspelledRange.location == NSNotFound; 

// Call step two, to confirm that this is a real word 
if (isRealWord) { 
    isRealWord = [self isRealWordOK:wordToCheck]; 
} 
return isRealWord; // if true then we found a real word, if not move to next combination of letters 

// Paso dos: comprobación adicional para asegurarse de que la palabra es realmente una palabra real. devuelve verdadero si tenemos una palabra real.

-(BOOL)isRealWordOK:(NSString *)wordToCheck { 

    // we dont want to use any words that the lexicon has learned. 
    if ([UITextChecker hasLearnedWord:wordToCheck]) { 
     return NO; 
    } 

    // now we are going to use the word completion function to see if this word really exists, by removing the final letter and then asking auto complete to complete the word, then look through all the results and if its not found then its not a real word. Note the auto complete is very acurate unlike the spell checker. 
    NSRange range = NSMakeRange(0, wordToCheck.length - 1); 
    NSArray *guesses = [checker completionsForPartialWordRange:range inString:wordToCheck language:@"en_US"]; 

    // confirm that the word is found in the auto-complete list 
    for (NSString *guess in guesses) { 

     if ([guess isEqualToString:wordToCheck]) { 
      // we found the word in the auto complete list so it's real :-) 
      return YES; 
     } 
    } 

    // if we get to here then it's not a real word :-(
    NSLog(@"Word not found in second dictionary check:%@",wordToCheck); 
    return NO; 

} 
+0

He seguido las líneas de tu código, pero algunas de las palabras como "thy, anrouse, white, evil, lover" son palabras reales pero UITextchecker muestra palabras inválidas. –

Cuestiones relacionadas