Р: Как рассчитать tf-idf для одного члена после получения матрицы tf-idf? - PullRequest
0 голосов
/ 25 января 2020

В прошлом я получал помощь в создании tf-idf для одного из моих документов и получил вывод, который хотел (см. Ниже).

TagSet <- data.frame(emoticon = c("?","?","?","?","?"),
                     stringsAsFactors = FALSE)

TextSet <- data.frame(tweet = c("?Sharp, adversarial⚔️~pro choice?~ban Pit Bulls☠️~BSL?️~aberant psychology?~common sense?~the Piper will lead us to reason?~sealskin woman?",
                                "Blocked by Owen, Adonis. Abbott & many #FBPE? Love seaside, historic houses & gardens, family & pets. RTs & likes/ Follows may=interest not agreement ??",
                                "???????? #healthy #vegetarian #beatchronicillness fix infrastructure",
                                "LIBERTY-IDENTITARIAN. My bio, photo at Site Info. And kindly add my site to your Daily Favorites bar. Thank you, Eric",
                                "??I #BackTheBlue for my son!?? Facts Over Feelings. Border Security saves lives! #ThankYouICE",
                                "????? I play Pedal Steel @CooderGraw & #CharlieShafter???? #GoStars #LiberalismIsAMentalDisorder",
                                "#Englishman  #Londoner  @Chelseafc  ?️‍♂️ ?? ? ???????????",
                                "F*** the Anti-White Agenda #Christian #Traditional #TradThot #TradGirl #European #MAGA #AltRight #Folk #Family #WhitePride",
                                "??❄️Do not dwell in tbaconhe past, do not dream of the future, concentrate the mind on the present moment.??️❄️",
                                "Ordinary girl in a messed up World | Christian | Anti-War | Anti-Zionist | Pro-Life | Pro ?? | ??Hello intro on the Minds Link |"),
                      stringsAsFactors = FALSE)


library(dplyr)
library(quanteda)

tweets_dfm <- dfm(TextSet$tweet)  # convert to document-feature matrix

tweets_dfm %>% 
  dfm_select(TagSet$emoticon) %>% # only leave emoticons in the dfm
  dfm_tfidf() %>%                 # weight with tfidf
  convert("data.frame")           # turn into data.frame to display more easily

#     document       ?             ?           ?          ?           ?
# 1     text1      1.39794            1            0            0            0
# 2     text2      0.00000            0            1            0            0
# 3     text3      0.00000            0            0            0            0
# 4     text4      0.00000            0            0            0            0
# 5     text5      0.00000            0            0            0            0
# 6     text6      0.69897            0            0            0            0
# 7     text7      0.00000            0            0            1            1
# 8     text8      0.00000            0            0            0            0
# 9     text9      0.00000            0            0            0            0
# 10   text10      0.00000            0            0            0            0

Но мне нужно немного помогите с вычислением tf-idf за единичный термин. То есть, как мне точно получить значение tf-idf для каждого члена из матрицы?

# terms      tfidf
# ?      #its tfidf the correct way   
# ?      #its tfidf the correct way 
# ?      #its tfidf the correct way 
# ?      #its tfidf the correct way 
# ?      #its tfidf the correct way 

Я уверен, что это не то же самое, что добавить все tf-idf для термина из его столбца матрицы и разделить на документы, где он появился. И это будет значение для этого термина.

Я посмотрел на несколько источников, таких как здесь, https://stats.stackexchange.com/questions/422750/how-to-calculate-tf-idf-for-a-single-term, но этот парень спрашивает что-то еще полностью из того, что я прочитал.

В настоящее время у меня слабая терминология по анализу и анализу текста. Поэтому я заранее извиняюсь за глупость.

1 Ответ

3 голосов
/ 25 января 2020

Короче говоря, вы не можете вычислить значение tf-idf для каждого объекта, изолированного от контекста документа, потому что каждое значение tf-idf для объекта задает c для документа.

Более конкретно :

  • (инверсная) частота документа - одно значение для каждого объекта, поэтому индексированная частота $ j $
  • - это одно значение для каждого документа, поэтому индексируется $ ij $ * Поэтому 1008 *
  • tf-idf индексируется $ i, j $

Это можно увидеть в вашем примере:

> tweets_dfm %>% 
+   dfm_tfidf() %>%
+   dfm_select(TagSet$emoticon) %>% # only leave emoticons in the dfm
+   as.matrix()
        features
docs     \U0001f914 \U0001f4aa \U0001f603 \U0001f953 \U0001f37a
  text1     1.39794          1          0          0          0
  text2     0.00000          0          1          0          0
  text3     0.00000          0          0          0          0
  text4     0.00000          0          0          0          0
  text5     0.00000          0          0          0          0
  text6     0.69897          0          0          0          0
  text7     0.00000          0          0          1          1
  text8     0.00000          0          0          0          0
  text9     0.00000          0          0          0          0
  text10    0.00000          0          0          0          0

Еще две вещи:

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

  2. Выше я вычислил tf-idf до , удалив другие функции, поскольку это переопределит частоту терминов, если вы используете относительные («нормализованные») частоты терминов. dfm_tfidf() по умолчанию использует количество терминов, поэтому результаты здесь не затрагиваются.

...