NLTK
# 01
NLTK 카테고리에서는 기계학습과 인공지능 강의에서 들었던 내용을 정리해볼까 한다.
일단은 파이썬 기초와 nltk 코퍼스에 관한 내용을 정리해야 한다.
일반적으로 프로그래밍 언어를 분류할 때 이렇게 분류한다.
python의 장점은 procedural적으로도 쓰일 수 있고, Functional적으로도 쓰일 수 있는 등 분류가 되지 않는다는 점이다.
파이썬에서 디렉토리 내 파일을 읽어올 때는,
import os
path='경로'
for file in os.listdir(path):
print(path+file)
f=open(path+file, "r", encoding='utf-8')
fileString=f.read()
print(fileString[:500]+"\n")
f.close()
이런 식으로 읽는다. 중요한 건 for 문에서 in 뒤에 꼭 리스트가 아니어도 메소드가 올 수 있다는 점이다.
<String>
확장하려면 +'!!!' 로 하면 된다.
.file('문자') .index('문자') : 거의 비슷한데, 없을 때 Error을 raise하는지, -1을 리턴하는지만 다르다.
.split('구분자')
.lower()
.upper()
'연결자'.join(문자열로 이루어진 리스트) : 리스트를 스트링으로 바꿀 때 사용된다.
.count('문자')
.startswith('문자') : 문자로 시작되면 True
.endswith('문자')
.isalpha() : 문장 부호를 제외할 때 쓰인다.
.isalnum()
.istitle()
<List>
확장하려면+['!!!']으로 하면 된다. 대괄호로 표시.
.append(원소) : extend와 다름. 뒤에 추가하는 것임.
.extend([원소들]) : list와 list을 합치는 것.
.insert(인덱스, 원소)
.remove(원소)
.index(원소)
.count(원소)
.reverse()
<Tuple>
myTuple=('33','8')일 때, myTuple[0]=8임
확장하려면 myTuple+('aa', )으로 하면 된다.
<Dictionary>
인덱스로 접근하는 대신 키로 접근하는 것. 중괄호로 표시. {'키':'값', '키':'값'}
생성하려면 {'키':'값', '키':'값'}이렇게 하거나, dic(키='값', 키='값')이렇게 하면 됨. 대부분 첫 번째 방법으로 생성.
<List와 Dictionary 상호변경>
List=[('A', 'Abstract'), ('B', 'Book')] #List['A']='Abstract'
dic=dict(List) #dic={'A':'Abstract', 'B':'Book'}
print(list(dic)) #['A', 'B'], 키만 리스트로 들어감.
<String와 List 상호변경>
String='abcde'
List=[x for x in String] #List=['a', 'b', 'c', 'd', 'e']
print(''.join(List)) #'abcde'
<empty>
0, 0.0, [], {}, ''은 모두 empty(False)임.
<String 역순 출력>
String 뒤에 [::-1]을 하면 역순으로 출력됨.
<for 문 in 뒤에 나올 수 있는 것들>
L이 list라면, L, sorted(L), set(L), reversed(L) 모두 올 수 있음.
String, Generator, List, File 모두 올 수 있다.
<리스트에 있는 숫자를 모두 더하는 재귀함수>
def listnum(x): #x는 리스트
if(not x): #x에 아무것도 없다면
return 0
else:
return x[0]+listnum(x[1:])
인덴스가 안맞는데, 티스토리 코드블럭 기능 이상하네?
<reverse함수 구현>
def reverse(x): #x는 스트링
if(not x):
return ''
else:
return (reverse(x[1:])+x[0])
def reverse(String):
list=[x for x in String]
result=[]
for i in range(len(List)):
result.append(List[len(List)-i-1])
return ''.join(result)
음 일단 구현 방법은 뒤에 하나씩 붙여넣는 방식으로 한다. 위에가 functional하게 구현한 것이고, 밑에가 imperative하게 구현한 것이다.
<Higher-order-Function, 고차원함수>
map : 각각 적용
filter : 조건을 줌
reduce : 일단 몰라도 됨...
map(lambda w:w[-1], myList) : myList에 있는 원소를 하나씩 빼서 w[-1]을 반환한다.
(lambda x: x**2)(3) : 3이 반환
filter(lambda x: len(x)>4, myList)
<List Comprehension, 고차원함수 표기법을 쉽게>
형태 : [f(w) for w in V if p(w)] : V안의 원소 w를 p(w)를 만족할 때, f(w)의 형태로 반환한다.
x=[n*n for n in numbers if n%2==1] : number 중에서 홀수만을 list로 반환
<Iterators>
return 대신 yield를 하면 next()전에는 결과를 계산하지 않는다(lazy evaluation과 비슷). yield를 하면 제너레이터를 만들어 요청이 들어오면 그 때 그 때 값을 생성하여 반환하므로 한번에 한개 값만 순환이 가능함
<General Expression>
List Comprehension의 [] 대신에 () 을 넣음. Lazy Evaluation을 적용하여 빠르다. 대신에 그 때 그 때 값을 반환하므로, 인덱스로 접근할 수 없다. next로 꺼내거나 for x in Generator : print x를 하거나, sorted(w for w in set(text))처럼 리스트로 만들어야 한다.
'etc > NLTK' 카테고리의 다른 글
[ANN] #01 (0) | 2019.05.05 |
---|---|
[NLTK] #03 (0) | 2019.05.04 |
[NLTK] #02 (0) | 2019.04.09 |