Morphological Analysis : Korean

Text Mining

Morphological Analysis For Korean in Text Mining

Yeongeun Jeon
05-17-2021
pacman::p_load("KoNLP", "tm", "stringr")

# useSystemDic() # 시스템 사전 설정
# useSejongDic() # 세종 사전 설정useNIADic() # NIADic 사전 설정 (추천)
Backup was just finished!
983012 words dictionary was built.
mytext <- c("동해 물과 백두산이 마르고 닳도록, 하느님이 보우하사 우리나라 만세. "만세. ",
             "남산 위에 저 소나무, 철갑을 두른 듯, 바람 서리 불변함은 우리 기상일세."리 기상일세.",
             "가을 하늘 공활한데 높고 구름 없이, 밝은 달은 우리 가슴 일편단심일세.".",
             "이 기상과 이 맘으로 충성을 다하여, 괴로우나 즐거우나 나라 사랑하세.")")

corpus <- VCorpus(VectorSource(mytext))     # VectorSource : vector를 document로 해석mytext <- corpus[[4]]$content
mytext
[1] "이 기상과 이 맘으로 충성을 다하여, 괴로우나 즐거우나 나라 사랑하세."

품사구분

패키지 “KoNLP”에는 품사를 9개와 22개로 구분할 수 있는 함수가 있다. 각각 구분되는 품사는 아래의 사진과 같다.

품사구분 9개

SimplePos09()
mypaper4.pos09 <- SimplePos09(mytext)
mypaper4.pos09
$이
[1] "이/M"

$기상과
[1] "기상/N+과/J"

$이
[1] "이/M"

$맘으로
[1] "말/P+ㅁ/E+으로/J"

$충성을
[1] "충성/N+을/J"

$`다하여,`
[1] "다하/P+어/E+,/S"

$괴로우나
[1] "괴롭/P+으나/E"

$즐거우나
[1] "즐겁/P+으나/E"

$나라
[1] "나/N+이/J+라/E"

$사랑하세
[1] "사랑하세/N"

$.
[1] "./S"

품사구분 22개

SimplePos22()
mypaper4.pos22 <- SimplePos22(mytext)
mypaper4.pos22
$이
[1] "이/MM"

$기상과
[1] "기상/NC+과/JC"

$이
[1] "이/MM"

$맘으로
[1] "말/PX+ㅁ/ET+으로/JC"

$충성을
[1] "충성/NC+을/JC"

$`다하여,`
[1] "다하/PV+어/EF+,/SP"

$괴로우나
[1] "괴롭/PA+으나/EC"

$즐거우나
[1] "즐겁/PA+으나/EC"

$나라
[1] "나/NP+이/JP+라/EF"

$사랑하세
[1] "사랑하세/NC"

$.
[1] "./SF"

4번째 Corpus에서 보통명사(NC)만 추출

mypaper4.pos22.pos <- c()
mytextlength <- length(mypaper4.pos22)
for (i in 1:mytextlength) {
  mylocation <- str_locate_all(mypaper4.pos22[i], pattern ='/NC')                   # "/NC"의 위치 (품사구분을 하면 "단어/품사(대문자)"의 형태로 되어있음)NAmypaper4.pos22.st <- str_sub(mypaper4.pos22[i], 1, mylocation[[1]][,"start"]-1)   # 처음부터 "/NC" 바로 앞까지의 모든 표현식 추출NAmypaper4.pos22.pp <- str_replace_all(mypaper4.pos22.st,
                                           "[[:graph:]]{1,}/[[:upper:]]{1,}[[:graph:]]{1}","")     # "문자/품사(대문자)+" 로 되어있는 표현식 없애기 (NC로 추출된 명사만 남기위해서=> 한번에 2개의 NC가 있을 수 있기 때문에)
  mypaper4.pos22.pos[i] <- list(mypaper4.pos22.pp)
  }

mypaper4.pos22.pos
[[1]]
character(0)

[[2]]
[1] "기상"

[[3]]
character(0)

[[4]]
character(0)

[[5]]
[1] "충성"

[[6]]
character(0)

[[7]]
character(0)

[[8]]
character(0)

[[9]]
character(0)

[[10]]
[1] "사랑하세"

[[11]]
character(0)
mypaper4.pos22.pos <- unlist(mypaper4.pos22.pos)
mypaper4.pos22.pos <- mypaper4.pos22.pos[!is.na(mypaper4.pos22.pos)]             # NA가 아닌 경우만 추출
mypaper4.pos22.pos
[1] "기상"     "충성"     "사랑하세"

전체 Corpus에서 원하는 품사만 추출

# 품사를 추출하는 함수NAmy.pos.func <- function(mytext, pos) {
  
      myobject <- SimplePos22(mytext)
  new.myobject <- c()
  mytextlength <- length(myobject)
  
    for (i in 1:mytextlength) {
      mylocation <- str_locate_all(myobject[i], pattern =paste("/", pos, sep=""))            # "/pos"의 위치 (품사구분을 하면 "단어/품사(대문자)"의 형태로 되어있음)NAmyobject.pos22.st <- str_sub(myobject[i], 1, mylocation[[1]][,"start"]-1)              # 처음부터 "/pos" 바로 앞까지의 모든 표현식 추출NAmyobject.pos22.pp <- str_replace_all(myobject.pos22.st,
                                            "[[:graph:]]{1,}/[[:upper:]]{1,}[[:graph:]]{1}","")     # "문자/품사(대문자)+" 로 되어있는 표현식 없애기 (한번에 2개 이상의 pos가 있을 수 있기 때문에)      new.myobject[i]   <- list(myobject.pos22.pp)
    }
  new.myobject <- unlist(new.myobject)
  new.myobject <- new.myobject[!is.na(new.myobject)]
  new.myobject
}  


sum(table(my.pos.func(corpus[[4]]$content, "NC")))
[1] 3
sum(table(my.pos.func(corpus[[4]]$content, "PA|PV")))
[1] 3
size.noun <- rep(NA,length(corpus))
for (j in 1:length(corpus)){
  size.noun[j] <- sum(table(my.pos.func(corpus[[j]]$content, "NC")))   
}

size.noun  # 각 corpus에 대한 보통명사(NC) 갯수갯수
[1] 6 7 5 3
#최고빈도의, 최저빈도의 보통명사 등장수를 갖는 corpusNAsize.noun <- data.frame(1:length(corpus),size.noun)
colnames(size.noun) <- c('abstract.no','no.noun')
size.noun[order(size.noun$no.noun),][c(1,length(corpus)),]
  abstract.no no.noun
4           4       3
2           2       7

Reuse

Text and figures are licensed under Creative Commons Attribution CC BY 4.0. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".