2017-08-18 3 views
3

Je me suis gratté la tête à propos de celui-ci pendant un moment maintenant. J'essaie de faire du text mining dans R, et je cherche à classer les noms, les lieux et les organisations qui sont composés de plusieurs mots. Pour les besoins de cette tâche, je ne regarde que les mots consécutifs de la chaîne commençant par des majuscules.Détection de deux mots "Proper Case" consécutifs dans une chaîne en utilisant R

Exemple chaîne:

origString <- 'The current president of the United States is Donald Trump' 

Est-il possible de trouver les mots commençant par une lettre majuscule au sein de cette chaîne et les regrouper pour retourner quelque chose comme ça?

newString <- 'The current president of the UnitedStates is DonaldTrump' 

Toute aide que vous pouvez donner serait grandement appréciée.

Répondre

2

La solution suivante serait bien travailler pour des groupes de deux mots à la fois:

origString <- 'The current president of the United States is Donald Trump' 
gsub('([A-Z]\\w*?)\\s+([A-Z]\\w*)', '\\1\\2', origString) 

Sortie:

[1] "The current president of the UnitedStates is DonaldTrump" 

Demo ici:

Rextester

Mise à jour:

Voici un script qui devrait fonctionner pour n'importe quel nombre de mots en majuscules en cluster. Il a fallu une solution de contournement/hack car la syntaxe regex utilisée par gsub(), même en mode Perl, ne prend pas en charge les retours de recherche de longueur variable. La stratégie ici consiste plutôt à supprimer sélectivement l'espace entre tous les mots en majuscules qui apparaissent dans des groupes de deux ou plus.

origString <- 'The current president of the United States Donald Trump' 
temp <- gsub('([A-Z]\\w*)', '\\1\\$MARK\\$', origString) 
output <- gsub('(?<=\\$MARK\\$)\\s+(?=[A-Z])', '', temp, perl=TRUE) 
output <- gsub('\\$MARK\\$', '', output) 
output 

[1] "The current president of the UnitedStatesDonaldTrump" 

Demo

+0

Parfait, merci. Reconnaissez qu'il est temps de rafraîchir l'ancienne regex. –

+0

@ReubenKandiah Le problème devient plus difficile si vous voulez soutenir des groupes de 3, 4, ... Avez-vous besoin de cela aussi bien? –

+0

Je peux certainement imaginer des exemples où je voudrais - par exemple, l'expression «World Duty Free est le plus grand opérateur britannique» serait idéalement réduite à «WorldDutyFree est le plus grand opérateur britannique». –

2

Voici une fonction récursive qui va s'effondrer un certain nombre de mots en majuscules consécutifs ...

collapseCaps <- function(text) { 
    result <- gsub('([A-Z]\\w*)\\s+([A-Z]\\w*)', '\\1\\2', text) 
    if(result!=text) { 
    text <- result 
    result <- Recall(text) #calling the function from within itself 
    } 
    return(result) 
} 

collapseCaps('The current president of the United States is President Donald J Trump') 

[1] "The current president of the UnitedStates is PresidentDonaldJTrump"