저는 대학원에서 nlp관련 연구를 하고 있는데, 문서를 가지고 하는 작업 중 전처리보다 먼저 하는 작업이 python에 문서를 로드하는 일입니다. 항상 할 때마다 "python에 txt문서 입력하기"를 검색하는데요. 저랑 비슷한 분들은 보시고 도움이 되셨으면 해서 적어봅니다.
with open("파일주소", "rt", encoding='UTF8') as file:
text=file.read()
이렇게 입력하게 되면 txt 파일을 줄 바꿈 없이 한 줄로 읽어 들인다는 뜻입니다. 위의 코드처럼 된다면 text(변수명)에 한 줄로 텍스트 파일이 할당됩니다. text변수를 콘솔에 출력해보면,
이런 모습으로 출력이 되는데요, 문장별로 나누기 전에 거슬리는 부분이 있습니다. \n 모양이 엄청나게 많이 있다는 걸 금방 알 수 있습니다. txt문서의 줄 바꿈이 있는 부분이 이렇게 읽어 들여지는 겁니다. 그래서 어찌 없애는 게 좋을까 와 문장별로 나누는 방법을 고민했습니다. 문장 별로 나누는 이유는 제가 연구할 때 필요하기 때문입니다.
with open("파일위치", "rt", encoding='UTF8') as file:
text=file.read().replace('\n',' ')
이렇게 코드를 작성하면 \n 지울 수 있으나...
이렇게 되면 두 칸 이상의 뛰어쓰기의 공백이 생깁니다.
a라는 txt 파일이 있습니다. 글을보면 첫 문장은 글이 끝나는 부분이 아닌데 줄 바꿈이 있고, 둘 번째 문단 첫 번째 줄은 문장이 끝나서 줄 바꿈이 있습니다. 그리고 문단이 바뀌면서 한 줄의 공백이 있습니다. 파일을 가장 처음의 방법으로 로드하면,
이와 같이 입력이 됩니다. 결과가 역시 문장 중간과 문장 끝에 \n이 들어가있는 모습을 볼 수 있습니다. 따라서 replace를 이용하면,
\n 없이 로드 할 수 있지만, 두 칸의 띄어쓰기가 생깁니다. 그래서 저는...
with open("파일위치", "rt", encoding='UTF8') as file:
text=file.read().replace('\n',' ').replace(' ',' ')
변수에 한번더 작업을 해줬습니다.
이제 깔끔하게 로드되어 있는 글을 문장별로 나누기만 하면 되는데요. 문장으로 나누는 작업은 nltk package를 이용해서 쉽게 할 수 있습니다.
with open("C:/Users/mgp/Downloads/a.txt", "rt", encoding='UTF8') as file:
text=file.read().replace('\n',' ').replace(' ',' ')
import nltk
text=[text for text in nltk.sent_tokenize(text)]
이렇게 되면 읽어 들인 txt문서는 문장별로 구분돼서 다시 text라는 변수에 할당됩니다. 하지만 아직은 문장을 구분하는 기술이 완벽하지 않아서 " "가 있는 부분에서 오류를 보이는데요. text 변수를 출력해서 보면,
" "가 있는 문장을 중심으로 앞에있는 문장은 " " 하나의 문장으로, 뒷 문장은 다른 문장으로 분류된 것으로 볼 수 있습니다. 아마도 마침표를 중심으로 문장을 나누기 때문에 이와 같은 결과가 나왔다고 생각됩니다. nltk 패키지를 사용하지 않고 split 함수를 사용해도 같은 결과를 보이기 때문에 유추할 수 있습니다.
with open("파일위치", "rt", encoding='UTF8') as file:
text=file.read().replace('\n',' ').replace(' ',' ')
text=text.split('.')
nltk 패키지와 같은 모습으로 출력되는 것을 볼 수 있습니다. 하지만 저는 이것에 만족하지 못하고, " "가 있는 문장을 중심으로 앞뒤의 문장도 각 각 하나의 문장으로 출력되기 원하기 때문에 다른 방법을 찾았습니다.
with open("C:/Users/mgp/Downloads/a.txt", "rt", encoding='UTF8') as file:
text=file.read().replace('\n',' ').replace(' ',' ')
text=text.split('"')
import nltk
text=[nltk.sent_tokenize(text) for text in text]
위 코드와 같이 하면... list가 중첩되는 상황이 벌어지게 됩니다. 한번만 출력하고 사용할 것이 아니라면 문제가 없겠지만, 앞으로 할 전처리를 생각하면... 중첩은 해결하는 문제입니다. list를 flatten 시켜줄 겁니다.
두 가지 방법으로 중법의 문제를 해결할 건데요, 하나는 패키지를 이용하는 방법이고 하나는 python comprehension을 사용할 겁니다. 둘 중에 편한 방법을 사용하시면 됩니다.
with open("파일위치", "rt", encoding='UTF8') as file:
text=file.read().replace('\n',' ').replace(' ',' ')
text=text.split('"')
import nltk
text=[nltk.sent_tokenize(text) for text in text]
#패키지 이용 방법
import itertools
text=list(itertools.chain.from_iterable(text))
#comprehension 이용
text=[element for array in text for element in array]
위의 과정을 거치면 말끔하게 문장 단위로 나눠서 출력되는 결과를 확인 할 수 있습니다. 그리고 list flatten에 관한 자료는
https://programmers.co.kr/learn/courses/4008/lessons/12738
파이썬을 파이썬답게 - 2차원 리스트를 1차원 리스트로 만들기 - from_iterable
본 강의는 파이썬 문법을 이미 알고 있는 분들을 대상으로 만들어졌습니다. ##### 이런 분들께 추천합니다 * 파이썬 문법을 알고 계시는 분 * 알고리즘 문제를 조금 더 쉽게 풀고 싶은 분 * Python 코
programmers.co.kr
에서 참고 했습니다.
'대학원일기' 카테고리의 다른 글
분류성능평가지표 (0) | 2021.03.12 |
---|---|
논문정리_Frequent item set mining(Christian Borgelt∗) (0) | 2020.07.03 |