Skip to contents

Kiwi Class API

elbird는 간단하게 바로 사용할 수 있는 함수 api(tokenize(), analyze(), split_into_sents())를 제공합니다. 하지만 더욱 복잡한 동작에 대한 요구는 당연히 있겠죠. 그래서 Kiwi 클래스 api를 제공합니다.

library(elbird)
kw <- Kiwi$new()
kw
#> <kiwi class> 
#>   model: base

kiwi는 분석기 모델을 3가지로 제공합니다. small, base, large, 함수 api에서는 small을 사용하고 있으며, 아직 변경 방법을 제공하고 있지 않습니다.

Kiwi 클래스는 생성시 크기를 지정할 수 있습니다.

kwl <- Kiwi$new(model_size = "large")
kwl
#> <kiwi class> 
#>   model: large

이렇게 만든 Kiwi의 객체는 몇 가지 메소드를 제공합니다. 우선 당연히 tokenize()analyze()를 제공합니다.

kw$tokenize("안녕하세요.")
#> # A tibble: 5 × 5
#>   sent  form  tag   start   len
#>   <chr> <chr> <chr> <int> <int>
#> 1 1     안녕  NNG       1     2
#> 2 1     하    XSA       3     1
#> 3 1     시    EP        4     1
#> 4 1     어요  EF        4     2
#> 5 1     .     SF        6     1
kw$analyze("안녕하세요.")
#> [[1]]
#> [[1]]$Token
#> [[1]]$Token[[1]]
#> [[1]]$Token[[1]]$form
#> [1] "안녕"
#> 
#> [[1]]$Token[[1]]$tag
#> [1] "NNG"
#> 
#> [[1]]$Token[[1]]$start
#> [1] 1
#> 
#> [[1]]$Token[[1]]$len
#> [1] 2
#> 
#> 
#> [[1]]$Token[[2]]
#> [[1]]$Token[[2]]$form
#> [1] "하"
#> 
#> [[1]]$Token[[2]]$tag
#> [1] "XSA"
#> 
#> [[1]]$Token[[2]]$start
#> [1] 3
#> 
#> [[1]]$Token[[2]]$len
#> [1] 1
#> 
#> 
#> [[1]]$Token[[3]]
#> [[1]]$Token[[3]]$form
#> [1] "시"
#> 
#> [[1]]$Token[[3]]$tag
#> [1] "EP"
#> 
#> [[1]]$Token[[3]]$start
#> [1] 4
#> 
#> [[1]]$Token[[3]]$len
#> [1] 1
#> 
#> 
#> [[1]]$Token[[4]]
#> [[1]]$Token[[4]]$form
#> [1] "어요"
#> 
#> [[1]]$Token[[4]]$tag
#> [1] "EF"
#> 
#> [[1]]$Token[[4]]$start
#> [1] 4
#> 
#> [[1]]$Token[[4]]$len
#> [1] 2
#> 
#> 
#> [[1]]$Token[[5]]
#> [[1]]$Token[[5]]$form
#> [1] "."
#> 
#> [[1]]$Token[[5]]$tag
#> [1] "SF"
#> 
#> [[1]]$Token[[5]]$start
#> [1] 6
#> 
#> [[1]]$Token[[5]]$len
#> [1] 1
#> 
#> 
#> 
#> [[1]]$Score
#> [1] -10.18221
#> 
#> 
#> [[2]]
#> [[2]]$Token
#> [[2]]$Token[[1]]
#> [[2]]$Token[[1]]$form
#> [1] "안녕"
#> 
#> [[2]]$Token[[1]]$tag
#> [1] "NNG"
#> 
#> [[2]]$Token[[1]]$start
#> [1] 1
#> 
#> [[2]]$Token[[1]]$len
#> [1] 2
#> 
#> 
#> [[2]]$Token[[2]]
#> [[2]]$Token[[2]]$form
#> [1] "하"
#> 
#> [[2]]$Token[[2]]$tag
#> [1] "XSA"
#> 
#> [[2]]$Token[[2]]$start
#> [1] 3
#> 
#> [[2]]$Token[[2]]$len
#> [1] 1
#> 
#> 
#> [[2]]$Token[[3]]
#> [[2]]$Token[[3]]$form
#> [1] "시"
#> 
#> [[2]]$Token[[3]]$tag
#> [1] "EP"
#> 
#> [[2]]$Token[[3]]$start
#> [1] 4
#> 
#> [[2]]$Token[[3]]$len
#> [1] 1
#> 
#> 
#> [[2]]$Token[[4]]
#> [[2]]$Token[[4]]$form
#> [1] "어요"
#> 
#> [[2]]$Token[[4]]$tag
#> [1] "EF"
#> 
#> [[2]]$Token[[4]]$start
#> [1] 4
#> 
#> [[2]]$Token[[4]]$len
#> [1] 2
#> 
#> 
#> [[2]]$Token[[5]]
#> [[2]]$Token[[5]]$form
#> [1] "."
#> 
#> [[2]]$Token[[5]]$tag
#> [1] "SF"
#> 
#> [[2]]$Token[[5]]$start
#> [1] 6
#> 
#> [[2]]$Token[[5]]$len
#> [1] 1
#> 
#> 
#> 
#> [[2]]$Score
#> [1] -10.18221
#> 
#> 
#> [[3]]
#> [[3]]$Token
#> [[3]]$Token[[1]]
#> [[3]]$Token[[1]]$form
#> [1] "안녕"
#> 
#> [[3]]$Token[[1]]$tag
#> [1] "NNG"
#> 
#> [[3]]$Token[[1]]$start
#> [1] 1
#> 
#> [[3]]$Token[[1]]$len
#> [1] 2
#> 
#> 
#> [[3]]$Token[[2]]
#> [[3]]$Token[[2]]$form
#> [1] "하"
#> 
#> [[3]]$Token[[2]]$tag
#> [1] "XSA"
#> 
#> [[3]]$Token[[2]]$start
#> [1] 3
#> 
#> [[3]]$Token[[2]]$len
#> [1] 1
#> 
#> 
#> [[3]]$Token[[3]]
#> [[3]]$Token[[3]]$form
#> [1] "시"
#> 
#> [[3]]$Token[[3]]$tag
#> [1] "EP"
#> 
#> [[3]]$Token[[3]]$start
#> [1] 4
#> 
#> [[3]]$Token[[3]]$len
#> [1] 1
#> 
#> 
#> [[3]]$Token[[4]]
#> [[3]]$Token[[4]]$form
#> [1] "어요"
#> 
#> [[3]]$Token[[4]]$tag
#> [1] "EF"
#> 
#> [[3]]$Token[[4]]$start
#> [1] 4
#> 
#> [[3]]$Token[[4]]$len
#> [1] 2
#> 
#> 
#> [[3]]$Token[[5]]
#> [[3]]$Token[[5]]$form
#> [1] "."
#> 
#> [[3]]$Token[[5]]$tag
#> [1] "SF"
#> 
#> [[3]]$Token[[5]]$start
#> [1] 6
#> 
#> [[3]]$Token[[5]]$len
#> [1] 1
#> 
#> 
#> 
#> [[3]]$Score
#> [1] -10.18221

그리고 사용자의 추가 단어를 등록할 수 있습니다.

kw$tokenize("박박사입니다.")
#> # A tibble: 5 × 5
#>   sent  form  tag   start   len
#>   <chr> <chr> <chr> <int> <int>
#> 1 1     박    NNP       1     1
#> 2 1     박사  NNG       2     2
#> 3 1     이    VCP       4     1
#> 4 1     ᆸ니다 EF        4     3
#> 5 1     .     SF        7     1
kw$add_user_word("박박사", Tags$nnb, 0)
kw$tokenize("박박사입니다.")
#> # A tibble: 4 × 5
#>   sent  form   tag   start   len
#>   <chr> <chr>  <chr> <int> <int>
#> 1 1     박박사 NNB       1     3
#> 2 1     이     VCP       4     1
#> 3 1     ᆸ니다  EF        4     3
#> 4 1     .      SF        7     1

elbirdtidytext와 함께 사용할 수 있습니다. 그럼 예시 데이터를 준비해보겠습니다.

# 텍스트 데이터는 presidentSpeech 패키지를 사용했습니다.
# install.packages("presidentSpeech", repos = "https://forkonlp.r-universe.dev/")

library(vroom)
tar <- vroom("exam.txt")
#> Rows: 62 Columns: 2
#> ── Column specification ────────────────────────────────────────────────────────
#> Delimiter: "\t"
#> chr (1): content
#> dbl (1): paragraph
#> 
#>  Use `spec()` to retrieve the full column specification for this data.
#>  Specify the column types or set `show_col_types = FALSE` to quiet this message.
tar
#> # A tibble: 62 × 2
#>    paragraph content                                                            
#>        <dbl> <chr>                                                              
#>  1         1 존경하는 국민 여러분!                                              
#>  2         2 700만 해외동포 여러분!                                             
#>  3         3 이 자리에 참석하신 노무현ㆍ김대중ㆍ김영삼ㆍ전두환 전 대통령, 그리… 
#>  4         4 저는 오늘 국민 여러분의 부름을 받고 대한민국의 제17대 대통령에 취… 
#>  5         5 저는 이 자리에서 국민 여러분께 약속드립니다. 국민을 섬겨 나라를 편…
#>  6         6 올해로 대한민국 건국 60주년을 맞이합니다. 우리는 잃었던 땅을 되찾… 
#>  7         7 지구 상에서 가장 가난했던 나라가 세계 10위권의 경제 대국이 되었습… 
#>  8         8 그러나 우리는 알고 있습니다. 그것은 기적이 아니라 우리가 다 함께 … 
#>  9         9 독립을 위해 목숨을 바친 선열들, 전선에서 산화한 장병들, 뙤약볕과 … 
#> 10        10 장롱 속 금붙이를 들고나와 외환위기에 맞섰던 시민들, 겨울 바닷가에… 
#> # … with 52 more rows
#> # ℹ Use `print(n = ...)` to see more rows

get_tidytext_func() 메소드는 tidytextunnest_tokens() 함수와 동작하는 함수를 리턴합니다.

library(tidytext)

token_func <- kw$get_tidytext_func()
unnest_tokens(
  tar,
  input = content,
  output = word,
  token = tokenize_tidy
)
#> # A tibble: 2,117 × 2
#>    paragraph word     
#>        <dbl> <chr>    
#>  1         1 존경/nng 
#>  2         1 국민/nng 
#>  3         1 여러분/np
#>  4         2 700/sn   
#>  5         2 해외/nng 
#>  6         2 동포/nng 
#>  7         2 여러분/np
#>  8         3 자리/nng 
#>  9         3 참석/nng 
#> 10         3 시/ep    
#> # … with 2,107 more rows
#> # ℹ Use `print(n = ...)` to see more rows

Stopwords 를 추가해서 사용해보겠습니다.

sw <- Stopwords$new(FALSE)
sw$add(tag = Tags$sf)
sw$add("는", Tags$etm)

token_func <- kw$get_tidytext_func(stopwords = sw)
unnest_tokens(
  tar,
  input = content,
  output = word,
  token = token_func
)
#> # A tibble: 4,223 × 2
#>    paragraph word     
#>        <dbl> <chr>    
#>  1         1 존경/nng 
#>  2         1 하/xsv   
#>  3         1 국민/nng 
#>  4         1 여러분/np
#>  5         2 700/sn   
#>  6         2 만/nr    
#>  7         2 해외/nng 
#>  8         2 동포/nng 
#>  9         2 여러분/np
#> 10         3 이/mm    
#> # … with 4,213 more rows
#> # ℹ Use `print(n = ...)` to see more rows

사용자 단어 사전도 추가해서 진행해보겠습니다.

library(elbird)
kw <- Kiwi$new()
kw$add_user_word("해외동포", Tags$nng, 0)

sw <- Stopwords$new(FALSE)
sw$add(tag = Tags$sf)
sw$add("는", Tags$etm)

token_func <- kw$get_tidytext_func(stopwords = sw)
unnest_tokens(
  tar,
  input = content,
  output = word,
  token = token_func
)
#> # A tibble: 4,222 × 2
#>    paragraph word        
#>        <dbl> <chr>       
#>  1         1 존경/nng    
#>  2         1 하/xsv      
#>  3         1 국민/nng    
#>  4         1 여러분/np   
#>  5         2 700/sn      
#>  6         2 만/nr       
#>  7         2 해외동포/nng
#>  8         2 여러분/np   
#>  9         3 이/mm       
#> 10         3 자리/nng    
#> # … with 4,212 more rows
#> # ℹ Use `print(n = ...)` to see more rows