Создание вектора по вхождению слова r - PullRequest
0 голосов
/ 02 ноября 2019

Мне нужно найти автоматический способ взять мой исходный вектор и преобразовать каждое слово, независимо от положения в векторе, в новый вектор. Каждый новый вектор отражает наличие своего базового слова в каждом элементе исходного вектора.

Мне нужно превратить это:

OriginalVector <- c("Nimble red fox", "Lazy Grey Dog", "Red Fox funny")

в это:

Nimble Red    Fox    Lazy   Grey   Dog    Funny
1      1      1      0      0      0      0
0      0      0      1      1      1      0
0      1      1      0      0      0      1

Каждая строка должна соответствовать каждому элементу в исходном векторе. То есть цифра 1 отражает наличие каждого слова в первом элементе исходного вектора «Ловкая рыжая лиса», во второй строке - вхождение каждого слова в «Ленивая серая собака», ... и т. Д.

У моей проблемы в реальном мире есть еще 300 000 элементов с несколькими сотнями тысяч уникальных слов. Я мог бы использовать r grep() или r grepl(), но попытка построить каждый вектор по отдельности была бы ошеломляющей. Это автоматизированный способ решения этой проблемы?

Примечание: я не ищу словосочетание совпадений слов. Вместо этого мне нужна строка таблицы частот (оригинальный элемент вектора) x word.

1 Ответ

1 голос
/ 02 ноября 2019

Любая из сред обработки естественного языка может сделать это довольно легко. Мне нравится tidytext для простых вещей, как это. Есть более быстрые в вычислительном отношении, но это довольно просто.

library(tidytext)
library(dplyr)
library(tidyr)

OriginalVector <- c("Nimble red fox", "Lazy Grey Dog", "Red Fox funny")

df <- tibble(id = seq_along(OriginalVector), text = OriginalVector)

df %>%
  unnest_tokens(word, text) %>%
  count(id, word) %>%
  pivot_wider(id_cols = id, names_from = word, values_from = n, values_fill = list(n = 0)) %>%
  select(-id)

# A tibble: 3 x 7
    fox nimble   red   dog  grey  lazy funny
  <int>  <int> <int> <int> <int> <int> <int>
1     1      1     1     0     0     0     0
2     0      0     0     1     1     1     0
3     1      0     1     0     0     0     1

Вы также можете выйти из рамки раньше и просто использовать table.

table(unnest_tokens(df, word, text))

   word
id  dog fox funny grey lazy nimble red
  1   0   1     0    0    0      1   1
  2   1   0     0    1    1      0   0
  3   0   1     1    0    0      0   1

Обратите внимание, что unnest_tokens() имеет опцию to_lower = TRUE по умолчанию. Вы можете изменить это на FALSE, если вы этого не хотите.

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