텍스트마이닝

의미망 분석 #1 동시 출현 단어 분석

yul_S2 2022. 12. 25. 17:31
반응형

의미망 분석  3.6 VERSION

 

(1) 동시 출현 단어 분석(Co-occurrence analysis) 

단어 간의 관계를 살펴보는 분석 방법

'손-장갑', '머리-모자' 처럼 관계가 있는 단어 파악

단어의 관계를 표현한 의미망(semantic network) 만드는데 활용

 

# 1 기본적인 전처리

 

news_comment_parasite.csv
1.19MB

 

 

 

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

 

 

 

반응형