web-dev-qa-db-fra.com

Comment effectuer la lemmatisation dans R?

Cette question est un doublon possible de Lemmatizer in R ou python (am, are, is -> be?), mais je l’ajoute à nouveau depuis la fermeture de la précédente en disant qu’elle était trop large et la seule réponse qu'il a n'est pas efficace (car il accède à un site Web externe pour cela, ce qui est trop lent car j'ai un très grand corpus pour trouver les lemmes). Donc, une partie de cette question sera similaire à la question mentionnée ci-dessus.

Selon Wikipedia, la lemmatisation est définie comme suit:

La lemmatisation (ou lemmatisation) en linguistique consiste à regrouper les différentes formes infléchies d'un mot afin qu'elles puissent être analysées comme un élément unique.

Une recherche simple de Google sur la lemmatisation dans R donnera uniquement un point sur le paquetage wordnet de R. Lorsque j'ai essayé ce paquetage en espérant qu'une entrée de vecteur de caractères c("run", "ran", "running") dans la fonction de lemmatisation aboutirait à c("run", "run", "run"), j'ai vu fonctionnalité similaire à la fonction grepl à travers différents noms de filtres et un dictionnaire.

Un exemple de code du paquet wordnet, qui donne un maximum de 5 mots commençant par "car", comme l'explique le nom du filtre:

filter <- getTermFilter("StartsWithFilter", "car", TRUE)
terms <- getIndexTerms("NOUN", 5, filter)
sapply(terms, getLemma)

Ce qui précède est PAS la lemmatisation que je recherche. Ce que je recherche, c’est en utilisant R Je veux trouver les vraies racines des mots: (par exemple, de c("run", "ran", "running") à c("run", "run", "run")).

14
StrikeR

Bonjour, vous pouvez essayer le paquet koRpus qui permet d’utiliser Treetagger :

tagged.results <- treetag(c("run", "ran", "running"), treetagger="manual", format="obj",
                      TT.tknz=FALSE , lang="en",
                      TT.options=list(path="./TreeTagger", preset="en"))
[email protected]

##     token tag lemma lttr wclass                               desc stop stem
## 1     run  NN   run    3   noun             Noun, singular or mass   NA   NA
## 2     ran VVD   run    3   verb                   Verb, past tense   NA   NA
## 3 running VVG   run    7   verb Verb, gerund or present participle   NA   NA

Voir la colonne lemma pour le résultat que vous demandez.

27
Victorp

Comme mentionné dans un précédent article, la fonction lemmatize_words () du paquet texte R peut effectuer cela et vous donner ce que je comprends comme résultat souhaité:

library(textstem)
vector <- c("run", "ran", "running")
lemmatize_words(vector)

## [1] "run" "run" "run"
9
Andy

Peut-être que stemming vous suffit? Les tâches typiques de traitement du langage naturel se débrouillent avec des textes à tige. Vous pouvez trouver plusieurs packages dans la vue des tâches CRAN de la PNL: http://cran.r-project.org/web/views/NaturalLanguageProcessing.html

Si vous avez vraiment besoin de quelque chose de plus complexe, il existe des solutions spécialisées basées sur la correspondance de phrases en réseaux de neurones. Pour autant que je sache, cela nécessite une quantité énorme de données de formation. De nombreux logiciels ouverts ont été créés et mis à disposition par Stanford NLP Group .

Si vous voulez vraiment creuser le sujet, vous pouvez alors parcourir les archives d’événements liées à la même section Stanford NLP Group publications . Il y a aussi quelques livres sur le sujet.

4
LauriK

@Andy et @Arunkumar sont corrects quand ils disent que textstem library peut être utilisé pour effectuer la radicalisation et/ou la lemmatisation. Cependant, lemmatize_words () ne fonctionnera que sur un vecteur de mots. Mais dans un corpus, nous n’avons pas de vecteur de mots; nous avons des chaînes, chaque chaîne constituant le contenu d'un document. Par conséquent, pour effectuer la lemmatisation sur un corpus, vous pouvez utiliser la fonction lemmatize_strings () en tant qu'argument de tm_map () de tm package. 

> corpus[[1]]
[1] " earnest roughshod document serves workable primer regions recent history make 
terrific th-grade learning tool samuel beckett applied iranian voting process bard 
black comedy willie loved another trumpet blast may new mexican cinema -bornin "
> corpus <- tm_map(corpus, lemmatize_strings)
> corpus[[1]]
[1] "earnest roughshod document serve workable primer region recent history make 
terrific th - grade learn tool samuel beckett apply iranian vote process bard black 
comedy willie love another trumpet blast may new mexican cinema - bornin"

N'oubliez pas de lancer la ligne de code suivante après avoir effectué la lemmatisation:

> corpus <- tm_map(corpus, PlainTextDocument)

En effet, pour créer une matrice de termes de document, vous devez disposer d'un objet de type 'PlainTextDocument', qui est modifié après l'utilisation de lemmatize_strings () (pour être plus spécifique, l'objet de corpus ne contient ni contenu ni métadonnées de chaque document plus - c’est maintenant juste une structure contenant le contenu des documents, ce n'est pas le type d’objet que DocumentTermMatrix () prend comme argument).

J'espère que cela t'aides!

1
Harshit