세종 말뭉치를 활용하는 프로그램을 짜고 있는데, 초반에 split() 함수로 스트링을 분리했다가 한참이 지나서야 오류가 있다는 것을 알게 됐다.
일단 세종 말뭉치는 예를 들어 -
집은 창작의 원천이라는 그는 옷 못지않게 공간이 주는 미학을 중요시해 왔다.
집/NNG + 은/JX + 창작/NNG + 의/JKG + 원천/NNG + 이/VCP + 라는/ETM ...
처럼 문장을 형태소 단위로 분석해서 해당 형태소의 품사를 붙여 놓은 텍스트 데이터라고 할 수 있는데,
형태소와 품사를 분리하기 위해서 split()를 썼었다.
word = '가을/NNG' morpheme_and_tag = word.split('/') print(morpheme_and_tag) # 실행 결과 ['가을', 'NNG']
문제는 형태소-태그 쌍 중에 '//SP'가 있다는 것, '//SP'는 '/'가 SP(쉼표, 가운뎃점, 콜론, 빗금 중 하나)라는 뜻이다.
여기에 split('/')를 적용하면?
str1 = "//SF" result = str1.split('/') print(result) # 실행 결과: ['', '', 'SF']
결과에서 볼 수 있듯이 /이 손실되어 버리는데다 리스트의 길이도 2가 아닌 3이 된다.
그러면 해결책은? rsplit() 함수!
split()는 앞에서부터 delimiter(여기선 '/')를 기준으로 스트링을 나누는 반면, rsplit()는 뒤에서부터 스트링을 나눈다. 그러면 rsplit를 사용하면 결과가 제대로 나올까?
str1 = "//SF" result = str1.rsplit('/') print(result) # 실행 결과: ['', '', 'SF']
똑같다. delimiter 외에도 두 번째 파라미터로 최대 분할 횟수를 입력하지 않았기 때문이다.
즉, '//SF'를 '/' 기준으로 한번 나누면 ['/', 'SF']가 되고, 이를 다시 한번 나누면 ['', '', 'SF']가 된다. 그러면 최대 분할 횟수로 1을 입력하면 된다.
str1 = "//SF" result = str1.rsplit('/', 1) print(result) # 실행 결과: ['/', 'SF']
깔끔하게 성공!
'컴퓨터 > Python' 카테고리의 다른 글
TypeError: 'type' object does not support item assignment (0) | 2019.11.03 |
---|