[R] 3. Analyzing word and document frequency: TF-IDF

반응형

3. Analyzing word and document frequency: TF-IDF

  • TF-IDF에서 TF는 단어 빈도(Term Frequency), IDF는 역문서 빈도(Inverse Document Frequency)를 의미합니다
  • 문서에서 단어의 빈도는 문서의 성격을 규명하는데 중요한 요소이지만 불용어들까지 포함하면 단어 빈도만으로는 어렵습니다.
  • 그렇다고 해서 불용어들을 필요할때마다 임의로 처리하는 것 또한 그렇게 나이스하다고는 보기 어렵습니다.
  • TF-IDF는 문서 묶음에서 각 단어의 빈도와 그 문서안에서의 빈도를 확인함으로써
    특정 단어가 문서 내에서 얼마나 중요한 지를 체크해보는 통계량입니다. (곱)
    • 특정 단어에 대한 IDF는 그 단어가 속한 문서의 수 대비 전체 문서 수의 로그 스케일 값으로 구합니다.
    • 자세한 것은 위키가 최고!



3. 1. Term frequency in Jane Austen’s novels

  • Jane Austen 데이터를 통해서 Term Frequency(TF)를 확인해보겠습니다.
  • 즉, 가장 많이 사용되는 단어는 어떤 것이 있을까요?
library(janeaustenr)
book_words <- austen_books() %>% 
  unnest_tokens(input = text, output = "word") %>% 
  count(book, word, sort = TRUE)

book_words
## # A tibble: 40,379 x 3
##    book              word      n
##    <fct>             <chr> <int>
##  1 Mansfield Park    the    6206
##  2 Mansfield Park    to     5475
##  3 Mansfield Park    and    5438
##  4 Emma              to     5239
##  5 Emma              the    5201
##  6 Emma              and    4896
##  7 Mansfield Park    of     4778
##  8 Pride & Prejudice the    4331
##  9 Emma              of     4291
## 10 Pride & Prejudice to     4162
## # … with 40,369 more rows
  • 가장 많이 사용되는 단어들은 the, to, and, of 등이 있습니다.
  • 이 자체 빈도 값에 다가 전체 문서에서의 빈도 비중을 아래 코드와 같이 구할수도 있습니다.
    • TF를 정의하는데 있어서 여러 가지 방법이 있을 수 있습니다.
    • 한 번이라도 나타나면 1, 로그 스케일 빈도 등..
book_words <- book_words %>% 
  left_join(
    book_words %>% group_by(book) %>% summarise(total = sum(n)) %>% ungroup(),
    by = "book"
  ) %>% 
  mutate(tf = n/total) # Term Frequency

book_words %>% 
  ggplot(aes(x = tf, fill = book)) +
  geom_histogram(bins = 20, show.legend = FALSE) +
  xlim(NA, 0.0009) +
  facet_wrap(~ book, scales = "free_y")
## Warning: Removed 896 rows containing non-finite values (stat_bin).
## Warning: Removed 6 rows containing missing values (geom_bar).

  • 위 그래프를 보면 자주 발생하는 단어들과 거의 발생하지 않는 단어들의 분포가 모든 소설(book)에서 유사한 모습을 보입니다.



3. 2. The bind_tf_idf() function

  • bind_tf_idf() 함수는 문서의 TF-IDF 값을 구하는 함수 중 하나이며, tidy text 포맷을 input으로 받습니다.
    • 문서당 토큰당 하나의 행이 있는 데이터 포맷
  • 아래 데이터처럼 각 문서(book, 소설) 당 토큰(word, 단어)당 하나의 행(n, 갯수)이 있는 데이터를 예시로 보겠습니다.
book_words %>% 
  select(book, word, n)
## # A tibble: 40,379 x 3
##    book              word      n
##    <fct>             <chr> <int>
##  1 Mansfield Park    the    6206
##  2 Mansfield Park    to     5475
##  3 Mansfield Park    and    5438
##  4 Emma              to     5239
##  5 Emma              the    5201
##  6 Emma              and    4896
##  7 Mansfield Park    of     4778
##  8 Pride & Prejudice the    4331
##  9 Emma              of     4291
## 10 Pride & Prejudice to     4162
## # … with 40,369 more rows
  • bind_tf_idf() 함수는 세 가지의 파라미터를 arguments로 받습니다.
    • term(토큰), document(문서), n(빈도)
    • TF를 구하기 위해 각 문서의 전체 토탈 빈도를 구하지 않아도 세 가지 인자만 받으면 됩니다.
book_tf_idf <- book_words %>% 
  select(book, word, n) %>% 
  bind_tf_idf(
    term = word,
    document = book,
    n = n
  )

book_tf_idf
## # A tibble: 40,379 x 6
##    book              word      n     tf   idf tf_idf
##    <fct>             <chr> <int>  <dbl> <dbl>  <dbl>
##  1 Mansfield Park    the    6206 0.0387     0      0
##  2 Mansfield Park    to     5475 0.0341     0      0
##  3 Mansfield Park    and    5438 0.0339     0      0
##  4 Emma              to     5239 0.0325     0      0
##  5 Emma              the    5201 0.0323     0      0
##  6 Emma              and    4896 0.0304     0      0
##  7 Mansfield Park    of     4778 0.0298     0      0
##  8 Pride & Prejudice the    4331 0.0354     0      0
##  9 Emma              of     4291 0.0267     0      0
## 10 Pride & Prejudice to     4162 0.0341     0      0
## # … with 40,369 more rows
  • 일반적으로 많은 빈도를 보이는 단어들은 TF-IDF 값은 0을 갖습니다.
    • the, to, and, of 등 이러한 단어들은 6편의 소설 모두에서 등장하는 단어이기에 IDF값은 1의 자연로그, 즉 0이 나올 가능성이 높음
  • 이렇게 접근하는 방식이 즉, 일반적인 단어에 대해서는 가중치를 줄이는 방법입니다.
  • 각 소설에서 TF-IDF 값이 높은 단어들을 기준으로 내림차순한 결과는 아래와 같습니다.
book_tf_idf %>% 
  arrange(desc(tf_idf))
## # A tibble: 40,379 x 6
##    book                word          n      tf   idf  tf_idf
##    <fct>               <chr>     <int>   <dbl> <dbl>   <dbl>
##  1 Sense & Sensibility elinor      623 0.00519  1.79 0.00931
##  2 Sense & Sensibility marianne    492 0.00410  1.79 0.00735
##  3 Mansfield Park      crawford    493 0.00307  1.79 0.00551
##  4 Pride & Prejudice   darcy       373 0.00305  1.79 0.00547
##  5 Persuasion          elliot      254 0.00304  1.79 0.00544
##  6 Emma                emma        786 0.00488  1.10 0.00536
##  7 Northanger Abbey    tilney      196 0.00252  1.79 0.00452
##  8 Emma                weston      389 0.00242  1.79 0.00433
##  9 Pride & Prejudice   bennet      294 0.00241  1.79 0.00431
## 10 Persuasion          wentworth   191 0.00228  1.79 0.00409
## # … with 40,369 more rows
  • 각 소설 별 TF-IDF가 높은 값 기준 상위 15개들의 단어들을 살펴보겠습니다.
book_tf_idf %>% 
  group_by(book) %>% 
  slice_max(tf_idf, n = 15) %>% 
  ungroup() %>% 
  ggplot(aes(x = reorder(word, tf_idf), y = tf_idf, fill = book)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~ book, ncol = 2, scales = "free") +
  coord_flip()

  • TF-IDF를 측정한 것은 Jane Austen이 6편의 소설에서 비슷한 언어를 사용했으며,
    해당 작가의 작품에서 한 소설을 나머지 소설과 구별하는 것은 고유명사, 사람 및 장소의 이름이라는 것을 보여줍니다.
  • 이것이 TF-IDF의 요점입니다.
  • 문서 모음에서 하나의 문서에 대한 중요한 단어를 식별합니다.



반응형
TAGS.

Comments