본문 바로가기
R

[R.아르] TDM에서 tokenize 가 동작하지 않을 때 (형태소 분석)

by LightBlogger 2017. 10. 19.

지난 번 2017/10/18 - [R] - [R.아르] Term Document Matrix 생성시 한글 인코딩이 깨질때 포스트에서 눈치채신 분도 있겠지만


TermDocumentMatrix 를 만들 때 웬일인지 tokenize 가 제대로 동작하지 않는 것으로 보인다.


예로, sapply 를 통해 텍스트에 extractNoun함수를 적용시키면


> text <- readLines("text.txt", encoding="UTF-8") 
> text
[1] "컴퓨터는 수치 연산을 위해 설계되었다. 컴퓨터 발명 초기에는 문자를 표현해야 하는 요구가 없었다."                    
[2] "그러나 곧 문자를 표현해야 하는 요구가 발생했다. 이기종 컴퓨터끼리 문자 데이터를 교환하기 위해서는 표준이 필요하다."
> x <- sapply(text, extractNoun, USE.NAMES=F)
> x
[[1]]
 [1] "컴퓨터는" "수치"     "연산"     "설계"     ""       "컴퓨터"   "발명"     ""       "문자"     "표현"     "요구"    

[[2]]
 [1] "문자"   "표현"   "요구"   "발생"   "이기종" "컴퓨터" "문자"   "데이터" "교환"   "하기"   "표준"   "필요"  

> 


위와 같이 잘 나뉘어지지만,


TermDocumentMatrix에 tokenize 옵션으로 적용하면


> text <- readLines("text.txt", encoding="UTF-8") 
> text
[1] "컴퓨터는 수치 연산을 위해 설계되었다. 컴퓨터 발명 초기에는 문자를 표현해야 하는 요구가 없었다."                    
[2] "그러나 곧 문자를 표현해야 하는 요구가 발생했다. 이기종 컴퓨터끼리 문자 데이터를 교환하기 위해서는 표준이 필요하다."
> text <- Corpus(VectorSource(text)) 
> inspect(text)
<<SimpleCorpus>>
Metadata:  corpus specific: 1, document level (indexed): 0
Content:  documents: 2

[1] 컴퓨터는 수치 연산을 위해 설계되었다. 컴퓨터 발명 초기에는 문자를 표현해야 하는 요구가 없었다.                    
[2] 그러나 곧 문자를 표현해야 하는 요구가 발생했다. 이기종 컴퓨터끼리 문자 데이터를 교환하기 위해서는 표준이 필요하다.
> tdm <- TermDocumentMatrix(text, control=list(tokenize=extractNoun))
> Encoding(tdm$dimnames$Terms) = 'UTF-8'
> as.matrix(tdm)
            Docs
Terms        1 2
  문자를     1 1
  발명       1 0
  설계되었다 1 0
  수치       1 0
  없었다     1 0
  연산을     1 0
  요구가     1 1


'문자를' '설계되었다' '없었다' 등의 단어가 등장한다.


사실상 형태소 분석을 통해 나뉘지 않고 그냥 어절 단위로만 나뉜 것으로 보인다. tokenize 가 작동하지 않고 있다는 얘기.



원인은 몰라도 분석은 계속되어야 하는 법, 직접 자른 후 paste() 함수를 통해 붙여 주자. 


이때 [collapse=] 옵션이 사용된다.


(참고: 2016/09/22 - [R] - [R. 아르] 내용 합치기 paste())


x <- sapply(text, extractNoun, USE.NAMES=F)

x <- sapply(x, paste, collapse = " ")


> text <- readLines("text.txt", encoding="UTF-8")
> text
[1] "컴퓨터는 수치 연산을 위해 설계되었다. 컴퓨터 발명 초기에는 문자를 표현해야 하는 요구가 없었다."                    
[2] "그러나 곧 문자를 표현해야 하는 요구가 발생했다. 이기종 컴퓨터끼리 문자 데이터를 교환하기 위해서는 표준이 필요하다."
> x <- sapply(text, extractNoun, USE.NAMES=F)
> x
[[1]]
 [1] "컴퓨터는" "수치"     "연산"     "설계"     ""       "컴퓨터"   "발명"     ""       "문자"     "표현"     "요구"    

[[2]]
 [1] "문자"   "표현"   "요구"   "발생"   "이기종" "컴퓨터" "문자"   "데이터" "교환"   "하기"   "표준"   "필요"  

> x <- sapply(x, paste, collapse = " ")
> x
[1] "컴퓨터는 수치 연산 설계 되 컴퓨터 발명 초 문자 표현 요구"          "문자 표현 요구 발생 이기종 컴퓨터 문자 데이터 교환 하기 표준 필요"
> 


이렇게 먼저 형태소 분석을 통해 자른 뒤 Corpus 와 TermDocumentMatrix 생성을 진행하면 되겠다.



반응형

댓글