이론적으로 먼저 들어간 후 개발을 하고 싶었다.....
하지만 기초가 잘 써져있다고 인터넷에서 추천하는 사이트들(하기 사이트)조차 공부할 수 있는 적성이라고는 정말 0.1 도 되지 않은게 아닐까란 생각이 들정도로 볼때마다 분노폭발 (ㄴㅁ아ㅓㄻㄴ어래ㅑㄷ즐) 상태로 접하기 시작했다.
1) http://cs.kangwon.ac.kr/~leeck/NLP/
2) http://www.korean.go.kr/nkview/nklife/2017_4/27_0404.pdf
걍 언어로 접근하자...!!
라는 판단이 들었고, 접근방법을 바꿨다.
텍스트 마이닝 혹은 자연어 처리쪽은 대체 언어를 뭐부터 사용해야할까 고민이 있었다.
Python이냐, Java냐.... 그것이 문제로다.
Web 쪽으로 경력이 시작하다보니 Java 가 친숙하다보니 Python 으로 굳이 시작해야할 이유가 없다고도 느껴졌지만 검색했을때 참고될 자료 및 각종 라이브러리가 눈에 선하자, 잠시 머리 속의 Java 스위치를 꺼두어야 하나..... 싶기도 했다.
물론 Deeplearning4j (https://deeplearning4j.org/) 도 있고, 어찌어찌 자바로도 할수 있지 않을까 판단은 들었지만, '이걸 또 뭐 고민해' 라는 생각이 들었고, 잘 모르겠으면 '일단 하기나 해' 라는 생각에 파이썬부터 시작해보았다.
"처음 코딩을 배울때 이해 안 가면 그냥 받아 들여" 하고 지나갔던 부분이 많아 이번에는 기능 하나 만들때마다 조금 세세하게 풀어서 적는 방식으로 하려고 한다.
우선 최근에 Data 를 만지다보니 csv (comma seprated values) 혹은 tsv (tab seprated values) 파일등을 만질 일이 잦은 것 같아 파일 읽기부터 해보려한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | """ CSV 파일 줄 단위 읽기 """ input_file_name = "data.csv" lines = [] with open(input_file_name, "r", encoding="utf-8-sig") as input_file: for line in input_file: line = line.strip() lines.append(line) print("이 파일 {} 의 총 줄수는? {}".format(input_file_name, len(lines))) | cs |
아주아주~~ 간단한 예제부터 하나 가지고 와서 작성하였다. 위의 코드에서 파이썬은 자바처럼 int, string 같은 형을 선언해줄 필요없다는 장점이 있었으나, 지옥의 띄어쓰기 에러때문에 초반엔 애먹었었다.
[설명]
5번째 라인에서 파일 csv 를 읽기 위해 파일 패스를 넣은 부분이다.
6번째 라인은 자바에서는 배열을 생각하는데 파이썬은 리스트 (6번째 라인은 빈 리스트) 로 사용된다.
* 참고
파이썬의 리스트는 길이가 동적으로 변할 수 있고, 타입도 동적으로 변할수 있다. lines = [] 위 부분도 정확하게는 선언은 아니고, 할당이라고 한다. 또한 비워져있는 리스트는 lines = list() 로도 생성할 수 있다. |
8번째 라인부터 이해가 안가서 몸져누웠던 부분이기도 한데, 실은 굉장히 심플하다.
보통 파이썬의 파일 읽기는
open("파일위치", 'w') 문법 이후 write 작성한 후 close 를 사용하는 형태인데
그 부분을 한번에 해결해주기 위해 나온 것이
with open 문법이다. (python 2.5 부터 지원)
with open("파일위치", "w") as f: f.write("open 문법은 설명 안 해주냐?") """ open(파일이름, 파일 열기 모드) r : 읽기 모드 - 읽기만 할 때 사용 w : 쓰기 모드 - 파일에 내용을 쓸때 사용 a : 추가모드 - 파일의 마지막에 새로운 내용을 추가할때 사용 read, write, append 겠지? """ | cs |
9번째 라인에서 만나는 for 문은 반가웠었다.
for line in input_file: line = line.strip() lines.append(line) """ for 변수 in 리스트 (또는 튜플, 문자열): 수행 문장1 수행 문장2 """ # 주석은 샾 혹은 """ 내용 """ 를 사용한다. # lstrip()은 문자열에서 왼쪽 공백을 모두 삭제 # rstrip()은 문자열에서 오른쪽 공백을 모두 삭제 # strip()은 양쪽 공백을 모두 삭제. Java 에서는 trim() 과 같다. | cs |
Shell 에서 사용하는 for 문이나 혹은 Java 의 확장 포문(물론 : 이지만...) 과 비슷한 방법이라 이해하기 어렵지는 않았다. input_file 파일 내용을 line 에 담아 반복하는 부분이다.
10번째 라인은 line 변수의 strip 을 사용하는 부분인데 위의 코드에 나와있는 대로 양쪽 공백을 제거하는 부분이다.
11번째 라인은 6 번째 라인에 할당한 리스트 lines 에 line 의 내용을 추가하는 부분이다.
대망의 13번째 라인은 파일을 읽고 리스트에 담은 내용을 출력한다.
print 조차 그냥 넘어가지 않겠다는 마음으로 추가 기재!
# 1) 일반적인 print 사용법 a = 123 print(a) # >>> 123 # 2) 쌍따옴표(")는 문자열 더하기와 같다. print("삶은" "너무나" "고달프다") # >>> 삶은 너무나 고달프다 # 3) 띄어쓰기는 콤마(,)를 사용 print("하늘에서", "음식이", "떨어졌으면", "좋겠다") # >>> 하늘에서 음식이 떨어졌으면 좋겠다. # 4) format() 의 사용 print("사자는 {} 을 뜯지 않는 {} 이지".format('풀', '법')) # >>> 사자는 풀을 뜯지 않는 법이지 | cs |
2. Python 파일 읽기 (전체)
1 2 3 4 5 6 7 8 9 10 11 12 | input_file_name = "data.csv" lines = [] """ with open(input_file_name, "r", encoding="utf-8-sig") as input_file: text = input_file.read() lines = text.split("\n") """ with open(input_file_name, "r", encoding="utf-8-sig") as input_file: text = input_file.read() lines = text.split("\n") print("이 파일 {} 의 총 줄수는? {}".format(input_file_name, len(lines))) | cs |
1번 코드의 경우 파일을 읽어 줄(line) 단위로 리스트에 담는 방법을 취했다.
위의 2번 코드는 text 에 파일을 모두 담아 split 하는 방안으로 구분자 기준으로 잘라서 리스트에 담는 방법이다.
split() 메소드에 대한 설명을 또 하자면.... 다음과 같다.
# split() 에 아무것도 적지 않으면 공백(스페이스, 탭, 엔터등)을 기준으로 문자열을 자른다. text = "어흥 곶감 하나 주면 안 잡아먹지" text.split() # >>> '어흥', '곶감', '하나', '주면' '안', '잡아먹지' # split(',') 에 특정 값이 들어가면 해당 값 기준으로 문자열을 자른다. (예시는 콤마(,)) text = "어흥, 곶감 하나 주면, 안 잡아먹지" text.split(',') # >>> '어흥', '곶감 하나 주면', '안 잡아먹지' | cs |
input_file_name = "data.csv" lines = [] with open(input_file_name, "r", encoding="utf-8-sig") as input_file: text = input_file.read() # lines = text.split("\n") 줄바꿈 문자열 자르기와 다음 메소드와 같다. lines = text.splitlines() print("이 파일 {} 의 총 줄수는? {}".format(input_file_name, len(lines))) | cs |
1) 파일읽기 - open, with open
2) 리스트 할당 - lines = []'NLP & Python' 카테고리의 다른 글
What is NLP? (0) | 2018.10.11 |
---|