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

2020. 5. 10. 00:44nlp

반응형

세종 구어 말뭉치를 이용해서 성별에 따른 종결어미 사용을 비교해보려 한다.

처음보는 tei 파일이라 당황했지만 파이썬의 BeautifulSoup으로 쉽게 처리할 수 있다. html이랑 똑같은 듯

 

우선 감을 잡기 위해 파일 한 개만 잡고 분석해보면 

 

from bs4 import BeautifulSoup
tei_doc = '5CT_0013.txt'
with open(tei_doc, 'r', encoding='utf-8') as tei:
    soup = BeautifulSoup(tei, 'lxml')

 

이제 soup 뒤에 태그만 붙여주면 원하는 정보를 얻을 수 있다.

 

# 해당 파일의 제목
soup.title.get_text()

# 첫번째 사람이 말한 내용 
soup.find_all('u', who="P1")

# 모든 대화 참가자
soup.find_all('person')

# 대화 상황 
soup.find('settingdesc').get_text()

# 직업만 뽑아내기
str(soup.find_all('person')[0]).split('>')[1].split('<')[0]

 

다른 건 get_text() 하면 다 잘 되는데 직업만 잘 안 됐다. 그래서 태그 구분 표시 기준으로 잘라내는 방법으로 텍스트만 추출했다.

 

이제 모든 tei 파일을 csv 파일로 변환하기 

원하는 정보(원본 파일 이름, 발화자, 성별, 직업, 대화 상황, 발화 내용)들만 칼럼으로 만들어서 수집

 

def tei2csv(tei_doc):
    # 원본 파일 이름, 발화자, 성별, 직업, 대화상황, 발화 내용 
    df = pd.DataFrame(columns=['filename', 'speaker', 'gender', 'job','setting','speech'])
    
    with open(tei_doc, 'r', encoding='utf-8') as tei:
        soup = BeautifulSoup(tei, 'lxml')
 
    # 발화자 몇 명인지
    count = len(soup.find_all('person'))
 
    # 발화자 명수만큼 반복
    for i in range(count):
    
        filename = tei_doc
            
        setting = soup.find('settingdesc').get_text()
    
        speaker = "P"+str(i+1)
    
        if 'sex="F"' in str(soup.find_all('person')[i]):
            gender = 'F'
        else:
            gender = 'M'
    
        job = str(soup.find_all('person')[i]).split('>')[1].split('<')[0]
        
        speech = soup.find_all('u', who=speaker)
    
        df.loc[count] = [filename, speaker, gender, job,setting, speech]
        count +=1
        
    return df

 

현재 디렉토리에 있는 모든 tie 포맷 파일들을 이 함수에 인풋으로 넣어주면 된다.

 

# 현재 디렉토리에 있는 모든 tei 파일을 dataframe으로
from os import listdir
df = pd.DataFrame()

for filename in listdir('.'):
    if filename.endswith('.txt'):
        df = pd.concat([df, tei2csv(filename)])

 

맨날 어떻게 하는지 까먹는 dataframe을 csv로 저장하기

 

df.to_csv('spoken.csv', index=False, encoding='utf-8')

 

반응형