2017-08-23 3 views
-1

Je sais que cela a été demandé plusieurs fois. Par exempleTrouver 2 mots expression en utilisant tm R

Finding 2 & 3 word Phrases Using R TM Package

Cependant, je ne sais pas pourquoi aucune de ces solutions fonctionnent avec mes données. Le résultat est toujours un mot d'un gramme, peu importe combien ngram j'ai choisi (2, 3 ou 4) pour le ngram.

Quelqu'un pourrait-il savoir pourquoi? Je soupçonne que l'encodage est la raison.

Modifié: une petite partie des données.

comments <- c("Merge branch 'master' of git.internal.net:/git/live/LegacyCodebase into problem_70918\n", 
"Merge branch 'master' of git.internal.net:/git/live/LegacyCodebase into tm-247\n", 
"Merge branch 'php5.3-upgrade-sprint6-7' of git.internal.net:/git/pn-project/LegacyCodebase into release2012.08\n", 
"Merge remote-tracking branch 'dmann1/p71148-s3-callplan_mapping' into lcst-operational-changes\n", 
"Merge branch 'master' of git.internal.net:/git/live/LegacyCodebase into TASK-360148\n", 
"Merge remote-tracking branch 'grockett/rpr-pre' into rpr-lite\n" 
) 
cleanCorpus <- function(vector){ 
    corpus <- Corpus(VectorSource(vector), readerControl = list(language = "en_US")) 
    corpus <- tm_map(corpus, removeNumbers) 
    corpus <- tm_map(corpus, tolower) 
    #corpus <- tm_map(corpus, stripWhitespace) 
    corpus <- tm_map(corpus, removePunctuation) 
    #corpus <- tm_map(corpus, PlainTextDocument) 
    corpus <- tm_map(corpus, removeWords, stopwords("english")) 
    return(corpus) 
} 
# this function is provided by a team member (in the link I posted above) 
test <- function(keywords_doc){ 

    BigramTokenizer <- function(x) 
    unlist(lapply(ngrams(words(x), 2), paste, collapse = " "), use.names = FALSE) 
    # creating of document matrix 
    keywords_matrix <- TermDocumentMatrix(keywords_doc, control = list(tokenize = BigramTokenizer)) 

    # remove sparse terms 
    keywords_naremoval <- removeSparseTerms(keywords_matrix, 0.99) 

    # Frequency of the words appearing 
    keyword.freq <- rowSums(as.matrix(keywords_naremoval)) 
    subsetkeyword.freq <-subset(keyword.freq, keyword.freq >=20) 
    frequentKeywordSubsetDF <- data.frame(term = names(subsetkeyword.freq), freq = subsetkeyword.freq) 

    # Sorting of the words 
    frequentKeywordDF <- data.frame(term = names(keyword.freq), freq = keyword.freq) 
    frequentKeywordSubsetDF <- frequentKeywordSubsetDF[with(frequentKeywordSubsetDF, order(-frequentKeywordSubsetDF$freq)), ] 
    frequentKeywordDF <- frequentKeywordDF[with(frequentKeywordDF, order(-frequentKeywordDF$freq)), ] 

    # Printing of the words 
    # wordcloud(frequentKeywordDF$term, freq=frequentKeywordDF$freq, random.order = FALSE, rot.per=0.35, scale=c(5,0.5), min.freq = 30, colors = brewer.pal(8,"Dark2")) 
    return(frequentKeywordDF) 
} 

corpus <- cleanCorpus(comments) 
t <- test(corpus) 
> head(t) 
      term freq 
added  added 6 
html   html 6 
tracking tracking 6 
common  common 4 
emails  emails 4 
template template 4 

Merci,

+2

Il est utile de publier des données d'échantillon et la sortie désirée. Si l'ensemble de données est volumineux, en poster une petite partie en utilisant 'dput (head (df1))' – manotheshark

+0

J'ai mis à jour avec une petite partie des données. Je pense que l'encodage pourrait être la raison. J'ai essayé le paquet utilisant tm avec la Tokenization et cela fonctionne avec d'autres ensembles de données. P/S: pourquoi y a-t-il tant de haines sur ce forum? –

+1

s'il vous plaît également partager quel code vous utilisez pour obtenir ngrams –

Répondre

1

Je n'ai pas trouvé la raison non plus, mais si vous ne souhaitez que des chiffres peu importe dans quels documents les bigrammes se sont produits, vous pouvez les obtenir alternativement par ce pipeline:

library(tm) 
lilbrary(dplyr) 
library(quanteda) 

# ..construct the corpus as in your post ... 

corpus %>% 
    unlist() %>% 
    tokens() %>% 
    tokens_ngrams(2:2, concatenator = " ") %>% 
    unlist() %>% 
    as.data.frame() %>% 
    group_by_(".") %>% 
    summarize(cnt=n()) %>% 
    arrange(desc(cnt)) 
+0

Votre réponse est superbe. Au moins, cela m'aide à trouver les mots les plus fréquents de 2 grammes. Qu'est-ce que 2: 2 dans 'token_ngrams'? Est-ce parce que le paramètre est un vecteur de ngrams, donc vous devez mettre 2: 2 pour l'isoler à 2 grammes seulement? –

+0

Je ne sais pas s'il y a plus de réponses à cela, mais le vôtre résout mon problème, bien qu'il ne me dise pas ce qui ne va pas avec l'ensemble de données. Je marque donc votre réponse comme la bonne réponse. Merci –