NLTagger vs NSLinguisticTagger

Hello les girafes !

Je suis (malgré les évolutions qui ont eu lieu entretemps) les cours avancés de iOS12. J’ai en effet la volonté de suivre les cours des années passées pour ensuite rattraper les évolutions :slight_smile:

Du coup, je suis arrivé à la partie où @mbritto nous fait une approche de machine learning dans l’app LifeGoals. Et j’ai voulu transposer l’exercice avec NSTagger, ayant constaté qu’entretemps, le framework NSLinguisticTagger était déprécié.

Par contre, j’ai éprouvé des difficultés à obtenir le même résultat que dans le cours, à savoir :

  • à partir d’une chaine de caractères donné,
  • vérifier le champ lexical du mot et, s’il s’agit d’un verbe…
  • alors je donne l’infinitif.

Je ne parviens pas à faire en une seule passe une action avec NSTagger qui vérifie le fait que le mot soit un verbe et, dans ce cas, qu’il donne l’infinitif. Concrètement, je suis obligé de le faire en deux temps avec des tableaux. Ça fonctionne mais honnêtement, je ne trouve pas ça élégant du tout. Je vous montre ce que ça donne pour que vous puissiez me dire si vous avez des préconisations pour améliorer cela.

Merci par avance de vos suggestions et remarques !

func analysis () {
    var lexicalClassesFound:[NLTag] = []
    var lemmaFound:[String?] = []
            
    let tagger = NLTagger(tagSchemes: [.lexicalClass, .lemma])
    let options: NLTagger.Options = [.omitWhitespace]
    tagger.string = title
    
    print("- add lexicalClasses found in an array")
    tagger.enumerateTags(in: title.startIndex..<title.endIndex, unit: .word, scheme: .lexicalClass, options: options) { tag, tokenRange in
        if let tag = tag {
            print("\(title[tokenRange]): \(tag.rawValue)")
            lexicalClassesFound.append(tag)
        }
        return true
    }
    
    print ("- add lemma found in another array")
    tagger.enumerateTags(in: title.startIndex..<title.endIndex, unit: .word, scheme: .lemma, options: options) { tag, tokenRange in
        if let tag = tag {
            print("\(title[tokenRange]): \(tag.rawValue)")
            lemmaFound.append(tag.rawValue)
        } else {
            lemmaFound.append(nil)
        }
        return true
    }
    
    print ("- tableau lexical : \(lexicalClassesFound.count), tableau lemma : \(lemmaFound.count)")
    
    for i in 0..<lexicalClassesFound.count {
        if lexicalClassesFound[i] == .verb {
            if let myLemma = lemmaFound[i] {
                category = myLemma
            }
        }
    }
}

Je n’ai pas utilisé le framework d’analyse de texte depuis l’époque où j’avais enregistré le cours. Je ne sais donc pas ce qui a changé depuis.
As-tu vraiment besoin de réapprendre les anciens cours ? Tu vas souvent tomber sur des choses qui ne marchent plus.
En plus, les paradigmes ont complètement changé avec SwiftUI (iOS 14)