slide-image

 

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