R: Лучшие N элементов каждой группы без дубликатов - PullRequest
0 голосов
/ 29 июня 2018

Для классного проекта у меня есть набор твитов, разделенных на три типа речи: ненависть, обычная речь и оскорбление. Моя цель состоит в том, чтобы в конечном итоге обучить классификатор прогнозировать правильный тип твита из данных.

У меня есть таблица данных в чистом формате (по одному слову в строке), содержащая оценку TF-IDF каждого слова. Я подверг цензуре оскорбительные выражения со звездочками:

> tfidf_words
# A tibble: 34,717 x 7
   speech tweet_id word       n    tf   idf tf_idf
   <fct>     <int> <chr>  <int> <dbl> <dbl>  <dbl>
 1 hate   24282747 reason     1 0.25   5.69  1.42 
 2 hate   24282747 usd        1 0.25   8.73  2.18 
 3 hate   24282747 bunch      1 0.25   5.60  1.40 
 4 hate   24282747 ******     1 0.25   5.21  1.30 
 5 hate   24284443 sand       1 0.5    4.76  2.38 
 6 hate   24284443 ******     1 0.5    2.49  1.24 
 7 hate   24324552 madden     1 0.111  8.73  0.970
 8 hate   24324552 call       1 0.111  4.11  0.456
 9 hate   24324552 ******     1 0.111  2.05  0.228
10 hate   24324552 set        1 0.111  5.90  0.655
# ... with 34,707 more rows

Чтобы ограничить размер пространства моих тренировочных функций, я хочу получить первые «n» уникальных слов каждого типа речи на основе их оценок TF-IDF.

My vocabulary - это вектор всех уникальных слов, выбранных для моего пространства признаков, определяемый как vocabulary <- unique(feature_space$word)

В моей программе я использую SENTIMENT_SIZE, чтобы определить, сколько слов каждого типа речи я хочу в своей модели.

Я пробовал оба варианта:

feature_space <- tfidf_words %>%
  arrange(desc(tf_idf)) %>%
  group_by(speech) %>%
  slice(1:SENTIMENT_SIZE) %>%
  ungroup() %>%
  arrange(tweet_id)

и это:

feature_space <- tfidf_words %>%
  group_by(speech) %>%
  top_n(n = SENTIMENT_SIZE, wt = tf_idf) %>%
  ungroup()

Они оба "своего рода" работают, но они оба не обрабатывают дубликаты так, как мне хотелось бы. Если, например, я установлю SENTIMENT_SIZE равным 100, я бы хотел видеть 100 уникальных слов из каждого типа речи, выбранных в общей сложности для 300 слов.

Вместо этого у нас есть этот результат для метода 1:

> length(vocabulary)
[1] 248

И этот результат для метода 2:

> length(vocabulary)
[1] 293

Как я могу:

  1. Убедитесь, что в каждой речевой группе не выбраны повторяющиеся слова, и ...
  2. Убедитесь, что слова, выбранные в каждой группе, отличаются от слов в других группах?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Благодаря @A. Сулиман Я думаю, у меня есть кое-что, что работает сейчас.

feature_space <- tfidf_words %>%
  arrange(desc(tf_idf)) %>% 
  distinct(word, .keep_all = TRUE) %>% #remove all duplicate words
  group_by(speech) %>%
  slice(1:SENTIMENT_SIZE) %>% #grab first n of each speech category
  ungroup()

Это всегда должно приводить к ожидаемому количеству слов в моем словаре, потому что оно упреждающе исключает любую возможность связи.

0 голосов
/ 29 июня 2018

Здесь я предполагаю, что вы ищете уникальный word в каждой группе speech

tfidf_words %>% arrange(desc(tf_idf)) %>% 
                group_by(speech) %>% distinct(word, .keep_all = TRUE) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...