2014-12-20 3 views
2

У меня есть вектор предложений, скажет:подсчета Словосочетание частота

x = c("I like donut", "I like pizza", "I like donut and pizza") 

Я хочу считать сочетание двух слов. Идеальный выход представляет собой данные кадра с 3 колонками (слово1, word2 и частоты), и было бы нечто вроде этого:

I  like 3 
I  donut 2 
I  pizza 2 
like donut 2 
like pizza 2 
donut pizza 1 
donut and  1 
pizza and  1 

В первых записях вывода, freq = 3 потому "I" и "like" происходит вместе 3 раза: x[1] , x[2] и x[3].

Любой советует оценен :)

+2

ли вы использовать Google или панель поиска, прежде чем отправлять на этот вопрос? Попробуйте [this] (http://stackoverflow.com/questions/11403196/r-count-times-word-appears-in-element-of-list) или [это] (http://stackoverflow.com/questions/ 18864612/частота появления-из-двух-парных комбинаций-in-text-data-in-r) или [любой из них] (http://stackoverflow.com/search?q=R+word+combinations). –

+0

Как насчет 'I I' и' like like' и т. Д.? Предположительно, вы хотите только те комбинации * разных * слов? 'gtools :: permutations' может быть вам полезен –

+0

@OliverKeyes: да, конечно. – nurandi

ответ

6

split слов, sort, чтобы идентифицировать пары должным образом, получить все пары с combn, paste пара, чтобы получить через пробел пару слов, использовать table, чтобы получить частоты, а затем положить все это вместе.

Вот пример:

f <- function(x) { 
    pr <- unlist(
    lapply(
     strsplit(x, ' '), 
     function(i) combn(sort(i), 2, paste, collapse=' ') 
    ) 
) 

    tbl <- table(pr) 

    d <- do.call(rbind.data.frame, strsplit(names(tbl), ' ')) 
    names(d) <- c('word1', 'word2') 
    d$Freq <- tbl 

    d 
} 

С вашими данными например:

> f(x) 
    word1 word2 Freq 
1 and donut 1 
2 and  I 1 
3 and like 1 
4 and pizza 1 
5 donut  I 2 
6 donut like 2 
7 donut pizza 1 
8  I like 3 
9  I pizza 2 
10 like pizza 2 
+0

Отлично. Используя 'combn', я также могу посчитать наличие комбинации из 3 или более слов. Спасибо :) – nurandi

Смежные вопросы