morphology.Rmd
bitNLP
는 은전한닢 형태소분석기를 이용하여 형태소 분석을
수행합니다. 이미 사용자는 형태소 분석기를 설치하였거나,
install_mecab()
함수를 이용해서 형태소 분석기를 설치한 것을
전제로 합니다.
새종 품사와 은전한닢 형태소분석기인 mecab-ko의 품사 태그는 다음과 같습니다.
실질의미유뮤 | 대분류(5언+기타) | 태그 | 설명 | 태그 | 설명 |
---|---|---|---|---|---|
실질형태소 | 체언 | NNG | 일반 명사 | NNG | 일반 명사 |
실질형태소 | 체언 | NNP | 고유 명사 | NNP | 고유 명사 |
실질형태소 | 체언 | NNB | 의존 명사 | NNB | 의존 명사 |
실질형태소 | 체언 | NNB | 의존 명사 | NNBC | 단위를 나타내는 명사 |
실질형태소 | 체언 | NR | 수사 | NR | 수사 |
실질형태소 | 체언 | NP | 대명사 | NP | 대명사 |
실질형태소 | 용언 | VV | 동사 | VV | 동사 |
실질형태소 | 용언 | VA | 형용사 | VA | 형용사 |
실질형태소 | 용언 | VX | 보조 용언 | VX | 보조 용언 |
실질형태소 | 용언 | VCP | 긍정 지정사 | VCP | 긍정 지정사 |
실질형태소 | 용언 | VCN | 부정 지정사 | VCN | 부정 지정사 |
실질형태소 | 수식언 | MM | 관형사 | MM | 관형사 |
실질형태소 | 수식언 | MAG | 일반 부사 | MAG | 일반 부사 |
실질형태소 | 수식언 | MAJ | 접속 부사 | MAJ | 접속 부사 |
실질형태소 | 독립언 | IC | 감탄사 | IC | 감탄사 |
형식형태소 | 관계언 | JKS | 주격 조사 | JKS | 주격 조사 |
형식형태소 | 관계언 | JKC | 보격 조사 | JKC | 보격 조사 |
형식형태소 | 관계언 | JKG | 관형격 조사 | JKG | 관형격 조사 |
형식형태소 | 관계언 | JKO | 목적격 조사 | JKO | 목적격 조사 |
형식형태소 | 관계언 | JKB | 부사격 조사 | JKB | 부사격 조사 |
형식형태소 | 관계언 | JKV | 호격 조사 | JKV | 호격 조사 |
형식형태소 | 관계언 | JKQ | 인용격 조사 | JKQ | 인용격 조사 |
형식형태소 | 관계언 | JX | 보조사 | JX | 보조사 |
형식형태소 | 관계언 | JC | 접속 조사 | JC | 접속 조사 |
형식형태소 | 선어말어미 | EP | 선어말 어미 | EP | 선어말 어미 |
형식형태소 | 어말어미 | EF | 종결 어미 | EF | 종결 어미 |
형식형태소 | 어말어미 | EC | 연결 어미 | EC | 연결 어미 |
형식형태소 | 어말어미 | ETN | 명사형 전성 어미 | ETN | 명사형 전성 어미 |
형식형태소 | 어말어미 | ETM | 관형형 전성 어미 | ETM | 관형형 전성 어미 |
형식형태소 | 접두사 | XPN | 체언 접두사 | XPN | 체언 접두사 |
형식형태소 | 접미사 | XSN | 명사 파생 접미사 | XSN | 명사 파생 접미사 |
형식형태소 | 접미사 | XSV | 동사 파생 접미사 | XSV | 동사 파생 접미사 |
형식형태소 | 접미사 | XSA | 형용사 파생 접미사 | XSA | 형용사 파생 접미사 |
어근 | XR | 어근 | XR | 어근 | |
부호 | SF | 마침표, 물음표, 느낌표 | SF | 마침표, 물음표, 느낌표 | |
부호 | SE | 줄임표 | SE | 줄임표 | |
부호 | SS | 따옴표,괄호표,줄표 | SSO | 여는 괄호 (, [ ] | |
부호 | SP | 쉼표,가운뎃점,콜론,빗금 | SP | 쉼표,가운뎃점,콜론,빗금 | |
부호 | SO | 붙임표(물결,숨김,빠짐) | SY | ||
부호 | SW | 기타기호 (논리수학기호,화폐기호) | SY | ||
한글 이외 | SL | 외국어 | SL | 외국어 | |
한글 이외 | SH | 한자 | SH | 한자 | |
한글 이외 | SN | 숫자 | SN | 숫자 |
morpho_mecab()
함수가
은전한닢 형태소분석기
를 인터페이스합니다.
library(bitNLP)
args(morpho_mecab)
function (x, type = c("noun", "noun2", "verb", "adj", "morpheme"),
indiv = TRUE, user_dic = NULL, as_list = FALSE)
NULL
morpho_mecab()
함수의 인수는 다음과 같습니다.
문서에 품사를 태깅하기 위해서는 type
인수에 “morpheme”를
지정하고, morpho_mecab()
를 호출합니다. 이 함수는 문서를
품사 단위로 토큰화합니다. 이때, 결과는 문자 벡터를 반환하며, 품사의
벡터의 이름으로 태깅됩니다. 다음 예에서 “님”은 일반명사인 “NNG”로
태그되었습니다.
굳이 소제목을 광의의 품사 기반의 토큰화
가 아닌 협의의
품사 태깅
이라 표현한 것은 모든 품사를 토큰화하였기
때문입니다.
morpho_mecab("님은 갔습니다. 아아, 사랑하는 나의 님은 갔습니다.", type = "morpheme")
+EP EF SF IC SC NNG
NNG JX VV"님" "은" "갔" "습니다" "." "아아" "," "사랑"
+EP EF
XSV ETM NP JKG NNG JX VV"하" "는" "나" "의" "님" "은" "갔" "습니다"
SF "."
만약에 형태소 분석에 사용할 문서가 2개 이상일 경우에는 개별 문서를 리스트의 성분으로 반환합니다.
<- c("님은 갔습니다. 아아, 사랑하는 나의 님은 갔습니다.",
docs "푸른 산빛을 깨치고 단풍나무 숲을 향하여 난 작은 길을 걸어서, 차마 떨치고 갔습니다.")
morpho_mecab(docs, type = "morpheme")
1]]
[[+EP EF SF IC SC NNG
NNG JX VV"님" "은" "갔" "습니다" "." "아아" "," "사랑"
+EP EF
XSV ETM NP JKG NNG JX VV"하" "는" "나" "의" "님" "은" "갔" "습니다"
SF "."
2]]
[[+ETM NNG NNG JKO VV EC NNG
VA"푸른" "산" "빛" "을" "깨치" "고" "단풍나무"
+JX VA ETM
NNG JKO VV EC NP"숲" "을" "향하" "여" "난" "작" "은"
+EC SC MAG VV EC
NNG JKO VV"길" "을" "걸어서" "," "차마" "떨치" "고"
+EP EF SF
VV"갔" "습니다" "."
그런데 여러 개의 문서를 개별로 처리하지 않고, 하나의 문서처럼 묶어
처리할 수 도 있습니다. 다음처럼 indiv
인수값에 FALSE를
지정하면 됩니다.
morpho_mecab(docs, indiv = FALSE, type = "morpheme")
+EP EF SF IC SC
NNG JX VV"님" "은" "갔" "습니다" "." "아아" ","
NNG XSV ETM NP JKG NNG JX "사랑" "하" "는" "나" "의" "님" "은"
+EP EF SF VA+ETM NNG NNG JKO
VV"갔" "습니다" "." "푸른" "산" "빛" "을"
VV EC NNG NNG JKO VV EC "깨치" "고" "단풍나무" "숲" "을" "향하" "여"
+JX VA ETM NNG JKO VV+EC SC
NP"난" "작" "은" "길" "을" "걸어서" ","
+EP EF SF
MAG VV EC VV"차마" "떨치" "고" "갔" "습니다" "."
텍스트 분석에서 명사만 추출하여 문서의 맥락을 이해하는 방법이
일반적입니다. 그래서 morpho_mecab()
함수의
type
인수의 기본값이 “noun”입니다.
명사만 토큰화해 봅니다.
morpho_mecab(docs, indiv = FALSE)
NNG NNG NNG NNG NNG NNG NNG "님" "사랑" "님" "산" "빛" "단풍나무" "숲"
NNG "길"
인수값 “noun”는 일반명사만 추출합니다. 만약에 좀 더 많은 종류의 명사를 추출하기 위해서는 “noun2”를 사용합니다.
“noun2”는 태그가 “N”으로 시작하는 체언을 추출합니다.
morpho_mecab(docs, indiv = FALSE, type = "noun2")
NNG NNG NP NNG NNG NNG NNG "님" "사랑" "나" "님" "산" "빛" "단풍나무"
+JX NNG
NNG NP"숲" "난" "길"
동사를 추출하기 위해서는 type
인수에 `“verb”를
사용합니다.
morpho_mecab(docs, indiv = FALSE, type = "verb")
+EP VV+EP VV VV VV+EC VV VV+EP
VV"갔" "갔" "깨치" "향하" "걸어서" "떨치" "갔"
명사를 추출하여 워드클라우드를 그려봅니다. bitNLP에 수록된 대통령
연설문 데이터셋인 president_speech
에서 임의의 연설문
100개에서 일반명사를 추출 후 워드클라우드를 그려 봅니다.
library(dplyr)
president_speech$doc[1:100] %>%
morpho_mecab(indiv = FALSE) %>%
table() %>%
wordcloud2::wordcloud2(fontFamily = "NanumSquare")
보통 상위 랭크의 도수(Frequency)를 갖는 명사 토큰은 문서의 맥락을 파악하는 데 불필요한 토큰입니다. 마치 상투어 같은 역할만 합니다. 그래서 경우에 따라서 이를 제거하는 것도 유용할 수 있습니다.
상위 10위 도숫를 갖는 명사 토큰을 제거 후 워드클라우드를 그려 봅니다.
president_speech$doc[1:100] %>%
morpho_mecab(indiv = FALSE) %>%
table() %>%
sort(decreasing = TRUE) %>%
.[-c(1:10)] %>%
wordcloud2::wordcloud2(fontFamily = "NanumSquare")
형태소 분석기의 사전은 우리가 이야기하고, 글로 적는 모든 사례의 언어를 포함하지 못합니다. 일종의 샘플링 데이터입니다. 그러므로 품사 태깅의 오류가 반드시 따라오게 됩니다. 특히 과학, 예술, 의료 등과 같은 전문 영역에서는 그 빈도가 높아집니다. 이 경우에는 오분류하는 품사를 보정하기 위해서 시스템 사전을 개선하던가 사용자 사전을 추가하게 됩니다.
다음 문서의 일반명사 추출 결과를 보면 성능이 썩 좋지 않습니다. 많은 복합명사가 쪼개졌습니다.
<- "신혼부부나 주말부부는 놀이공원 자유이용권을 즐겨 구매합니다."
str morpho_mecab(str)
NNG NNG NNG NNG NNG NNG NNG NNG NNG "신혼" "부부" "주말" "부부" "놀이" "공원" "자유" "이용" "구매"
bitNLP 패키지에 포함된 샘플 사용자 정의 사전을 적용하기 위해서
user_dic
인수를 사용하였습니다. 결과를 보면 사용자 정의
사전을 사용하지 않았던 결과의 오류가 개선되었습니다.
<- system.file("dic", package = "bitNLP")
dic_path <- glue::glue("{dic_path}/buzz_dic.dic")
dic_file
morpho_mecab(str, user_dic = dic_file)
NNG NNG NNG NNG NNG NNG "신혼부부" "주말부부" "놀이" "공원" "자유이용권" "구매"