[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의 요점입니다.
- 문서 모음에서 하나의 문서에 대한 중요한 단어를 식별합니다.
반응형
'tidytext' 카테고리의 다른 글
[R] 5. Converting to and from non-tidy formats (0) | 2021.07.19 |
---|---|
[R] 4. Relationships between words: n-grams and correlations (0) | 2021.07.18 |
[R] 한글 형태소 분석 (0) | 2021.07.17 |
[R] unnest_tokens() (0) | 2021.07.17 |
[R] 2. Sentiment analysis with tidy data (0) | 2021.07.17 |
TAGS.