59doit
의미망 분석 #1 동시 출현 단어 분석 본문
의미망 분석 3.6 VERSION
(1) 동시 출현 단어 분석(Co-occurrence analysis)
단어 간의 관계를 살펴보는 분석 방법
'손-장갑', '머리-모자' 처럼 관계가 있는 단어 파악
단어의 관계를 표현한 의미망(semantic network) 만드는데 활용
# 1 기본적인 전처리
1-1 기사 댓글 불러오기
library(readr) raw_news_comment <- read_csv("C:/news_comment_parasite.csv") |
1-2 전처리
library(dplyr) library(stringr) library(textclean) news_comment <- raw_news_comment %>% select(reply) %>% mutate(reply = str_replace_all(reply, "[^가-힣]", " "), reply = str_squish(reply), id = row_number()) |
# 2 토큰화 하기
단어가 사용된 맥락을 살펴봐야 하므로 명사, 형용사, 동사 함께 추출
2-1 형태소 분석기를 이용해 품사 기준으로 토큰화하기
SimplePos22() : 문장의 단어를 22개의 품사로 구분
library(tidytext) library(KoNLP) comment_pos <- news_comment %>% unnest_tokens(input = reply, output = word, token = SimplePos22, drop = F) comment_pos comment_pos %>% select(reply,word) # id 제거 하고 가져오기 ![]() |
★ 알고가기
정규표현식
문자 | 의미 | 문자 | 의미 |
\ | 특수문자 예외 처리(escape) | * | 0번 이상 |
^ | 문자열 시작 | + | 1번 이상 |
$ | 문자열 끝 | [] | 클래스 |
. | 임의의 문자 하나 | () | 서브 패턴 |
| | OR 연산 | {} | 수량자 |
? | 0번 또는 1번 | [^] | 부정(Not) |
2-1-(1) 품사 분리하여 행 구성하기
원하는 품사를 추출하기 쉽도록 한 행을 한 품사로 구성하기
tidyr::separate_rows() :
정규 표현식에 따라 텍스트를 여러 행으로 나누기
sep = "[+]" : "+"가 등장할 때마다 행을 나눔
품사별로 행 분리
comment_pos <- comment_pos %>% separate_rows(word, sep = "[+]") comment_pos comment_pos %>% select(word, reply) ![]() |
2-1-(2) 품사 추출하기
(ㄱ) 명사 추출하기
"/n"이 붙어있는 단어 추출
태그 제거: '/로 시작하는 모든 문자' 제거
noun <- comment_pos %>% filter(str_detect(word,"/n")) %>% mutate(word = str_remove(word,"/.*$")) noun %>% select(word, reply) ![]() |
str_remove(word,"/.*$") : /로 시작하는 모든 문자' 제거
(ㄴ) 명사 빈도 구하기
noun %>% count(word, sort = T) # A tibble: 8,042 x 2 # word n # <chr> <int> # 1 영화 463 # 2 기생충 445 # 3 봉준호 373 # 4 것 353 # 5 아카데미 252 # 6 축하 243 # 7 나 230 # 8 대한민국 226 # 9 자랑 222 # 10 작품상 218 # # ... with 8,032 more rows |
2-1-(3) 동사, 형용사 추출하기
동사 "/pv" , 형용사: "/pa" 붙어있는 단어 추출
단어 뒤에 태그 대신 '다'를 붙여 이해하기 편하게 수정하기
ex) "받" → "받다", "멋지" → "멋지다"
pvpa <- comment_pos %>% filter(str_detect(word, "/pv|/pa")) %>% mutate(word=str_replace(word, "/.*$","다")) pvpa %>% select(word, reply) ![]() |
filter(str_detect(word, "/pv|/pa")) : "/pv", "/pa" 추출 : 동사 "/pv" , 형용사: "/pa"
- str_replace(word, "/.*$","다") : "/"로 시작 문자를 "다"로 바꾸기
2-1-(4) 추출한 데이터 결합하기
추출한 단어 결합하기
이해할 수 있는 두 글자 이상 단어만 남기기
(ㄱ) 품사결합하기
comment <- bind_rows(noun, pvpa) %>% filter(str_count(word) >= 2) %>% arrange(id) comment %>% select(word, reply) ![]() |
- arrange : 디폴트 : 오름차순
- str_count(word) >= 2 : 두글자 이상만 남기기 (두번 x)
2-1-(5)단어 동시 출현 빈도 구하기
widyr::pairwise_count()
item : 단어
feature : 텍스트 구분 기준
sort = T : 빈도가 높은 순으로 출력 결과 정렬
pair <- comment %>% pairwise_count(item = word, feature = id, sort = T) pair # # A tibble: 245,664 x 3 # item1 item2 n # <chr> <chr> <dbl> # 1 영화 기생충 111 # 2 기생충 영화 111 # 3 감독 봉준호 86 # 4 봉준호 감독 86 # 5 감독님 봉준호 66 # 6 봉준호 감독님 66 # 7 만들다 영화 57 # 8 영화 만들다 57 # 9 기생충 봉준호 54 # 10 블랙리스트 감독 54 # # ... with 245,654 more rows |
- 한 단어를 기준으로 함께 사용된 모든 단어의 빈도를 구함
- 순서를 바꿔가며 같은 빈도를 지니는 두 개의 행으로 구성됨
2-1-(6) 특정 단어와 자주 함께 사용된 단어 살펴보기
pair %>% filter(item1=="영화") # # A tibble: 2,314 x 3 # item1 item2 n # <chr> <chr> <dbl> # 1 영화 기생충 111 # 2 영화 만들다 57 # 3 영화 봉준호 52 # 4 영화 받다 48 # 5 영화 한국 46 # 6 영화 아카데미 42 # 7 영화 같다 41 # 8 영화 감독 39 # 9 영화 아니다 38 # 10 영화 좋다 35 # # ... with 2,304 more rows |
pair %>% filter(item1=="봉준호") # # A tibble: 1,578 x 3 # item1 item2 n # <chr> <chr> <dbl> # 1 봉준호 감독 86 # 2 봉준호 감독님 66 # 3 봉준호 기생충 54 # 4 봉준호 영화 52 # 5 봉준호 블랙리스트 48 # 6 봉준호 대한민국 38 # 7 봉준호 자랑 33 # 8 봉준호 축하드리다 30 # 9 봉준호 송강호 30 # 10 봉준호 축하 27 # # ... with 1,568 more rows |
'텍스트마이닝' 카테고리의 다른 글
의미망 분석 #3 동시 출현 네트워크 (2) (0) | 2022.12.26 |
---|---|
의미망 분석 #2 동시 출현 네트워크 (1) (0) | 2022.12.25 |
토픽 모델링 #5 최적의 토픽 수 (0) | 2022.12.21 |
토픽 모델링 #4 토픽 이름 짓기 (0) | 2022.12.21 |
토픽 모델링 #3 토픽분류 (0) | 2022.12.20 |