Source:
vignettes/articles/kiwi-class.Rmd
kiwi-class.Rmd
Kiwi Class API
elbird는 간단하게 바로 사용할 수 있는 함수 api(tokenize()
, analyze()
, split_into_sents()
)를 제공합니다. 하지만 더욱 복잡한 동작에 대한 요구는 당연히 있겠죠. 그래서 Kiwi
클래스 api를 제공합니다.
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
elbird는 tidytext와 함께 사용할 수 있습니다. 그럼 예시 데이터를 준비해보겠습니다.
# 텍스트 데이터는 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()
메소드는 tidytext의 unnest_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