Как преобразовать элементы столбца списка в их собственные столбцы, чтобы найти косинусное сходство в R? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть набор данных, который выглядит следующим образом:

library(tidyverse)

data <- tibble(id = 1:10,
               vectors = list(rnorm(25)))

# A tibble: 25 x 2
      id vectors   
   <int> <list>    
 1     1 <dbl [25]>
 2     2 <dbl [25]>
 3     3 <dbl [25]>
 4     4 <dbl [25]>
 5     5 <dbl [25]>
 6     6 <dbl [25]>
 7     7 <dbl [25]>
 8     8 <dbl [25]>
 9     9 <dbl [25]>
10    10 <dbl [25]>

Я хотел бы использовать этот набор данных, чтобы найти косинусное сходство, где каждая строка представляет документ.Функция cosine из пакета lsa кажется хорошим / простым способом сделать это, однако мне нужно, чтобы каждый документ был представлен в виде столбца.Я хотел бы просто сделать data %>% t(), чтобы получить желаемый результат, но это не работает.Я также попытался "распространить" столбец списка сначала, используя unest и spread.Я также пытался flatten безрезультатно.Первая строка моего желаемого результата будет выглядеть примерно так:

  1    2    3    4    5    6    7    8    9    10
0.1  0.3  0.7  0.3  0.1  0.1  0.3  0.7  0.3  0.1

Если есть функция из другого пакета, которая обрабатывает данные в этом формате, я бы во всех случаях просто использовал ее вместо этого, хотя на этом этапе мне бы хотелосьчтобы понять это с точки зрения любопытства.Я смотрел на R - список к фрейму данных , но я не уверен, как я могу применить это к этой ситуации.

Предпосылкой для этого является то, что я выполнил doc2vecв Python с Gensim, но делать с нашей средой в работе, если я хочу построить что-то интерактивное для клиента, это должно быть в R.

1 Ответ

0 голосов
/ 19 декабря 2018
require(dplyr)
require(tidyr)
mutate(data,vectors=sapply(vectors, function(x) paste(x,collapse=","))) %>% 
    separate_rows(vectors,sep=",") %>% 
    group_by(id) %>% 
    mutate(numb=row_number(),vectors=as.numeric(vectors)) %>%
    spread(key=numb,value=vectors)

# A tibble: 10 x 26
# Groups:   id [10]
      id   `1`   `2`   `3`   `4`    `5`   `6`    `7`   `8`     `9`  `10`  `11`  `12`   `13`   `14`  `15`   `16`
   <int> <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl>  <dbl> <dbl>   <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl> <dbl>  <dbl>
 1     1  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
 2     2  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
 3     3  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
 4     4  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
 5     5  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
 6     6  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
 7     7  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
 8     8  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
 9     9  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
10    10  1.46 0.140 0.209 -3.04 -0.487 -1.09 0.0579  1.10 -0.0256 0.515 0.990 0.303 -0.930 0.0840 0.527 0.0159
# ... with 9 more variables: `17` <dbl>, `18` <dbl>, `19` <dbl>, `20` <dbl>, `21` <dbl>, `22` <dbl>, `23` <dbl>,
#   `24` <dbl>, `25` <dbl>

Я считаю, что проще всего распространять данные, сначала собрав их в длинный формат данных.Мы достигаем этого, используя separate_rows.Проблема в том, что сначала нам нужно преобразовать списки в векторах во что-то, с чем separate_rows может работать.Мы делаем это, используя paste с collapse="," внутри saply (в противном случае все списки будут вставлены вместе).

Как только мы получим, это просто вопрос группировки, добавление столбца индекса строки (ипреобразование чисел обратно в числовое) и распространение для достижения желаемого формата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...