Skip to content

bit2r/bitNLP

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

35 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

bitNLP bitNLP logo

bitNLP κ°œμš”

bitNLPλŠ” ν…μŠ€νŠΈ 데이터λ₯Ό 탐색(Explore Documents)ν•˜κ³ , μžμ—°μ–΄ 처리(Natural Language Processing) 및 ν˜•νƒœμ†ŒλΆ„μ„, 감성뢄석을 μˆ˜ν–‰ν•˜λŠ”, ν•œκΈ€ ν…μŠ€νŠΈ 데이터 뢄석 λ„κ΅¬λ“€μ˜ λͺ¨μŒμž…λ‹ˆλ‹€.

bitNLP의 λ‹€μŒ κΈ°λŠ₯은 bitNLP νŒ¨ν‚€μ§€μ˜ λΉ„λ„€νŠΈμΈ Introduce bitNLP에 μ†Œκ°œλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

  • ν…μŠ€νŠΈ 데이터 μ „μ²˜λ¦¬ κΈ°λŠ₯
  • ν…μŠ€νŠΈ 데이터 탐색 κΈ°λŠ₯
  • ν˜•νƒœμ†ŒλΆ„μ„ κΈ°λŠ₯
  • 감성뢄석 κΈ°λŠ₯
  • ν˜•νƒœμ†Œ 사전 관리 κΈ°λŠ₯

bitNLP μ„€μΉ˜

bitNLP νŒ¨ν‚€μ§€ μ„€μΉ˜ν•˜κΈ°

Github λ¦¬νŒŒμ§€ν† λ¦¬μ—μ„œ λ°°ν¬ν•˜λŠ” νŒ¨ν‚€μ§€λ₯Ό λ‹€μŒκ³Ό 같이 μ„€μΉ˜ν•©λ‹ˆλ‹€.

remotes::install_github("bit2r/bitNLP")

κ΄€λ ¨ λ¦¬μ†ŒμŠ€ μ„€μΉ˜ν•˜κΈ°

bitNLPλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒμ˜ 두 λ¦¬μ†ŒμŠ€λ₯Ό μ„€μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

  • μ€μ „ν•œλ‹’ ν˜•νƒœμ†ŒλΆ„μ„κΈ° μ‹œμŠ€ν…œκ³Ό 사전
    • mecab-ko ν˜Ήμ€ mecab-ko-msvc
    • mecab-ko-dic
  • RcppMeCab νŒ¨ν‚€μ§€
    • Rμ—μ„œ mecab-ko 연동을 μœ„ν•œ R νŒ¨ν‚€μ§€

μ€μ „ν•œλ‹’ ν˜•νƒœμ†ŒλΆ„μ„κΈ° μ‹œμŠ€ν…œκ³Ό 사전은 bitNLP νŒ¨ν‚€μ§€μ˜ λΉ„λ„€νŠΈμΈ Install mecab-ko에 μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

사전에 μ„€μΉ˜ν•΄μ•Ό ν•˜λŠ” λ¦¬μ†ŒμŠ€λŠ” λ‹€μŒμ˜ μˆœμ„œμ™€ λ°©λ²•λŒ€λ‘œ μ„€μΉ˜ν•˜λŠ” 것을 μΆ”μ²œν•©λ‹ˆλ‹€.

  1. μ€μ „ν•œλ‹’ ν˜•νƒœμ†ŒλΆ„μ„κΈ° μ‹œμŠ€ν…œκ³Ό 사전
library("bitNLP")

install_mecab_ko()
  1. RcppMeCab νŒ¨ν‚€μ§€ μ„€μΉ˜
install.packages("RcppMeCab")

bitNLP μ‚¬μš©ν•˜κΈ°

ν•œκΈ€ μžλ™ 띄어쓰기

ν•œκΈ€ λ¬Έμž₯을 띄어쓰기 κ·œμΉ™μ— 맞게 μžλ™μœΌλ‘œ 띄어쓰기 보정

library(bitNLP)

get_spacing("μ΅œκ·ΌμŒμ„±μΈμ‹μ •ν™•λ„κ°€λ†’μ•„μ§μ—λ”°λΌλ§Žμ€μŒμ„±λ°μ΄ν„°κ°€ν…μŠ€νŠΈλ‘œλ³€ν™˜λ˜κ³ λΆ„μ„λ˜κΈ°μ‹œμž‘ν–ˆλŠ”λ°,이λ₯Όμœ„ν•΄μž˜λ™μž‘ν•˜λŠ”λ„μ–΄μ“°κΈ°μ—”μ§„μ€κ±°μ˜ν•„μˆ˜μ μΈκ²Œλ˜μ–΄λ²„λ Έλ‹€")
#> [1] "졜근 μŒμ„± 인식 정확도가 λ†’μ•„ 짐에 따라 λ§Žμ€ μŒμ„± 데이터가 ν…μŠ€νŠΈλ‘œ λ³€ν™˜λ˜κ³  λΆ„μ„λ˜κΈ° μ‹œμž‘ν–ˆλŠ”λ°, 이λ₯Ό μœ„ν•΄ 잘 λ™μž‘ν•˜λŠ” 띄어쓰기 엔진은 거의 ν•„μˆ˜μ μΈ 게 λ˜μ–΄ 버렸닀"
str <- "κΈ€μ“°κΈ°μ—μ„œλ§žμΆ€λ²•κ³Όλ„μ–΄μ“°κΈ°λ₯Όμ˜¬λ°”λ₯΄κ²Œν•˜λŠ”κ²ƒμ€μ’‹μ€κΈ€μ΄λ μˆ˜μžˆλŠ”μš”κ±΄μ€‘ν•˜λ‚˜μ΄λ‹€.ν•˜μ§€λ§Œμš”μ¦˜ν•™μƒλ“€μ€λΆ€μ‘±ν•œμ–΄λ¬Έκ·œμ •μ§€μ‹μœΌλ‘œμΈν•΄λ§žμΆ€λ²•κ³Όλ„μ–΄μ“°κΈ°μ—μ„œλ§Žμ€μ˜€λ₯˜λ₯Όλ²”ν•˜κΈ°λ„ν•œλ‹€.λ³Έμ—°κ΅¬λŠ”κ·Έμ€‘λ„μ–΄μ“°κΈ°κ°€κΈ€μ„μΈμ‹ν•˜λŠ”λ°μ€‘μš”ν•œμ—­ν• μ„ν•˜λŠ”κ²ƒμœΌλ‘œνŒλ‹¨ν•˜μ—¬,λŒ€ν•™μƒλ“€μ΄λ„μ–΄μ“°κΈ°μ—λŒ€ν•΄μ„œμ–΄λŠμ •λ„μ •ν™•ν•˜κ²ŒμΈμ‹ν•˜κ³ μžˆλŠ”μ§€,μ‹€μ œμ˜€λ₯˜μ‹€νƒœλŠ”μ–΄λ– ν•œμ§€μ—λŒ€ν•΄μ‚΄νŽ΄μ„œκ·Έμ˜€λ₯˜λ₯Όκ°œμ„ ν• μˆ˜μžˆλŠ”κ΅μœ‘λ°©μ•ˆμ„λ§ˆλ ¨ν• ν•„μš”κ°€μžˆλ‹€κ³ νŒλ‹¨ν•˜μ˜€λ‹€."
get_spacing(str)
#> [1] "κΈ€μ“°κΈ°μ—μ„œ λ§žμΆ€λ²•κ³Ό 띄어쓰기λ₯Ό μ˜¬λ°”λ₯΄κ²Œ ν•˜λŠ” 것은 쒋은 글이 될 수 μžˆλŠ” μš”κ±΄ 쀑 ν•˜λ‚˜μ΄λ‹€. ν•˜μ§€λ§Œ μš”μ¦˜ 학생듀은 λΆ€μ‘±ν•œ μ–΄λ¬Έ κ·œμ • μ§€μ‹μœΌλ‘œ 인해 λ§žμΆ€λ²•κ³Ό λ„μ–΄μ“°κΈ°μ—μ„œ λ§Žμ€ 였λ₯˜λ₯Ό λ²”ν•˜κΈ°λ„ ν•œλ‹€. λ³Έ μ—°κ΅¬λŠ” κ·Έ 쀑 띄어쓰기가 글을 μΈμ‹ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•˜λŠ” κ²ƒμœΌλ‘œ νŒλ‹¨ν•˜μ—¬, λŒ€ν•™μƒλ“€μ΄ 띄어쓰기에 λŒ€ν•΄μ„œ μ–΄λŠ 정도 μ •ν™•ν•˜κ²Œ μΈμ‹ν•˜κ³  μžˆλŠ”μ§€, μ‹€μ œ 였λ₯˜ μ‹€νƒœλŠ” μ–΄λ– ν•œμ§€μ— λŒ€ν•΄ μ‚΄νŽ΄μ„œ κ·Έ 였λ₯˜λ₯Ό κ°œμ„ ν•  수 μžˆλŠ” ꡐ윑 λ°©μ•ˆμ„ λ§ˆλ ¨ν•  ν•„μš”κ°€ μžˆλ‹€κ³  νŒλ‹¨ν•˜μ˜€λ‹€."

ν˜•νƒœμ†Œ 뢄석

μ€μ „ν•œλ‹’ ν˜•νƒœμ†Œ 뢄석기λ₯Ό ν˜ΈμΆœν•˜μ—¬ ν˜•νƒœμ†Œ 뢄석을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. bitNLPλŠ” 이 ν˜•νƒœμ†ŒλΆ„μ„μ„ 쉽고 효과적으둜 μˆ˜ν–‰ν•˜λŠ” 것을 λ„μ™€μ€λ‹ˆλ‹€.

ν˜•νƒœμ†ŒλΆ„μ„μ€ λΉ„λ„€νŠΈμΈ Morphological Analysis에 μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

docs <- c("λ‹˜μ€ κ°”μŠ΅λ‹ˆλ‹€. μ•„μ•„, μ‚¬λž‘ν•˜λŠ” λ‚˜μ˜ λ‹˜μ€ κ°”μŠ΅λ‹ˆλ‹€.",
          "ν‘Έλ₯Έ 산빛을 깨치고 λ‹¨ν’λ‚˜λ¬΄ μˆ²μ„ ν–₯ν•˜μ—¬ λ‚œ μž‘μ€ 길을 κ±Έμ–΄μ„œ, 차마 λ–¨μΉ˜κ³  κ°”μŠ΅λ‹ˆλ‹€.")
morpho_mecab(docs,  type = "morpheme")
#> [[1]]
#>      NNG       JX    VV+EP       EF       SF       IC       SC      NNG 
#>     "λ‹˜"     "은"     "κ°”" "μŠ΅λ‹ˆλ‹€"      "."   "μ•„μ•„"      ","   "μ‚¬λž‘" 
#>      XSV      ETM       NP      JKG      NNG       JX    VV+EP       EF 
#>     "ν•˜"     "λŠ”"     "λ‚˜"     "의"     "λ‹˜"     "은"     "κ°”" "μŠ΅λ‹ˆλ‹€" 
#>       SF 
#>      "." 
#> 
#> [[2]]
#>     VA+ETM        NNG        NNG        JKO         VV         EC        NNG 
#>     "ν‘Έλ₯Έ"       "μ‚°"       "λΉ›"       "을"     "깨치"       "κ³ " "λ‹¨ν’λ‚˜λ¬΄" 
#>        NNG        JKO         VV         EC      NP+JX         VA        ETM 
#>       "숲"       "을"     "ν–₯ν•˜"       "μ—¬"       "λ‚œ"       "μž‘"       "은" 
#>        NNG        JKO      VV+EC         SC        MAG         VV         EC 
#>       "κΈΈ"       "을"   "κ±Έμ–΄μ„œ"        ","     "차마"     "λ–¨μΉ˜"       "κ³ " 
#>      VV+EP         EF         SF 
#>       "κ°”"   "μŠ΅λ‹ˆλ‹€"        "."

ν•œκΈ€ ν…μŠ€νŠΈμ—μ„œλŠ” λͺ…μ‚¬λ§ŒμœΌλ‘œ λ¬Έλ§₯을 νŒŒμ•…ν•˜λŠ” 것이 μœ μš©ν•©λ‹ˆλ‹€. morpho_mecab() ν•¨μˆ˜μ˜ κΈ°λ³Έ μΈμˆ˜λŠ” 이λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€.

morpho_mecab(docs)
#> [[1]]
#>    NNG    NNG    NNG 
#>   "λ‹˜" "μ‚¬λž‘"   "λ‹˜" 
#> 
#> [[2]]
#>        NNG        NNG        NNG        NNG        NNG 
#>       "μ‚°"       "λΉ›" "λ‹¨ν’λ‚˜λ¬΄"       "숲"       "κΈΈ"

morpho_mecab()λŠ” μ—¬λŸ¬ 개의 λ¬Έμ„œλ₯Ό ν•˜λ‚˜λ‘œ ν•©μ³μ„œ ν† ν¬λ‚˜μ΄μ¦ˆν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

morpho_mecab(docs, indiv = FALSE)
#>        NNG        NNG        NNG        NNG        NNG        NNG        NNG 
#>       "λ‹˜"     "μ‚¬λž‘"       "λ‹˜"       "μ‚°"       "λΉ›" "λ‹¨ν’λ‚˜λ¬΄"       "숲" 
#>        NNG 
#>       "κΈΈ"

ν’ˆμ‚¬μ˜ μ›Œλ“œν΄λΌμš°λ“œ 그리기

λͺ…사λ₯Ό μΆ”μΆœν•˜μ—¬ μ›Œλ“œν΄λΌμš°λ“œλ₯Ό κ·Έλ €λ΄…λ‹ˆλ‹€. bitNLP에 수둝된 λŒ€ν†΅λ Ή μ—°μ„€λ¬Έ 데이터셋인 president_speechμ—μ„œ μž„μ˜μ˜ μ—°μ„€λ¬Έ 100κ°œμ—μ„œ 일반λͺ…사λ₯Ό μΆ”μΆœ ν›„ μ›Œλ“œν΄λΌμš°λ“œλ₯Ό κ·Έλ € λ΄…λ‹ˆλ‹€.

library(dplyr)

president_speech$doc[1:100] %>% 
  morpho_mecab(indiv = FALSE) %>% 
  table() %>% 
  wordcloud2::wordcloud2(fontFamily = "NanumSquare")

λŒ€ν†΅λ Ή μ—°μ„€λ¬Έ λͺ…사 μ›Œλ“œν΄λΌμš°λ“œ

ν…μŠ€νŠΈ 데이터 탐색

ν…μŠ€νŠΈ 데이터 탐색 κΈ°λŠ₯은 λΉ„λ„€νŠΈμΈ Explore Documents에 μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

Text Data Explorer

ν…μŠ€νŠΈ 데이터 탐색 κΈ°λŠ₯은 Text Data ExplorerλΌλŠ” μ΄λ¦„μ˜ Shiny 앱이 μ œκ³΅ν•©λ‹ˆλ‹€. 그리고 κ·Έ κΈ°λŠ₯은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • 데이터 ꡬ쑰 νŒŒμ•…ν•˜κΈ°
  • 데이터 탐색과 μ •μ œν•˜κΈ°
  • νŒ¨ν„΄κ²€μƒ‰κ³Ό λ¬Έμžμ—΄ λŒ€μ²΄
  • ν˜•νƒœμ†ŒλΆ„μ„μ„ μ΄μš©ν•œ 데이터 탐색
  • κ³΅λ™λ°œμƒλΆ„μ„μ„ μ΄μš©ν•œ 데이터 탐색
  • n-gramsλ₯Ό μ΄μš©ν•œ 데이터 탐색
  • R λͺ…λ Ήμ–΄ μ‹€ν–‰

Text Data Explorer μ˜ˆμ‹œ ν™”λ©΄

  • Text Data Explorer κΈ°λŠ₯ μ€‘μ—μ„œ 탐색 및 μΉ˜ν™˜ κΈ°λŠ₯ 화면에 λŒ€ν•œ μ˜ˆμ‹œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.:
탐색 및 μΉ˜ν™˜ κΈ°λŠ₯ ν™”λ©΄

탐색 및 μΉ˜ν™˜ κΈ°λŠ₯ ν™”λ©΄

tidytextμ™€μ˜ ν˜‘μ—…

tidytext νŒ¨ν‚€μ§€μ™€μ˜ ν˜‘μ—…μ„ μœ„ν•œ κΈ°λŠ₯은 λΉ„λ„€νŠΈμΈ Collaboration with tidytext package에 μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

tokenizers

bitNLPλŠ” ν† ν¬λ‚˜μ΄μ €λ‘œ λ‹€μŒκ³Ό 같은 ν•¨μˆ˜λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€.

  • ν˜•νƒœμ†Œ ν† ν¬λ‚˜μ΄μ €
    • morpho_mecab()
    • part-of-speech tagger λ‹¨μœ„μ˜ ν† ν¬λ‚˜μ΄μ €
  • λͺ…사 n-grams ν† ν¬λ‚˜μ΄μ €
    • tokenize_noun_ngrams()
docs <- c("λ‹˜μ€ κ°”μŠ΅λ‹ˆλ‹€. μ•„μ•„, μ‚¬λž‘ν•˜λŠ” λ‚˜μ˜ λ‹˜μ€ κ°”μŠ΅λ‹ˆλ‹€.",
          "ν‘Έλ₯Έ 산빛을 깨치고 λ‹¨ν’λ‚˜λ¬΄ μˆ²μ„ ν–₯ν•˜μ—¬ λ‚œ μž‘μ€ 길을 κ±Έμ–΄μ„œ, 차마 λ–¨μΉ˜κ³  κ°”μŠ΅λ‹ˆλ‹€.")

tokenize_noun_ngrams(docs)
#> [[1]]
#> [1] "λ‹˜ μ‚¬λž‘" "μ‚¬λž‘ λ‹˜"
#> 
#> [[2]]
#> [1] "μ‚° λΉ›"       "λΉ› λ‹¨ν’λ‚˜λ¬΄" "λ‹¨ν’λ‚˜λ¬΄ 숲" "숲 κΈΈ"

# simplify = TRUE
tokenize_noun_ngrams(docs[1], simplify = TRUE)
#> [1] "λ‹˜ μ‚¬λž‘" "μ‚¬λž‘ λ‹˜"

str <- "μ‹ ν˜ΌλΆ€λΆ€λ‚˜ μ£Όλ§λΆ€λΆ€λŠ” 놀이곡원 μžμœ μ΄μš©κΆŒμ„ 즐겨 κ΅¬λ§€ν•©λ‹ˆλ‹€."

tokenize_noun_ngrams(str)
#> [[1]]
#> [1] "μ‹ ν˜Ό λΆ€λΆ€" "λΆ€λΆ€ 주말" "주말 λΆ€λΆ€" "λΆ€λΆ€ 놀이" "놀이 곡원" "곡원 자유"
#> [7] "자유 이용" "이용 ꡬ맀"

# λΆˆμš©μ–΄ 처리
tokenize_noun_ngrams(str, stopwords = "ꡬ맀")
#> [[1]]
#> [1] "μ‹ ν˜Ό λΆ€λΆ€" "λΆ€λΆ€ 주말" "주말 λΆ€λΆ€" "λΆ€λΆ€ 놀이" "놀이 곡원" "곡원 자유"
#> [7] "자유 이용"
 
# μ‚¬μš©μž μ •μ˜ 사전 μ‚¬μš©
dic_path <- system.file("dic", package = "bitNLP")
dic_file <- glue::glue("{dic_path}/buzz_dic.dic")
tokenize_noun_ngrams(str, simplify = TRUE, user_dic = dic_file)
#> [1] "μ‹ ν˜ΌλΆ€λΆ€ 주말뢀뢀" "주말뢀뢀 놀이"     "놀이 곡원"        
#> [4] "곡원 자유이용ꢌ"   "자유이용ꢌ ꡬ맀"

# n_min
tokenize_noun_ngrams(str, n_min = 1, user_dic = dic_file)
#> [[1]]
#>  [1] "μ‹ ν˜ΌλΆ€λΆ€"          "μ‹ ν˜ΌλΆ€λΆ€ 주말뢀뢀" "주말뢀뢀"         
#>  [4] "주말뢀뢀 놀이"     "놀이"              "놀이 곡원"        
#>  [7] "곡원"              "곡원 자유이용ꢌ"   "자유이용ꢌ"       
#> [10] "자유이용ꢌ ꡬ맀"   "ꡬ맀"

# ngram_delim
tokenize_noun_ngrams(str, ngram_delim = ":", user_dic = dic_file)
#> [[1]]
#> [1] "μ‹ ν˜ΌλΆ€λΆ€:주말뢀뢀" "주말뢀뢀:놀이"     "놀이:곡원"        
#> [4] "곡원:자유이용ꢌ"   "자유이용ꢌ:ꡬ맀"

# bi-grams
tokenize_noun_ngrams(str, n = 2, ngram_delim = ":", user_dic = dic_file)
#> [[1]]
#> [1] "μ‹ ν˜ΌλΆ€λΆ€:주말뢀뢀" "주말뢀뢀:놀이"     "놀이:곡원"        
#> [4] "곡원:자유이용ꢌ"   "자유이용ꢌ:ꡬ맀"

ν•œκΈ€ unnest_tokens

bitNLP의 ν•œκΈ€ unnest_tokensμ—λŠ” λͺ…사 n-grams ν† ν¬λ‚˜μ΄μ¦ˆλ₯Ό μ§€μ›ν•˜λŠ” unnest_noun_ngrams() ν•¨μˆ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” tidytext νŒ¨ν‚€μ§€μ˜ unnest_tokens ν•¨μˆ˜κ΅°μ˜ μ‚¬μš©λ²•κ³Ό 거의 λ™μΌν•©λ‹ˆλ‹€.

library(dplyr)

president_speech %>%
  select(title, doc) %>% 
  filter(row_number() <= 2) %>%
  unnest_noun_ngrams(
    noun_bigram,
    doc,
    n = 2,
    ngram_delim = ":",
    type = "noun2"
  )
#> # A tibble: 264 Γ— 2
#>    title                              noun_bigram
#>    <chr>                              <chr>      
#>  1 "2005 ν•œμΌ μš°μ •μ˜ ν•΄ κ°œλ§‰μ‹ 좕사 " 일:μš°μ •    
#>  2 "2005 ν•œμΌ μš°μ •μ˜ ν•΄ κ°œλ§‰μ‹ 좕사 " μš°μ •:ν•΄    
#>  3 "2005 ν•œμΌ μš°μ •μ˜ ν•΄ κ°œλ§‰μ‹ 좕사 " ν•΄:κ°œλ§‰μ‹  
#>  4 "2005 ν•œμΌ μš°μ •μ˜ ν•΄ κ°œλ§‰μ‹ 좕사 " κ°œλ§‰μ‹:μΆ•ν•˜
#>  5 "2005 ν•œμΌ μš°μ •μ˜ ν•΄ κ°œλ§‰μ‹ 좕사 " μΆ•ν•˜:행사  
#>  6 "2005 ν•œμΌ μš°μ •μ˜ ν•΄ κ°œλ§‰μ‹ 좕사 " 행사:μΆ•ν•˜  
#>  7 "2005 ν•œμΌ μš°μ •μ˜ ν•΄ κ°œλ§‰μ‹ 좕사 " μΆ•ν•˜:참석  
#>  8 "2005 ν•œμΌ μš°μ •μ˜ ν•΄ κ°œλ§‰μ‹ 좕사 " 참석:μ—¬λŸ¬λΆ„
#>  9 "2005 ν•œμΌ μš°μ •μ˜ ν•΄ κ°œλ§‰μ‹ 좕사 " μ—¬λŸ¬λΆ„:λͺ¨λ‘
#> 10 "2005 ν•œμΌ μš°μ •μ˜ ν•΄ κ°œλ§‰μ‹ 좕사 " λͺ¨λ‘:ν™˜μ˜  
#> # β„Ή 254 more rows

ν…μŠ€νŠΈ 데이터 μ •μ œ

ν…μŠ€νŠΈ 데이터 μ •μ œλ₯Ό μœ„ν•œ ν…μŠ€νŠΈ 데이터 μ‘°μž‘μ€ λΉ„λ„€νŠΈμΈ Manipulate Documents에 μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

ν…μŠ€νŠΈ 데이터 μ •μ œλ₯Ό μœ„ν•œ bitNLP의 κΈ°λŠ₯

bitNLP의 ν…μŠ€νŠΈ 데이터 μ‘°μž‘ κΈ°λŠ₯을 μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • λ¬Έμ„œ λ‹¨μœ„μ˜ μ „μ²˜λ¦¬
    • λ¬Έμ„œ 필터링 (Filter Documents)
  • ν…μŠ€νŠΈ λ‹¨μœ„μ˜ μ „μ²˜λ¦¬
    • ν…μŠ€νŠΈ λŒ€μ²΄ (Replace Texts)
    • ν…μŠ€νŠΈ μ—°κ²° (Concatenate Texts)
    • ν…μŠ€νŠΈ 뢄리 (Split Texts)
    • ν…μŠ€νŠΈ 제거 (Remove Texts)

bitNLPλŠ” λŒ€μš©λŸ‰μ˜ ν…μŠ€νŠΈ λ°μ΄ν„°μ—μ„œ 상기 데이터 μ‘°μž‘μ„ μˆ˜ν–‰ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‹€μŒκ³Ό 같은 λ°©λ²•μœΌλ‘œ μž‘μ—…ν•©λ‹ˆλ‹€.

  • 병렬 처리λ₯Ό ν†΅ν•œ μ†λ„μ˜ κ°œμ„ 
  • 데이터 μ‘°μž‘ 룰을 λ“±λ‘ν•œ 메타(meta) 파일 ν™œμš©

λ³Έ μ†Œκ°œκΈ€μ—μ„œλŠ” λ¬Έμ„œ 필터링에 λŒ€ν•œ μ‚¬λ‘€λ§Œ μ†Œκ°œν•©λ‹ˆλ‹€. λ‹€λ₯Έ ν…μŠ€νŠΈ μ‘°μž‘μ€ λΉ„λ„€νŠΈλ₯Ό μ°Έκ³ ν•˜μ‹­μ‹œμš”.

filter_text()λ₯Ό μ΄μš©ν•œ λ¬Έμ„œ 필터링

bitNLP νŒ¨ν‚€μ§€λŠ” μƒ˜ν”Œ 메타 데이터 νŒŒμΌμ„ μ œκ³΅ν•˜λŠ”λ°, λ¬Έμ„œ 필터링을 μœ„ν•œ μƒ˜ν”Œ 메타 데이터 νŒŒμΌμ„ 읽어 λ΄…λ‹ˆλ‹€.

library(bitNLP)

meta_path <- system.file("meta", package = "bitNLP")
fname <- glue::glue("{meta_path}/preparation_filter.csv")

## 데이터 필터링 메타 μ‹ κ·œ 등둝
set_meta("filter", fname, fileEncoding = "utf8")

get_meta() ν•¨μˆ˜λŠ” μ„Έμ…˜ μ•ˆμ—μ„œ λ“±λ‘λœ 메타 데이터λ₯Ό μ‘°νšŒν•©λ‹ˆλ‹€.

## κΈ° λ“±λ‘λœ 데이터 필터링 메타 쑰회
get_meta("filter")
#>    rule_nm
#> 1 신문기사
#> 2 μ œν’ˆν™λ³΄
#> 3 섀문쑰사
#> 4     좜처
#> 5   이벀트
#> 6     방솑
#>                                                                                     pattern
#> 1                                   (νŒμŠ€λ„·|νŒŒμ΄λ‚Έμ…œ|μ—°ν•©|(PT)|였마이|경제)[[:space:]]*λ‰΄μŠ€
#> 2 ((μž…λ²•|μ •μΉ˜|ꡐ윑)[[:space:]]*ν”Œλž«νΌ)|λ§˜λ§ˆλ―Έμ•„[[:space:]]*가계뢀[[:print:]]*인증샷|Playtex
#> 3                                                              μ’Œλ‹΄νšŒ|ꡬ글섀문|μ±„μš©λŒ€ν–‰μ—…μ²΄
#> 4                                                    좜처[[:space:]]*:|λ¬Έμ˜μ²˜λ³΄κ±΄λ³΅μ§€μ½œμ„Όν„°
#> 5                                     (증정|기념)이벀트|ν—ˆλ‹ˆμŠ€ν¬λ¦°|이벀트λ₯Ό[[:space:]]*μ§„ν–‰
#> 6                                 μ œμž‘μ§„|κΈ°μ–΅μ €μž₯μ†Œ|μΆ”λͺ¨μΉ΄νŽ˜|λΈ”λž™ν™€|ν‘Έλ“œμŠ€νŠœλ””μ˜€|μ—°κΈˆμ •λ³΄λ„·
#>   accept  use
#> 1  FALSE TRUE
#> 2  FALSE TRUE
#> 3  FALSE TRUE
#> 4  FALSE TRUE
#> 5  FALSE TRUE
#> 6  FALSE TRUE

ν…μŠ€νŠΈ 데이터(λ¬Έμ„œλ“€) μ€‘μ—μ„œ 뢄석을 μˆ˜ν–‰ν•˜λ €λŠ” λͺ©μ κ³Ό λΆ€ν•©ν•˜μ§€ μ•Šμ€ ν…μŠ€νŠΈ(λ¬Έμ„œ)λ₯Ό μ œκ±°ν•΄μ•Όν•  κ²½μš°μ—λŠ” filter_text()λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

이미 μ•žμ—μ„œ λ¬Έμ„œ 필터링을 μœ„ν•œ 메타 데이터 νŒŒμΌμ„ μ½μ–΄λ“€μ˜€μŠ΅λ‹ˆλ‹€. 6개의 룰은 accept 값이 FALSE인 deny λ£°μž…λ‹ˆλ‹€. 즉 ν•΄λ‹Ή 검색 νŒ¨ν„΄μ„ λ§Œμ‘±ν•˜λŠ” ν…μŠ€νŠΈ 데이터λ₯Ό μ œκ±°ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

문자 λ²‘ν„°μ˜ 필터링

λ²„μ¦ˆ λ°μ΄ν„°μ˜ 본문은 길이가 1000인 문자 λ²‘ν„°μž…λ‹ˆλ‹€. 이 λ²‘ν„°λŠ” 5개의 결츑치λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

doc_content <- buzz$CONTENT
is.character(doc_content)
#> [1] TRUE
length(doc_content)
#> [1] 1000

sum(is.na(doc_content))
#> [1] 5

8개의 μ½”μ–΄λ₯Ό μ΄μš©ν•΄μ„œ 필터링을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. as_logical = FALSE을 μ§€μ •ν•˜λ©΄ 문자 λ²‘ν„°μ˜ 필터링을 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

doc_after_character <- filter_text(doc_content, as_logical = FALSE, mc.cores = 8)
#> ── rejects: 방솑 ──────────────────────────────────────────────────────── 3건 ──
#> ── rejects: 섀문쑰사 ──────────────────────────────────────────────────── 1건 ──
#> ── rejects: 신문기사 ──────────────────────────────────────────────────── 1건 ──
#> ── rejects: 이벀트 ────────────────────────────────────────────────────── 1건 ──
#> ── rejects: μ œν’ˆν™λ³΄ ──────────────────────────────────────────────────── 2건 ──
#> ── rejects: 좜처 ──────────────────────────────────────────────────────── 2건 ──
#> ── Missing Check: Removing NA ─────────────────────────────────────────── 5건 ──

length(doc_after_character)
#> [1] 985

5개의 κ²°μΈ‘μΉ˜μ™€ 6개의 λ£°μ—μ„œ 10개의 λ¬Έμ„œκ°€ μ œκ±°λ˜μ–΄μ„œ 길이가 985인 문자 벑터가 λ§Œλ“€μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.

데이터 ν”„λ ˆμž„μ˜ 필터링

tidytext νŒ¨ν‚€μ§€λ₯Ό μ΄μš©ν•΄μ„œ ν…μŠ€νŠΈ 데이터 뢄석을 μˆ˜ν–‰ν•œλ‹€λ©΄, 문자 λ²‘ν„°μ˜ 필터링이 μ•„λ‹ˆλΌ 문자 λ³€μˆ˜λ₯Ό μ΄μš©ν•œ 필터링을 μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ‹€μŒμ²˜λŸΌ as_logical 인수의 기본값인 TRUEλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 이 κ²½μš°λŠ” CONTENT λ³€μˆ˜μ˜ λͺ¨λ“  μ›μ†Œμ— λŒ€ν•΄μ„œ allow 필터링 μ—¬λΆ€λ₯Ό μ˜λ―Έν•˜λŠ” 논리 벑터λ₯Ό λ§Œλ“€μ–΄ λ°˜ν™˜ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ―€λ‘œ dplyr νŒ¨ν‚€μ§€μ˜ filter ν•¨μˆ˜μ™€ μ‚¬μš©ν•˜μ—¬ ν•„ν„°λ§ν•©λ‹ˆλ‹€.

library(dplyr)

buzz %>% 
  filter(filter_text(CONTENT, verbos = FALSE)) %>% 
  select(KEYWORD, SRC, CONTENT)
#> # A tibble: 985 Γ— 3
#>    KEYWORD SRC              CONTENT                                             
#>    <chr>   <chr>            <chr>                                               
#>  1 맞벌이  17,18λ…„ λ² μ΄λΉ„λ§˜ "μ§€κΈˆ λ‘˜μ§Έ μž„μ‹ μ€‘μΈ μ–΄λ¨Έλ‹ˆμ˜ˆμš” μ²«μ§ΈλŠ” 16λ…„ 1월생 λ‘˜μ§ΈμΆœμ‚°μ˜ˆμ •μ€ 17λ…„ 3월생 μ–΄μ©Œλ‹€ 보…
#>  2 맞벌이  20λŒ€ μˆ˜λ‹€λ°©      "저희 λΆ€λΆ€λŠ” λ§žλ²Œμ΄μΈλ°μš” λ‚¨νŽΈ νšŒμ‚¬ μ‚¬λžŒλ“€λ„ 거의 λ‹€ λ§žλ²Œμ΄μΈκ°€λ΄μš” κ·Έλž˜λ„ μ•„μΉ¨λ§ˆλ‹€ 아내뢄…
#>  3 맞벌이  20λŒ€ μˆ˜λ‹€λ°©      "μ‹ λž‘μ§€μΆœ μ œμ§€μΆœ κ΅¬λΆ„ν•΄μ„œ λ”°λ‘œμ μœΌμ‹œλ‚˜μš” μ œκ°€μ“΄λˆμ€ μ•Œμ•„λ„ μ‹ λž‘μ΄μ“΄λˆμ€ 잘λͺ°λΌ μ–΄λ–»κ²Œ 적어야…
#>  4 맞벌이  20λŒ€ μˆ˜λ‹€λ°©      "λ„ˆλ¬΄ 고민이 λ˜μ„œ ν•˜μ†Œμ—° ν• λ•Œ μ—†μ–΄μ„œ μ—¬κΈ°μ„œ ν•˜μ†Œμ—° ν•΄λ΄μš” 글이쒀 κΈΈμˆ˜κ°€ μžˆμ–΄μš” μ–‘ν•΄ 뢀탁…
#>  5 맞벌이  20λŒ€ μˆ˜λ‹€λ°©      "\"이제 벌써 결혼 1λ…„μ°¨ κ°€κΉŒμ΄ λ˜μ–΄κ°€λŠ” λ™κ°‘λ‚΄κΈ°μ‹ ν˜ΌλΆ€λΆ€μž…λ‹ˆλ‹€ ν—ˆν—ˆλ‹€λ¦„μ΄ μ•„λ‹ˆλΌ μ–Όλ§ˆμ „ …
#>  6 맞벌이  20λŒ€ μˆ˜λ‹€λ°©      "μžκ°€λŠ” μ•„λ‹ˆκ³  μ‹ λž‘ 직μž₯λ•Œλ¬Έμ— μ§‘ νŒ”κ³  μ„Έλ“€μ–΄ μ‚΄κ³  μžˆλŠ”λ°μš”1μΈ΅μ΄λΌμ„œ μ’‹μ„μ€„λ§Œ μ•Œμ•˜λŠ”λ° μœ„β€¦
#>  7 맞벌이  20λŒ€ μˆ˜λ‹€λ°©      "κ³„νšν–ˆλ˜ μž„μ‹ μ΄ μ•„λ‹ˆλΌμ„œ κΈ‰ν•˜κ²Œ 맞벌이 (주말뢀뢀)μ ‘κ³  κ΅°μΈμ‹ λž‘λ”°λΌ μ² μ›κ°€λ €κ΅¬μš” 돈 직μž₯보…
#>  8 맞벌이  20λŒ€ μˆ˜λ‹€λ°©      "λͺ»κ°€μ§€λ‹ˆκΉŒ 기뢄이 μ•ˆμ’‹μ•„μš” λ‹€λ₯Έκ²ƒλ„μ•„λ‹ˆκ³  μ—¬μœ κ°€ μ•ˆλ˜μ„œ λͺ»κ°–λŠ”λ‹€λŠ”κ²Œμ²«μ§Έλ‚³κ³ μΉœμ •λΆ€λͺ¨λ‹˜λ“€μ€ λ§žβ€¦
#>  9 맞벌이  20λŒ€ μˆ˜λ‹€λ°©      "λ‚¨νŽΈμ΄λž‘ μ €λž‘ 동갑에 λ‘˜ λ‹€ λ§žλ²Œμ΄μ—μš”. μ €λŠ” ν˜„μž¬ μž„μ‹  8μ£Όκ΅¬μš”. μ œκ°€ μš”λ¦¬λ₯Ό λ„˜λ„˜ λͺ»ν•΄β€¦
#> 10 맞벌이  20λŒ€ μˆ˜λ‹€λ°©      "μš”μ¦˜ ν‡΄κ·Όν•˜κ³  λ‚¨νŽΈμ΄ 데리러 μ˜€λŠ”λ°μš” μ‚΄λΉΌλ €κ³  ν•˜λŠ”λ° 맨날 저녁 λ¨Ήκ³  λ“€μ–΄κ°€μ„œμ μ μ°Œκ³  μžˆμŠ΅β€¦
#> # β„Ή 975 more rows

고마운 λΆ„λ“€

bitNLPλŠ” λ‹€μŒ μ˜€ν”ˆμ†ŒμŠ€ κΈ°μ—¬μžμ˜ λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ μ°Έμ‘°ν•˜μ˜€μŠ΅λ‹ˆλ‹€.:

λ„μ›€μš”μ²­

bitNLP의 λ°œμ „μ„ μœ„ν•΄μ„œ 버그에 λŒ€ν•œ λ¦¬ν¬νŒ…, κΈ°λŠ₯ κ°œμ„ μ„ μœ„ν•œ μš”κ΅¬μ‚¬ν•­λ“€μ€ 여기에에 문제λ₯Ό μ œκΈ°ν•˜κ±°λ‚˜ μš”μ²­ν•΄μ£Όμ„Έμš”. 특히 λ²„κ·ΈλŠ” μ΅œμ†Œν•œμ˜ μž¬ν˜„ κ°€λŠ₯ν•œ μ˜ˆμ œμ™€ ν•¨κ»˜ μ œμΆœλ°”λžλ‹ˆλ‹€.

κΈ°μ—¬μž 행동 κ°•λ Ή

이 ν”„λ‘œμ νŠΈλŠ” Contributor Code of Conduct(κΈ°μ—¬μž 행동 κ°•λ Ή)κ³Ό ν•¨κ»˜ λ¦΄λ¦¬μŠ€λ˜μ—ˆμŠ΅λ‹ˆλ‹€ . 이 ν”„λ‘œμ νŠΈμ— μ°Έμ—¬ν•¨μœΌλ‘œμ¨ κ·€ν•˜λŠ” ν•΄λ‹Ή 쑰건을 μ€€μˆ˜ν•˜λŠ” 데 λ™μ˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

About

Tools that support "Natural Language Processing" for Korean text analytics.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published