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 1elbird는 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 rowsget_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 rowsStopwords 를 추가해서 사용해보겠습니다.
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
Source: