세종구어코퍼스에서 종결어미/선어말어미만 추출하기

2020. 5. 10. 00:55nlp

반응형

세종구어코퍼스를 csv 파일로 변환한 후, https://codlingual.tistory.com/100

 

세종 구어 말뭉치(tei 포맷) csv로 변환하기

세종 구어 말뭉치를 이용해서 성별에 따른 종결어미 사용을 비교해보려 한다. 처음보는 tei 파일이라 당황했지만 파이썬의 BeautifulSoup으로 쉽게 처리할 수 있다. html이랑 똑같은 듯 우선 감을 잡��

codlingual.tistory.com

 

각 발화내용에서 내가 궁금했던 종결어미랑 선어말어미만 뽑아낸다.

저번에 넷플릭스 vs 네이버 시놉시스 비교에서 한 일이랑 비슷해서 코드를 재활용했다. https://codlingual.tistory.com/23?category=732088

 

넷플릭스/네이버 시놉시스 품사 분석하기

넷플릭스와 네이버에서 203개 드라마, 932개 영화에 대한 시놉시스를 크롤링했다. 이제 각 시놉시스에 특정 품사가 얼마나 많이 쓰였는지 알아보려고 한다. PCA 분석도 하려면 다음과 같은 형식의

codlingual.tistory.com

 

그땐 각 시놉시스에 사용된 품사 빈도를 dataframe으로 만들었고 

이젠 각 발화에 사용된 종결어미/선어말어미의 빈도를 dataframe으로 만들 예정 

 

 

샘플로 첫 번째 행의 발화만 분석해봤다.

's' 태그 기준으로 한 문장이니 's'의 개수(=문장 개수)를 세고, 그 문장 개수 만큼 for 문을 돌린다.

한 문장에서 EF가 발견되면 (pattern이 [+한글/EF+] 에 해당하는 정규표현식) ef_list에 추가한다.

 

import re
from collections import Counter

# 한 사람의 발화에서 종결어미(EF) 모두 찾아내고 개수 세기 
num = len(BeautifulSoup(df.iloc[0,5]).find_all('s'))
pattern = '\+[가-힣]*?\/EF\+'
ef_list = []
for i in range(num):
    string = str(BeautifulSoup(df.iloc[0,5]).find_all('s')[i])
    match = re.search(pattern, string)
    if match:
        ef_list.append(match.group().replace('+', ''))
    else:
        continue

 

이 ef_list를 Counter에 넣고 요리조리...해서 예쁘게 dataframe으로 만들어주려면

 

# 한 사람의 발화에 사용된 모든 종결어미와 그 빈도
pd.DataFrame.from_dict(dict(Counter(ef_list)), orient='index').transpose()

 

 

이렇게 만들어진다. 생각보다 종결어미 종류가 엄청 많다. 분석이 잘못된 것도 있겠지만 

 

이제 이 작업을 함수로 만들어서 모든 행에 적용해주기~~

 

def ef_df_gen(speech):
    num = len(BeautifulSoup(speech).find_all('s'))
    pattern = '\+[가-힣]*?\/EF\+'
    ef_list = []
    for i in range(num):
        string = str(BeautifulSoup(speech).find_all('s')[i])
        match = re.search(pattern, string)
        if match:
            ef_list.append(match.group().replace('+', ''))
        else:
            continue
    return pd.DataFrame.from_dict(dict(Counter(ef_list)), orient='index').transpose()

 

apply를 쓰고 싶었는데 이렇게나 많은 칼럼이 나오는 걸 apply로 쓸 수 있는지 모르겠어서 걍 원시적인 for문을 돌린다..엄청 오래 걸린다.

 

# 전체 코퍼스에 종결어미 빈도 함수 적용하기 
ef_df = pd.DataFrame()
for i in range(len(df['speech'])):
    ef = ef_df_gen(df.speech[i])
    ef_df = pd.concat([ef_df, ef], axis=0, ignore_index=True)
    ef_df = ef_df.fillna(0)

 

어떤 발화엔 쓰였지만 또 다른 발화에선 쓰이지 않은 종결어미는 0으로 채워넣기

 

같은 방식으로 선어말어미(EP)도 해주면 된다 

 

선어말어미, 종결어미 데이터와 기존의 발화자에 대한 정보(성별, 직업 등)를 합쳐준다.

 

# 기존 csv 파일과 종결어미, 선어말 어미 데이터 합치기 
spoken_full = pd.concat([df,ef_df, ep_df], axis=1)

 

반응형